とりあえずなんか書いとけ

Python3系とかアイワナ(GM8.1 Standard)とか読書とか

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)

実行結果は以下の通りになりました.

f:id:toki_0177:20190226144746p:plain
ファイルで入力したときの実行結果
さきほどのURLには音声ファイルをテキストに起こしたものもあるので,それと比較してみます.テキストに起こしたものを同じように表示したのがこちら.
f:id:toki_0177:20190226185948p:plain
入力したファイルを文字に起こしたもの

正確な結果の評価方法はわからないので適当ですが,この画像を見ればわかる通りかなり正確に音声認識できていることがわかります.

マイクから音声認識

次に入力としてマイクを使う方法について.
こちらも基本は同じで録音した音声を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
実行結果は以下の通りです.

f:id:toki_0177:20190226195017p:plain
マイク入力での実行結果
完璧に認識されています.
何回かやってみましたが,毎回かなりの精度で認識できていました.

感想とか

使ってみるまでは正直ここまでの精度で認識できると思っていなかったので驚いています.
さすがGoogleといったところでしょうか.
特に使いたい場所があるわけでもないんですがね.
あんまり調べてないからわかりませんが,Google Speech APIのリクエスト回数に制限がないのなら,自分の声をリアルタイムに文字に起こして,それを何らかの音声読み上げシステムに渡してあげることでリアルタイムに肉声を変換できるのでは?とか思いました(長文).
生配信とかで自分の声出したくない人には使えそう.