2018/02/14

2020/04/14

PythonでCloud Speech APIを叩いて音声をテキスト化

Python

ライター:

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文で延々と回し続けるという単純なものになってます。

(totalcount 10,926 回, dailycount 12回 , overallcount 16,613,735 回)

ライター:

Python

single-banner

COMMENT

コメントを残す

メールアドレスが公開されることはありません。
*は必須項目です。




CAPTCHA


  • たか 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秒ごとに音声が途切れるということですよね。もし「おはようございます」と喋っている途中にその区切りが来たら、「おはようござ」「います」と切れてしまい、間違った認識がされることもあるということですかね。

その他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

    コメントありがとうございます。残念ながらそうですね。