機械学習
記事内に商品プロモーションを含む場合があります

ESPnet2を使った日本語音声認識(Speech To Text)の手順解説

Aru

本記事では、ESPnet2を使った日本語のSpeech To Text(STT)音声認識について解説します。ESPnet2は、PyTorchをベースにした高機能なツールで、音声からテキストへの変換を行うことが可能です。この記事では、ESPnet2のインストール手順から、実際の使い方まで詳しく解説します。

PythonでSpeech-To-Text(Speech2Text)

pytorchでSpeech-To-Text(音声認識、文字起こし)をやってみようと思い良いライブラリがないか調べてみました。調べてみるとESPnet2というものを使えば簡単に行うことができるようでしたので、実際に使ってみました。この記事では、ESPnet2を使った音声認識の手順を解説します。

参考リンク:ESPnet2のリポジトリ

OpenAI Whisperを使う場合は、こちらの記事を参照してください。

あわせて読みたい
OpenAIのWhisper v3による音声認識・翻訳・識別を試す【Python】
OpenAIのWhisper v3による音声認識・翻訳・識別を試す【Python】

ESPnet2について

ESPnet2は、End-to-End(エンドツーエンド)の音声認識、テキスト読み上げ、音声翻訳、音声言語理解などをカバーするツールキットEPSnetの第2世代です。

End-to-Endのアーキテクチャを採用しているので、音声処理の各ステップ(特徴抽出、言語モデル、音響モデル)などの処理を個別に行う必要はなく、入力から出力までの処理を1つのネットワークで処理することができます

これにより、モデルの構築・学習・デプロイなどが簡単化されています。

説明したようにEPSnet2はさまざまなタスクで利用できますが、ここではEPSnet2を文字起こしに利用してみます。

文字起こしは、タスクとしては、自動音声認識(ASR: Automatic Speech Recognition)に分類されるので、EPSnet2のドキュメント等を調べる場合は、ASRタスクで検索してみてください。

なお、音声合成(Text To Speech)については以下の記事で紹介していますので、そちらを参照してください。

あわせて読みたい
ESPnet2を使った日本語音声合成(Text-To-Speech)の手順解説
ESPnet2を使った日本語音声合成(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

エラーが発生しますが、2023.09.02現在の環境では、無視してOKでした

文字起こしするデータを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

ModelDownloaderSpeech2Textがメインとして必要になるライブラリです。

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系のライブラリも充実してきたので、この手の処理が簡単に自分のプログラムに取り込むことができるようになってきました。マルチモーダルなアプリとか、手軽に作れるようになるのであとはアイデア次第といったところでしょうか。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中
記事URLをコピーしました