### 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()) ```