2018/02/14
2020/04/14
PythonでCloud Speech APIを叩いて音声をテキスト化
Google Cloud PlatformにはSpeech APIという音声認識を行うための機能があります。今回はこちらのAPIを使って、Pythonで音声の日本語をテキストに起こしてみようと思います。Speech APIの詳細。
また、Pythonで録音するプログラムと合わせて使うことで、録音した音声をほぼリアルタイムにテキスト化するプログラムも作成いたしましたので、ぜひ参考にしてください。
音声ファイルをテキストにするサンプルプログラム
以下にサンプルプログラムを示します。
#coding:utf8 import base64 from googleapiclient import discovery import httplib2 #APIキーを設定 key = "YourAPIKey" #音声認識に使うファイル名 speech_file = "sample.wav" #URL情報 DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?' 'version={apiVersion}') #APIの情報を返す関数 def get_speech_service(): http = httplib2.Http() return discovery.build( 'speech', 'v1', http=http, discoveryServiceUrl=DISCOVERY_URL, developerKey=key) #音声ファイルを開く with open(speech_file, 'rb') as speech: speech_content = base64.b64encode(speech.read()) #APIの情報を取得して、音声認識を行う service = get_speech_service() service_request = service.speech().recognize( body={ 'config': { 'encoding': 'LINEAR16', 'sampleRateHertz': 44100, 'languageCode': 'ja-JP', #日本語に設定 'enableWordTimeOffsets': 'false', }, 'audio': { 'content': speech_content.decode('UTF-8') } }) #SpeechAPIによる認識結果を保存 response = service_request.execute() #見やすいようにコンソール画面で出力 for i in response["results"]: print(i["alternatives"][0]["transcript"],"confidence:" , i["alternatives"][0]["confidence"])
以上のプログラムを実行することで、音声ファイルのテキスト変換が可能です。”YourAPIKey”の部分にはGoogle Cloud PlatformからAPIキーを発行してもらい、入力しましょう。
実行結果
上記のプログラムを実行するとコンソール画面では以下のような出力になります。
こんばんは confidence: 1 明日は晴れますかね confidence: 0.98677254 きっと晴れるよ confidence: 0.98866224
音声の内容と、confidenceのスコアが出力されています。confidenceとは、信頼度です。今回の例でいうと98%の認識精度で「明日は晴れますかね」と認識できていることになります。また、Speech APIは同じ音声ファイルでも音が途切れたりした場合、自動でそれを認識し、切ってくれます。今回は3文に切ってくれました。
音声を認識して、ほぼリアルタイムにテキスト化するプログラム
先ほどのサンプルプログラムは、あらかじめ用意しておいた音声をテキスト化するというものでした。これとPythonで録音するプログラムを合わせて使うことで、音声をすぐにテキスト化するプログラムを作りました。
以下のプログラムは、10秒間録音して、その音声をテキストに起こし、また10秒間録音して、テキストに起こし、、、を繰り返すものになっています。Pythonで録音する方法について詳細は Python3で録音してwavファイルに書き出すプログラムをご覧ください。
#coding:utf8 import base64 from googleapiclient import discovery import httplib2 import pyaudio #録音機能を使うためのライブラリ import wave #wavファイルを扱うためのライブラリ #APIキーを設定 key = "YourAPIkey" #音声を保存するファイル名 WAVE_OUTPUT_FILENAME = "sample10.wav" #録音に関する基本情報 RECORD_SECONDS = 10 #録音する時間の長さ(秒) iDeviceIndex = 0 #録音デバイスのインデックス番号 #APIのURL情報 DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?' 'version={apiVersion}') def record(): #基本情報の設定 FORMAT = pyaudio.paInt16 #音声のフォーマット CHANNELS = 1 #モノラル RATE = 44100 #サンプルレート CHUNK = 2**11 #データ点数 audio = pyaudio.PyAudio() stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index = iDeviceIndex, #録音デバイスのインデックス番号 frames_per_buffer=CHUNK) #--------------録音開始--------------- print ("recording...") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print ("finished recording") #--------------録音終了--------------- stream.stop_stream() stream.close() audio.terminate() waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb') waveFile.setnchannels(CHANNELS) waveFile.setsampwidth(audio.get_sample_size(FORMAT)) waveFile.setframerate(RATE) waveFile.writeframes(b''.join(frames)) waveFile.close() #APIの情報を返す関数 def get_speech_service(): http = httplib2.Http() return discovery.build( 'speech', 'v1', http=http, discoveryServiceUrl=DISCOVERY_URL, developerKey=key) def SpeechAPI(): #音声ファイルを開く with open(WAVE_OUTPUT_FILENAME, 'rb') as speech: speech_content = base64.b64encode(speech.read()) #APIの情報を取得して、音声認識を行う service = get_speech_service() service_request = service.speech().recognize( body={ 'config': { 'encoding': 'LINEAR16', 'sampleRateHertz': 44100, 'languageCode': 'ja-JP', #日本語に設定 'enableWordTimeOffsets': 'false', }, 'audio': { 'content': speech_content.decode('UTF-8') } }) #SpeechAPIによる認識結果を保存 response = service_request.execute() #見やすいようにコンソール画面で出力 for i in response["results"]: print(i["alternatives"][0]["transcript"],"confidence:" , i["alternatives"][0]["confidence"]) while True: record() SpeechAPI()
録音用の関数とSpeechAPIの用の関数を用意して、二つをwhile文で延々と回し続けるという単純なものになってます。
COMMENT
その他1件のコメントを表示する
-
たか 2018.4.11 4:47 PM
こちらの記事を参考にさせていただき、スクリプトを実行したのですが、
Traceback (most recent call last):
File “gsa.py”, line 49, in
for i in response[“results”]:
KeyError: ‘results’
と表示されたため、
print(response)
を実行したところ
{}
と空の値が返ってきました。なにか解決策ありましたら教えていただけると幸いです。よろしくお願いいたします。
-
IMIN 2018.4.11 5:03 PM
質問ありがとうございます。
音声がテキスト化できなかった場合、{}と空の値が返ります。
原因としては、音が小さい、周波数などの設定が違う、言語の設定が間違っているなどが考えられます。以上、お試しください。
-
たか 2018.4.11 5:08 PM
ありがとうございます。
試してみます。 -
シコイド 2018.8.15 11:18 AM
「10秒間録音して」ということは、10秒ごとに音声が途切れるということですよね。もし「おはようございます」と喋っている途中にその区切りが来たら、「おはようござ」「います」と切れてしまい、間違った認識がされることもあるということですかね。
-
IMIN 2018.8.15 11:21 AM
コメントありがとうございます。残念ながらそうですね。
たか 2018.4.11 4:47 PM
こちらの記事を参考にさせていただき、スクリプトを実行したのですが、
Traceback (most recent call last):
File “gsa.py”, line 49, in
for i in response[“results”]:
KeyError: ‘results’
と表示されたため、
print(response)
を実行したところ
{}
と空の値が返ってきました。
なにか解決策ありましたら教えていただけると幸いです。よろしくお願いいたします。
IMIN 2018.4.11 5:03 PM
質問ありがとうございます。
音声がテキスト化できなかった場合、{}と空の値が返ります。
原因としては、音が小さい、周波数などの設定が違う、言語の設定が間違っているなどが考えられます。
以上、お試しください。
たか 2018.4.11 5:08 PM
ありがとうございます。
試してみます。
シコイド 2018.8.15 11:18 AM
「10秒間録音して」ということは、10秒ごとに音声が途切れるということですよね。もし「おはようございます」と喋っている途中にその区切りが来たら、「おはようござ」「います」と切れてしまい、間違った認識がされることもあるということですかね。