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

カテゴリ: Python

データサイエンティストを募集しています AVILEN採用サイトへ

関連サービス

講座一覧ページ

記事一覧はこちら

無料で統計学を学ぶ

AVILEN 採用情報

データサイエンティストを募集しています AVILEN採用サイトへ