在Python中使用谷歌Cloud Speech API將語音轉換爲文字(另外一種方案)

在以前發佈的使用谷歌Cloud Speech API將語音轉換爲文字一文中,咱們實現了在控制檯使用curl發送post請求,獲得語音轉文字的結果;而在Python中使用谷歌Cloud Speech API將語音轉換爲文字一文中,咱們實現了安裝Cloud Speech API客戶端庫,經過調用庫函數獲得語音轉文字的結果。python

若是你嘗試過這兩種方法,就會發現其實後者獲得結果須要的時間要長一些(筆者使用這兩種方法獲得結果的耗時分別大約是5秒、7秒)。那麼,有沒有辦法在python中像第一種方法那樣,使用curl命令發送post請求呢。固然是可行的,因此今天咱們將介紹在Python中使用Cloud Speech API將語音轉換爲文字的另外一種方案,另外此次咱們將把音頻文件編碼爲base64嵌入到json請求文件中,省去了上傳聲音文件到Cloud Storage的步驟。json


相關說明之類的在上面兩篇文章裏已經寫了不少,這邊就直接貼代碼。
*使用python3segmentfault

import json
import urllib.request
import base64

# ①
api_url = "https://speech.googleapis.com/v1beta1/speech:syncrecognize?key=你的API密鑰"
audio_file = open('/home/pi/chat/test-speech/output.wav', 'rb')
audio_b64 = base64.b64encode(audio_file.read())
audio_b64str = audio_b64.decode()    # ②
# print(type(audio_b64))
# print(type(audio_b64str))
audio_file.close()

# ③
voice = {
  "config":
  {
    #"encoding": "WAV",
    "languageCode": "cmn-Hans-CN"
  },

  "audio":
  {
    "content": audio_b64str
  }
}
# 將字典格式的voice編碼爲utf8
voice = json.dumps(voice).encode('utf8')

req = urllib.request.Request(api_url, data=voice, headers={'content-type': 'application/json'})
response = urllib.request.urlopen(req)
response_str = response.read().decode('utf8')
# ④
# print(response_str)
response_dic = json.loads(response_str)
transcript = response_dic['results'][0]['alternatives'][0]['transcript']
confidence = response_dic['results'][0]['alternatives'][0]['confidence']
print(transcript)
print(confidence)

幾點說明:api

註釋:請求API的連接,請替換你的API密鑰 。若是你有疑問,或許能夠參考 建立API密鑰 | 使用谷歌Cloud Speech API將語音轉換爲文字
audio_file 路徑替換爲你的本地聲音文件路徑。app

註釋:此次上傳音頻的方式是,將聲音文件編碼爲base64,把對應的整個字符串放進json請求中。若是你執行 print(type(audio_b64)) 就會發現編碼後的audio_b64是 bytes 類型,因此還須要作一次decode(),轉成字符串。curl

註釋:先以字典格式保存json請求內容,表明聲音文件的字符串就在這裏放入。ide

註釋:API返回的結果保存在 response_str ,若是你直接運行 print(response_str) 就會發現這個字符串能夠看作一個有不少「層」的字典,要提取出識別結果,須要搞清楚這個字典究竟是怎麼組成的:函數

1層:花括號{}說明字符串 response_str 在執行 json.loads 後變成一個"字典"。獲得"字典" response_dicpost

2層:字典中只有一組鍵-值, response_dic['results'] 取出惟一的鍵"results"對應的值。觀察這個值,發現中括號[],說明這個值的類型是」列表「。google

3層:觀察列表 response_dic['results'] ,發現列表中只有一項數據,但這項數據又是"字典"類型。將其取出,獲得"字典" response_dic['results'][0]

4層:字典中又是隻有一組鍵-值, response_dic['results'][0]['alternatives'] 取出惟一的鍵"alternatives"對應的值。觀察這個值,[]說明咱們獲得的結果又是一個"列表"。

5層:觀察列表 response_dic['results'][0]['alternatives'] ,列表中只有一項數據, response_dic['results'][0]['alternatives'][0] 再將這惟一一項數據取出,發現獲得的是一個"字典",而此次獲得的字典中有兩組鍵-值,分別取出就是咱們要的結果和置信度了。

transcript = response_dic['results'][0]['alternatives'][0]['transcript']
confidence = response_dic['results'][0]['alternatives'][0]['confidence']

小結:

今天介紹的這種方案,獲取結果須要的時間比用API客戶端庫要快一些,另外應用了把本地語音編碼後放入json請求的方式,也能方便後期和錄音程序結合在一塊兒使用。但稍有一點缺點是API密鑰直接暴露在代碼中,對實際應用可能會有一些影響。

下一步的目標是和錄音功能結合起來,實現自動識別當前錄製的語音。

感謝你閱讀文章!

相關文章
相關標籤/搜索