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

ESPnet2の使い方|日本語音声認識 (Speech To Text)編

tadanori

PythonでSpeech-To-Text(Speech2Text)

pytorchでSpeech-To-Text(音声認識、文字起こし)をやりたいと思い、調べてみるとESPnet2というものを使えば簡単に行うことができるようでしたので、実際に使ってみました。

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

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

あわせて読みたい
OpenAIのWhisper(v3)を使った音声認識・音声翻訳・音声識別
OpenAIのWhisper(v3)を使った音声認識・音声翻訳・音声識別

ESPnet2について

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

End-to-Endのアーキテクチャを採用しているので、音声処理の各ステップ(特徴抽出、言語モデル、音響モデル)などの処理を個別に扱うのではなく、入力から出力までの処理を1つのネットワークで処理することができます。これにより、モデルの構築・学習・デプロイなどが簡単化されています。

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

おすすめ書籍

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

記事URLをコピーしました