Google Speech API

這陣子因為工作需求開始研究對聲音檔進行語音辨識的可行方案,第一個想到的便是 Google 的 Speech API。不過時至目前為止 Google 似乎還沒有打算將 Speech API 作為正式的產品發佈,不僅沒有任何官方文件說明其規格與操作方式,取得 API 存取權的方式也頗為迂迴。此外 Speech API 的存取也有不少限制,例如每日的請求次數為 50 次,以及聲音檔的長度限制大約在 10 秒左右。這使得目前的 Speech API 比較像是供開發者預覽用途,而不太適合實務應用。

 

在使用 Speech API 之前,必須先到 Google 開發者控制台(Google Developers Console)建立專案,接著建立一組 API 金鑰,金鑰的類型選擇伺服器(Server key)並且不指定 IP。完成後在 API 列表中可以看到許多可選擇啟用的 API,但是當中並沒有 Speech API。那麼該如何啟用 Speech API 呢?這就是迂迴的地方了(或者可以說有點詭異):加入 Chromium 開發者群組(Chromium-dev),加入後 API 列表就會出現 Speech API 可選擇。

 

Speech API 第二版的網址為 https://www.google.com/speech-api/v2/recognize,送出請求時除了要上傳聲音檔外,還有兩個參數是必要的,分別是 lang(語言)和 key(金鑰)。另外還有一些非必要的選擇性參數,例如 maxresults(最大回傳數量),Speech API 可能會回傳多個辨識結果,若 maxresults=1 就表示僅回傳第一個辨識結果。

 

聲音檔的部份支援 WAV(PCM 編碼)和 FLAC 兩種格式,並且必須是單聲道。上傳時還必須指定與聲音檔相符的取樣率(sample rate),否則會影響到辨識結果。在 Google Speech API v2 這個頁面裡有幾個範例聲音檔可以取用,撰寫程式碼時可以用這些聲音檔的回傳結果來確認自己的操作是否正確。

 

如果想要從影片檔中擷取聲音讓 Speech API 進行辨識,則可以使用 FFmpeg 來轉檔。以下的指令是藉由 FFmpeg 將特定影片檔(test.mp4)的頭十秒聲音轉存成符合規格的 WAV 檔(test.wav):

  • ffmpeg -i test.mp4 -vn -ac 1 -ar 16000 -c:a pcm_s16le -ss 00:00:00 -t 00:00:10 test.wav

 

以下則是 DR 用 Python 寫成、在幾輪嘗試後精簡出的範例程式碼(speech_to_text.py),其中 KEY 的部份自然是要替換成有效的金鑰:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib2
import json

KEY = "YOUR API KEY"
URL = "https://www.google.com/speech-api/v2/recognize?lang=en-US&key=%s" % KEY

def speech_to_text(filename):
    audio = open(filename, "rb").read()
    content_type = "audio/x-flac; rate=44100;"
    if filename.lower().endswith(".wav"):
        content_type = "audio/l16; rate=16000;"
    header = {"Content-Type": content_type}

    request = urllib2.Request(URL, data=audio, headers=header)
    response = urllib2.urlopen(request)
    data = response.read()

    if data.split("\n") >= 2:
        if data.split("\n")[1].strip() != "":
            parser = json.loads(data.split("\n")[1])
            for text in parser["result"][0]["alternative"]:
                print text["transcript"]
                if text.get("confidence"):
                    print text["confidence"]
        else:
            print "No data."
    else:
        print "No response."

if __name__ == "__main__":
    if len(sys.argv) >= 2:
        speech_to_text(sys.argv[1])
    

 

Linux 環境下的執行方式如下:

  • chmod +x speech_to_text.py
  • ./speech_to_text.py test.wav

 

執行後 test.wav 就會送到 Speech API 並輸出所辨識的文字。

 

分類: