---
# System prepended metadata

title: RasperryPi IOT系統簡章：非同步語音助理實現及其功能

---

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

```