### RasperryPi IOT系統簡章:非同步語音助理實現及其功能
#### 功能概述
1. **環境噪聲調整**:在聽取語音前,自動調整麥克風的輸入水平以適應環境噪聲。
2. **非同步聽取**:異步監聽用戶的語音,允許執行其他任務而不中斷主程序。
3. **語音識別**:將收集到的語音數據發送到 Google 的語音識別服務進行處理,並獲得文本輸出。
#### 主要組件與程式碼說明
1. **VoiceAssistant 類**:
- 負責初始化語音識別器和麥克風,並執行語音輸入和識別過程。
```python
import asyncio
import speech_recognition as sr
import sys
class VoiceAssistant:
def __init__(self):
self.text = ""
async def voiceInput(self):
recognizer = sr.Recognizer()
microphone = sr.Microphone()
with microphone as source:
recognizer.adjust_for_ambient_noise(source) # 自动调整环境噪音
print("请准备开始说话...")
# 异步监听语音
audio_future = asyncio.get_event_loop().run_in_executor(
None,
lambda: recognizer.listen(source, phrase_time_limit=6)
)
```
2. **聲音捕捉與處理**:
- 使用異步方式監聽語音並設置倒計時。
- 獲取音頻數據並發送至 Google 語音識別服務。
```python
# 录音倒计时,倒计时期间保持监听
for remaining in range(5, 0, -1):
sys.stdout.write(f"\r录音中... (剩余 {remaining}s) ")
sys.stdout.flush()
await asyncio.sleep(1)
audio = await audio_future # 获取到的是真正的audio对象
# 异步识别
result_future = asyncio.get_event_loop().run_in_executor(
None,
lambda: recognizer.recognize_google(audio, language="zh-TW")
)
self.text = await result_future
print(f"\n识别结果: {self.text}")
```
3. **錯誤處理**:
- 處理各種可能的異常,如聽取超時、無法識別語音、請求錯誤等。
```python
except sr.WaitTimeoutError:
print("\r监听超时,请再试一次。 ")
except sr.UnknownValueError:
print("\r无法识别您的语音。 ")
except sr.RequestError as e:
print(f"\r请求出错; {e}")
except Exception as e:
print(f"\r错误:{e}")
```
#### 使用指南
1. **環境配置**:確保安裝了 `speech_recognition` 和 `asyncio` 函式庫。
2. **執行程序**:啟動語音助理並進行語音輸入,查看識別結果。
這個語音助理系統適合用於需要語音交互功能的應用,如智能家居控制、客戶服務自動化等場景。
#### 原代碼
```python
import asyncio
import speech_recognition as sr
import sys
class VoiceAssistant:
def __init__(self):
self.text = ""
async def voiceInput(self):
recognizer = sr.Recognizer()
microphone = sr.Microphone()
with microphone as source:
recognizer.adjust_for_ambient_noise(source) # 自动调整环境噪音
print("请准备开始说话...")
try:
# 开始异步监听
audio_future = asyncio.get_event_loop().run_in_executor(
None,
lambda: recognizer.listen(source, phrase_time_limit=6)
)
# 录音倒计时,倒计时期间保持监听
for remaining in range(5, 0, -1):
sys.stdout.write(f"\r录音中... (剩余 {remaining}s) ")
sys.stdout.flush()
await asyncio.sleep(1)
# 等待异步监听结果
audio = await audio_future # 此处获取到的是真正的audio对象
# 开始异步识别
result_future = asyncio.get_event_loop().run_in_executor(
None,
lambda: recognizer.recognize_google(audio, language="zh-TW") # 此处传递audio对象
)
self.text = await result_future
print(f"\n识别结果: {self.text}")
except sr.WaitTimeoutError:
print("\r监听超时,请再试一次。 ")
except sr.UnknownValueError:
print("\r无法识别您的语音。 ")
except sr.RequestError as e:
print(f"\r请求出错; {e}")
except Exception as e:
print(f"\r错误:{e}")
async def main():
va = VoiceAssistant()
await va.voiceInput()
if __name__ == "__main__":
asyncio.run(main())
```