ESPnet2を使った日本語音声認識(Speech To Text)の手順解説
本記事では、ESPnet2を使った日本語のSpeech To Text(STT)音声認識について解説します。ESPnet2は、PyTorchをベースにした高機能なツールで、音声からテキストへの変換を行うことが可能です。この記事では、ESPnet2のインストール手順から、実際の使い方まで詳しく解説します。
PythonでSpeech-To-Text(Speech2Text)
pytorchでSpeech-To-Text(音声認識、文字起こし)をやってみようと思い良いライブラリがないか調べてみました。調べてみるとESPnet2というものを使えば簡単に行うことができるようでしたので、実際に使ってみました。この記事では、ESPnet2を使った音声認識の手順を解説します。
参考リンク:ESPnet2のリポジトリ
OpenAI Whisperを使う場合は、こちらの記事を参照してください。
ESPnet2について
ESPnet2は、End-to-End(エンドツーエンド)の音声認識、テキスト読み上げ、音声翻訳、音声言語理解などをカバーするツールキットEPSnetの第2世代版です。
End-to-Endのアーキテクチャを採用しているので、音声処理の各ステップ(特徴抽出、言語モデル、音響モデル)などの処理を個別に行う必要はなく、入力から出力までの処理を1つのネットワークで処理することができます。
これにより、モデルの構築・学習・デプロイなどが簡単化されています。
説明したようにEPSnet2はさまざまなタスクで利用できますが、ここではEPSnet2を文字起こしに利用してみます。
文字起こしは、タスクとしては、自動音声認識(ASR: Automatic Speech Recognition)に分類されるので、EPSnet2のドキュメント等を調べる場合は、ASRタスクで検索してみてください。
なお、音声合成(Text To Speech)については以下の記事で紹介していますので、そちらを参照してください。
コードについて
今回のコードは、Google Colab用のコードとしてGithubに置いています。
Google Colab用コード:Speech2Textのサンプルコード(Github)
※GPUを利用するコードになっていますので注意してください
ライブラリのインストール
必要なライブラリをColab環境にインストールします。
ライブラリのインストールのコードは以下になります。Colab環境以外の場合は、先頭の!
を除いてコマンドラインで実行してインストールしてください。
!pip install -q espnet pypinyin parallel_wavegan gdown espnet_model_zoo
!pip install -q --no-build-isolation pyopenjtalk
文字起こしするデータをColabに転送する
文字起こしするサンプルデータとして、以下を用います。この音声は、ESPnet2を使ってテキストを読み上げたものです。コードのテストでは、この音声データをダウンロードして使ってください。
なお、以下ではファイル名はtest.wav
であるとして説明しています。
このデータ、サンプリングレートが44.1Khz、約9秒です。読み上げているテキストは、「吾輩は猫である」の冒頭になります。
“吾輩は猫である。名前はまだ無い。 どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。”
これを、Google Colabにアップロードするコードが以下になります。
from google.colab import files
uploaded = files.upload()
実行するとファイル選択のボタンが表示されますので、それをクリックしてファイルをアップロードしてください。
必要なライブラリを読み込む
必要なライブラリを読み込みます。
import librosa
from espnet_model_zoo.downloader import ModelDownloader
from espnet2.bin.asr_inference import Speech2Text
ModelDownloader
とSpeech2Text
がメインとして必要になるライブラリです。
librosa
は音声信号処理で有名なライブラリで、今回はサンプリングレート変換に用いるのでインポートしています。
読み上げ用のモデルを生成
利用するモデルの設定
tag
にモデル名を設定します。
tag = "kan-bayashi/csj_asr_train_asr_transformer_raw_char_sp_valid.acc.ave"
設定できるモデル名はepsnet_model_zooのテーブルで確認することができます。とりあえず、タスクがasr
のものを選べば良いです。日本語の場合は
kan-bayashi/csj_asr_train_asr_transformer_raw_char_sp_valid.acc.ave
が利用できました。
現在のところ、日本語対応のモデルは以下の2つのようです。最新情報等は、上にリンクしたcsvファイル(テーブル)を参照してください。
kan-bayashi/csj_asr_train_asr_transformer_raw_char_sp_valid.acc.ave
Shinji Watanabe/laborotv_asr_train_asr_conformer2_latest33_raw_char_sp_valid.acc.ave
オブジェクトの生成
asrのモデルのオブジェクトを生成します。これにはSpeech2Text
を使います。
download_and_unpack(tag)
のtag
は、先ほど設定したモデル名です。また、GPUを利用するのでcuda
を指定しています。
# asrモデルを作成
d = ModelDownloader()
speech2text = Speech2Text(
**d.download_and_unpack(tag),
device="cuda"
)
これを実行すると、speech2text
のオブジェクトが生成されます
モデルのダウンロードに少し時間がかかります
文字起こし
音声→テキスト変換
文字起こしは非常に簡単です。
まず、wavファイルをlibrosa
を使って読み込みます。この時、サンプリングレートを変換します。
文字起こし用のモデルは、入力の音声データのサンプリングレートが16Khzであること想定して作られていいますので、44.1Khzの音声データを入力すると正しく変換することができません。そこで、librosaのloadの機能を使ってサンプリングレートの変換を行っています。
各モデルのサンプリングレートは、こちらのCSVファイルに記載されていますのでそちらを参考にしてください。CSVファイルのリンクが切れている場合には、ESPnet Model ZooのトップのGithubのリンクからたどってください。
あとは、speech2textに変換した音声ファイルを渡し、変換結果のテキストを取り出して表示しているだけです。
# 音声ファイル読み込み
import librosa
speech, sr = librosa.core.load("test.wav", sr=16000)
# 推論と表示
nbests = speech2text(speech)
text, *_ = nbests[0]
print(text)
結果は、以下の通りです。これをみると若干変換みすがあるように見えます。
"我が輩は猫である名前はまだないどこで生まれたかとんと検討が付かぬ何でも薄暗いじめじめしたところでにおいには泣いていたことだけは記憶している"
それでも、この精度の変換が手軽に利用できるようになったというのは嬉しいですね。
終わりに
いかがでしたか? 文字起こしも結構簡単にできると感じたのではないでしょうか。AI系のライブラリも充実してきたので、この手の処理が簡単に自分のプログラムに取り込むことができるようになってきました。マルチモーダルなアプリとか、手軽に作れるようになるのであとはアイデア次第といったところでしょうか。