Pythonで音声認識をやってみる
なんかやってみたかったので,PythonのSpeechRecognitionというのを使って音声認識をやってみます.
今回は基本的に日本語の音声認識を目的としてやっていきます.
また,今回は強いと噂のGoogleのSpeech APIを使用します.
SpeechRecognition,PyAudioのインストール
音声認識をするために必要なSpeechRecognitionと,音声入力に必要なPyAudioのインストールを行います.
コンソールとかで以下のコマンドを実行.
$ python -m pip install SpeechRecognition pyaudio
これでライブラリが使えるようになります.
Google Speech APIの有効化
今回は認識にGoogle Speech APIを使うので,これを使えるように登録をしていきます.
やり方は以下の記事を参考にしました.
qiita.com
ここでは割愛.
ファイルから音声認識
ここからはSpeechRecognitionを用いて音声認識をしていきたいと思います.
まずは入力としてファイルを使う方法から.
ソースコードは以下のものを使いました.
音声ファイルは作業ディレクトリにおいて,上の方法で取得したAPIのキーを用いて行います.
import speech_recognition r = speech_recognition.Recognizer() with speech_recognition.AudioFile('hoge.wav') as src: audio = r.record(src) print(r.recognize_google(audio, key='Your API Key', language='ja-JP'))
今回は,音声データとして以下のURLの「模擬公演音声」をWAVファイルに変換したものを利用しました.
サンプル・データ 日本語話し言葉コーパス(CSJ)
実行結果は以下の通りになりました.さきほどのURLには音声ファイルをテキストに起こしたものもあるので,それと比較してみます.テキストに起こしたものを同じように表示したのがこちら.
正確な結果の評価方法はわからないので適当ですが,この画像を見ればわかる通りかなり正確に音声認識できていることがわかります.
マイクから音声認識
次に入力としてマイクを使う方法について.
こちらも基本は同じで録音した音声をWAVファイルとして保存し,それを読み込ませることでマイクから音声認識を行います.
マイクからWAVファイルにするプログラムは,以下のサイトのソースコードを参考にしました.
Python3で録音してwavファイルに書き出すプログラム | 全人類がわかる統計学
実装したソースコードは以下の通りです.
ここでは録音時間は10秒としましたが,キー入力があるまでとかにできればもっと使いやすいかも.
あとはmain()内でループさせれば連続で入力することも可能?
import speech_recognition import pyaudio import wave RECORD_SECONDS = 10 # 録音する時間 FILENAME = 'record.wav' # 保存するファイル名 iDeviceIndex = 0 # 録音デバイスの番号 FORMAT = pyaudio.paInt16 # 音声フォーマット CHANNELS = 1 # チャンネル数(モノラル) RATE = 44100 # サンプリングのレート CHUNK = 2**11 # データ点数 def main(): record() recognition() def record(): 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("finish recording") # 録音終了 stream.stop_stream() stream.close() audio.terminate() waveFile = wave.open(FILENAME, 'wb') waveFile.setnchannels(CHANNELS) waveFile.setsampwidth(audio.get_sample_size(FORMAT)) waveFile.setframerate(RATE) waveFile.writeframes(b''.join(frames)) waveFile.close() def recognition(): r = speech_recognition.Recognizer() with speech_recognition.AudioFile(FILENAME) as src: audio = r.record(src) print(r.recognize_google(audio, key='Your API Key', language='ja-JP')) if __name__ == '__main__': main()
実際に動かしてみましょう.
読み上げる内容は,Wikipediaの赤血球についての記事の冒頭です.
赤血球 - Wikipedia
実行結果は以下の通りです.完璧に認識されています.
何回かやってみましたが,毎回かなりの精度で認識できていました.