跳至主要内容

語音轉文字 - 樹莓派

在這部分課程中,你將編寫代碼,使用語音服務將捕獲的音頻中的語音轉換為文字。

將音頻發送到語音服務

可以使用 REST API 將音頻發送到語音服務。要使用語音服務,首先需要請求訪問令牌,然後使用該令牌訪問 REST API。這些訪問令牌在 10 分鐘後過期,因此你的代碼應該定期請求它們,以確保它們始終是最新的。

任務 - 獲取訪問令牌

  1. 在你的樹莓派上打開 smart-timer 項目。

  2. 刪除 play_audio 函數。由於你不希望智能計時器重複你所說的內容,因此不再需要此功能。

  3. app.py 文件的頂部添加以下導入:

    import requests
  4. while True 循環上方添加以下代碼,以聲明語音服務的一些設置:

    speech_api_key = '<key>'
    location = '<location>'
    language = '<language>'

    <key> 替換為你的語音服務資源的 API 密鑰。將 <location> 替換為你創建語音服務資源時使用的位置。

    <language> 替換為你將使用的語言的區域名稱,例如英語的 en-GB,或粵語的 zn-HK。你可以在 Microsoft 文檔上的語言和語音支持文檔 中找到支持的語言及其區域名稱列表。

  5. 在此下方,添加以下函數以獲取訪問令牌:

    def get_access_token():
    headers = {
    'Ocp-Apim-Subscription-Key': speech_api_key
    }

    token_endpoint = f'https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken'
    response = requests.post(token_endpoint, headers=headers)
    return str(response.text)

    這會調用一個令牌發行端點,將 API 密鑰作為標頭傳遞。此調用返回一個訪問令牌,可用於調用語音服務。

  6. 在此下方,聲明一個函數,使用 REST API 將捕獲的音頻中的語音轉換為文字:

    def convert_speech_to_text(buffer):
  7. 在此函數內,設置 REST API URL 和標頭:

    url = f'https://{location}.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1'

    headers = {
    'Authorization': 'Bearer ' + get_access_token(),
    'Content-Type': f'audio/wav; codecs=audio/pcm; samplerate={rate}',
    'Accept': 'application/json;text/xml'
    }

    params = {
    'language': language
    }

    這會使用語音服務資源的位置構建一個 URL。然後,它使用 get_access_token 函數中的訪問令牌填充標頭,以及用於捕獲音頻的採樣率。最後,它定義了一些參數,這些參數將與包含音頻語言的 URL 一起傳遞。

  8. 在此下方,添加以下代碼以調用 REST API 並返回文本:

    response = requests.post(url, headers=headers, params=params, data=buffer)
    response_json = response.json()

    if response_json['RecognitionStatus'] == 'Success':
    return response_json['DisplayText']
    else:
    return ''

    這會調用 URL 並解碼響應中返回的 JSON 值。響應中的 RecognitionStatus 值指示調用是否能夠成功將語音提取為文本,如果是 Success,則從函數返回文本,否則返回空字符串。

  9. while True: 循環上方,定義一個函數來處理從語音轉文字服務返回的文本。此函數現在只會將文本打印到控制台。

    def process_text(text):
    print(text)
  10. 最後,在 while True 循環中將 play_audio 的調用替換為 convert_speech_to_text 函數的調用,並將文本傳遞給 process_text 函數:

    text = convert_speech_to_text(buffer)
    process_text(text)
  11. 運行代碼。按下按鈕並對著麥克風說話。完成後鬆開按鈕,音頻將被轉換為文本並打印到控制台。

    pi@raspberrypi:~/smart-timer $ python3 app.py 
    Hello world.
    Welcome to IoT 01 for Beginners.

    嘗試不同類型的句子,以及單詞發音相同但含義不同的句子。例如,如果你說英語,說 'I want to buy two bananas and an apple too',並注意它將根據單詞的上下文使用正確的 to、two 和 too,而不僅僅是它的發音。

💁 你可以在 code-speech-to-text/pi 文件夾中找到此代碼。

😀 你的語音轉文字程序成功了!