こんにちは、ミナピピン(@python_mllover)です。
今回はMENTAの案件でGoogleSpeachAPIを触ったので使い方を忘れないようにメモしておきます。
音声ファイルの作成
まず音声認識に使用する音声ファイル(.wav)を用意します。(既にお持ちの方はスルーしてください)
自分は以下のサイトからサンプルを調達しました。
url:https://choimitena.com/Audio/Sample
Google Speech APIの有効化
今回は認識にGoogle Speech APIを使うので、これを使えるように登録をしていきます.
やり方は以下の記事を参考にしました。
関連記事:【GCP】GoogleCloudPlatformでプロジェクトを作成してAPI鍵の作成&有効化する
プロジェクトを作成したらGoogleSpeachAPIAPIを有効化します。
https://console.cloud.google.com/speech//overview
ライブラリのインストール
$pip install google-api-python-client
音声認識(文字起こし)を実装する
これで準備は整ったのでPYthonのスクリプトで音声認識を実装してみましょう。GoogleSpeachAPIはGCPのcloudstrageと連携してストレージ上の音声ファイルの文字起こしをする方法は結構あったのですが、ローカルの音声ファイルをポストする方法はイマイチなかったので方法をメモしておきます。
import base64 import requests import httplib2 from googleapiclient import discovery #APIキーを設定 key = '自分のAPI鍵' # API URL DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?version={apiVersion}') #音声認識に使う音声ファイルのPATH speech_file = r"C:\Users\81903\jupyter notebook\sampleTokyo2.wav" #APIの情報を返す関数 def get_speech_service(): http = httplib2.Http() return discovery.build( 'speech', 'v1', http=http, discoveryServiceUrl=DISCOVERY_URL, developerKey=key) def __recognize_speech(content): service = get_speech_service() service_request = service.speech().recognize( body={ 'audio': { 'content': content.decode('UTF-8') }, 'config': { 'encoding': 'LINEAR16', 'sampleRateHertz': 48000, 'languageCode': 'ja-JP', }, }) response = service_request.execute() return response if __name__ == '__main__': #音声ファイルを開く with open(speech_file, 'rb') as speech: speech_content = base64.b64encode(speech.read()) resp = __recognize_speech(speech_content) print(resp['results'])
<実行結果>
[{‘alternatives’: [{‘transcript’: ‘浅野朋美です’, ‘confidence’: 0.80960286}], ‘languageCode’: ‘ja-jp’}, {‘alternatives’: [{‘transcript’: ‘今日の東京株式市場で日経平均株価は小幅続伸となっています終値は昨日に比べ22円72銭高の11088円508000円でしたどうしよう1部の値上がり銘柄数は1146対して値下がりは368変わらずは104銘柄’, ‘confidence’: 0.9505427}], ‘languageCode’: ‘ja-jp’}]
APIのリクエストは1日辺り60分までは無料でそこから料金が発生するみたいです。
ハマった点
エンコード
postする際に音声ファイルのエンコードとでコードがうまくいっていないとreturnのresultsに戻り値がなく{‘totalbilledtime’:0}というものが返ってくる。最初これが何を意味しているのか分からずにかなりの時間を要しました。
あとconfigの’encoding’形式も音声ファイルによって適した形があるらしく(LTACなど)ファイルによって指定する方式が違うみたいです。
モノラル出力
音声ファイルには詳しくなかったのですが、wavにはステレオ出力とモノラル出力があるらしく、GoogleSpeachAPIでの音声認識はモノラル出力にしか対応していないみたいなのでステレオ出力のファイルはモノラルに変換してからあげないといけないみたいです。
“Must use single channel (mono) audio, but WAV header indicates 2 channels.”. Details: “Must use single channel (mono) audio, but WAV header indicates 2 channels.”
config
音声ファイルによってsampleRateHertzの値を48000とか44100とか8000に変えないとAPIがうまく叩けない。(理由知っている人がいたらTwitterで教えてください)
参考:https://dev.classmethod.jp/articles/voice-to-text-with-twilio-and-speech-api/
コメント