Pythonを使って、Google Speech APIv2による音声ファイル認識


Googleのサービスを使って音声ファイルの音声認識をします。

環境

・AnacondaによるPython3.5 64bits
・Win10
・音声ファイルは、WAV。別にsoxで変換すればよいだけなんですが。

インストールするパッケージ

SpeechRecognition https://github.com/Uberi/speech_recognition

いろんな音声認識クラウドサービスを使いやすくしてくれるパッケージです。高機能。

pyaudio

SpeechRecognitionの動作に必要なようです。

google-api-python-client

SpeechRecognitionのサンプルソースを流用するときに、使われているパッケージですので、インストールしておきます。

pydub

無音区間で音声ファイルを区切るために使用します。
pip install pydub
です。

FFMPEG

インストールしないといけない理由がよくわかりませんが、
http://chachay.hatenablog.com/entry/2016/10/03/215841
に書いているとおりにやっています。

Google のSpeech API v2を使うためには

おおよそ、
http://qiita.com/lethe2211/items/7c9b1b82c7eda40dafa9
のとおりかと思います。MLに加入しないと出てこないあたりが面倒ですね。

注意点

音声ファイルが長すぎると、どこ要因かは分かっていない(2017/01/11現在)のですが、エラーになります。私の環境では、10秒程度の音声ファイルの結果は返ってくるのですが、20秒になるとエラーになります。

SpeechRecognitionのサンプルを使う場合には、
audio = r.record(source, duration=10のように、durationで時間を調整して結果を確認してみてください。長いとエラーになりますよね?

無音部分でのファイル分割

基本的に、
http://chachay.hatenablog.com/entry/2016/10/03/215841
のとおりです。

Google Speech APIv2で音声認識しようとしたとき、ファイルが大きいと、(どこ要因か不明ですが)エラーになるので、ファイルを分割して認識にかけるために無音部分で分割しようとする試みです。

音声認識実行時のソース

いろんなライブラリを利用して、その間のデータ変換をwavファイル経由でやっているので、無駄が多いかと思いますが、ソース載せます。

import、無駄なものがあると思うので適宜省いてください。

import speech_recognition as sr
from os import path
from googleapiclient import discovery
import httplib2
import base64, json
import urllib
import os
from pydub import AudioSegment
from pydub.silence import split_on_silence


if __name__ == '__main__':
    r = sr.Recognizer()
    audio_data = []
    sound = AudioSegment.from_file('./filename.wav', format='wav')
    chunks = split_on_silence(sound, min_silence_len=1500, silence_thresh=-30, keep_silence=500)

    for chunk in chunks:
        chunk.export('./temp.wav', format='wav')
        AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), "temp.wav") 

        with sr.AudioFile(AUDIO_FILE) as source:
            audio = r.record(source)
            audio_data.append(audio)
    for audio in audio_data:
        try:
            print("Google Speech Recognition thinks you said " + r.recognize_google(audio,key='your API key', language='ja'))
        except sr.UnknownValueError:
            print("Google Speech Recognition could not understand audio")
        except sr.RequestError as e:
            print("Could not request results from Google Speech Recognition service; {0}".format(e))

参考サイト

http://chachay.hatenablog.com/entry/2016/10/03/215841
https://pypi.python.org/pypi/SpeechRecognition/