SpeechRecognition はいくつかのエンジンや API に対応した音声認識のための Python ライブラリです.ここでは Google のブラウザ向け Web 音声認識 API を内部的に利用して音声ファイルから音声を認識して文字起こしを行う最も簡単な方法を説明します.
なお,ここで利用する方法は正式な Google Cloud Speech-to-Text API ではない「裏口的な利用」になります.つまり,短時間に大量のリクエストを送信するとIPアドレス単位でブロックされたり,1回あたりの音声ファイルの長さは60秒以内が目安になるなど,制限が大きいことに注意してください.
したがって,あくまで簡易的なテスト利用に留め,本番環境として利用する場合は Google Cloud Speech-to-Text API などの利用を検討してください.なお,このページで説明する SpeechRecognition から Google Cloud Speech-to-Text API を利用することも可能です.あるいは,ここで説明する Whisper を利用する方法も検討してください.
SpeechRecognition は pip install コマンドでインストールできます.
(base) C:\Users\rinsaka>pip install SpeechRecognition ⏎
インストールに失敗する場合は,ここを参考に仮想環境を作成してその環境の中にインストールすると良いでしょう.
あらかじめ音声認識したい音声ファイルを *.wav 形式でカレントディレクトリに設置しておきます.なお,SpeechRecognition では WAV,AIFF/AIFF-C,Native FLAC 形式の音声ファイルが利用できます.その他の形式(*.mp3, *.m4a など)の場合は,pydub と ffmpeg などを利用して WAV 形式に変換してください.
音声ファイルが準備できたら,ライブラリをインポートします.このとき,ライブラリ名には _ が含まれていることに注意してください.
import speech_recognition as sr
import pprint
音声データを受け取って,文字に変換するための機能を持つクラスのインスタンスを作ります.
r = sr.Recognizer()
次に,音声ファイル (audio.wav) から音データを全部読み込んで,音声認識に使える形式にします.もう少し具体的に説明すると,WAV ファイルを読み込み,PCM データを取得し,AudioData 型として保持しています.なお,with の説明はこちらを参照してください.
with sr.AudioFile("audio.wav") as src:
audio = r.record(src)
recognize_google メソッドを利用して,AudioData型の audio について音声認識を実行します.このとき,言語には日本語 (ja-JP) を指定します.30秒程度の音声を指定した場合,7秒程度で結果が得られました.
result = r.recognize_google(audio, language="ja-JP")
認識結果を表示します.次の結果では,句読点は存在せず,いくつかの空白で区切られているように読み取れます.
print(result)
バイソン言語はオブジェクト思考 言語のひとつです Python では 数値や 関数などすべてをオブジェクトとして扱います整数型のオブジェクトやリストのオブジェクトなど様々なものが利用できます 独自のカスタムオブジェクトを作成することもできます このカスタムオブジェクトでは 属性とメソッドを定義してひとまとめ で管理することができるようになります
認識結果が具体的にどのような形式で得られているかを詳細に確認するために,pprint を利用し結果を整形して表示させてみると良いでしょう.次の結果から,タプル形式で全体がいくつかに分割されていることが分かります.
pprint.pprint(result)
('バイソン言語はオブジェクト思考 言語のひとつです Python では 数値や '
'関数などすべてをオブジェクトとして扱います整数型のオブジェクトやリストのオブジェクトなど様々なものが利用できます '
'独自のカスタムオブジェクトを作成することもできます このカスタムオブジェクトでは 属性とメソッドを定義してひとまとめ '
'で管理することができるようになります')
show_all=True オプションを指定すると,複数の結果が得られます.alternative は認識結果の候補リストで,上から順に「可能性が高い」ことを意味しています.transcript は実際の文字列候補で,今回は「言語のひとつ」と「言語の一つ」の違いだけでした.confidence(信頼度)はその候補が正しい確率(っぽい値)です.ただし,1つ目の文字列候補にしかこの値は表示されないようです.内部的にはおそらく全ての認識結果の候補に confidence が計算されて,この confidence についてあるしきい値以上の候補が(上位N件の制限で) altenative に含まれているのではないかと想像できます.多くの場合2件が表示されるようですが,認識結果次第では1件だったり,3件以上の場合もあるかもしれません.
result_all = r.recognize_google(audio, language="ja-JP", show_all=True)
pprint.pprint(result_all)
{'alternative': [{'confidence': 0.9184531,
'transcript': 'バイソン言語はオブジェクト思考 言語のひとつです Python では 数値や '
'関数などすべてをオブジェクトとして扱います整数型のオブジェクトやリストのオブジェクトなど様々なものが利用できます '
'独自のカスタムオブジェクトを作成することもできます このカスタムオブジェクトでは '
'属性とメソッドを定義してひとまとめ で管理することができるようになります'},
{'transcript': 'バイソン言語はオブジェクト思考 言語の一つです Python では 数値や '
'関数などすべてをオブジェクトとして扱います整数型のオブジェクトやリストのオブジェクトなど様々なものが利用できます '
'独自のカスタムオブジェクトを作成することもできます このカスタムオブジェクトでは '
'属性とメソッドを定義してひとまとめ で管理することができるようになります'}],
'final': True}
このモデルでは,文脈が弱い位置(特に文頭)では誤認識しやすく,後半では文脈によって補正されるという特徴があります.今回の例では,先頭は「パイソン(または Python)」という発音でしたが,「バイソン」と認識されました.これはまだ文脈のデータが一切ないことから誤認識していると考えられます.一方で,「オブジェクト」や「言語」という単語を認識できたことによって強烈な文脈が得られたためその後は「Python」と認識できるようになった,と考えることができます.