更新
更新:2023/01/25
サンプリングレートが16000の音声しか扱えないことが、この問題を引き起こしているようです。@shirayuさん、ありがとうございます。
以下の記事で、サンプリングレートの変更、また長時間音声への対応を行ったので、よろしければご覧ください。
訂正の訂正
訂正の訂正:2023/01/24
音声を15秒、10秒毎に区切っても全く同様の問題が起こりました。
やはり、本質的に何かがおかしいようです。
訂正:2023/01/24
公式のデモノートブックをよく読むと15秒以下の音声にしか対応していないことが分かりました。
Reazon社のみなさん、閲覧者の皆さん、大変申し訳ありませんでした。
同じように勘違いしている人を減らすため、本記事は残しておきます。
はじめに
警告
初心者のため、筆者の認識が間違っている可能性が高いです
間違いがあれば教えてください
先日Reazon社から公開されたReazonSpeech(https://research.reazon.jp/projects/ReazonSpeech/) を使ってみたのですが、全く文字起こしに使えませんでした。
問題意識
先日、試しに、1時間程度のインタビュー音声を30秒ごとに分割して音声認識にかけたところ、あまりにひどい内容でした。
手動文字起こし (プライバシー保護のため多少表現を変えてあります)
まあ先生もまた移動するし、僕もやっぱり○○なのでよく分かるというか。あの地域本当に人が少ないし、一人になったときにどうするみたいなのは、やっぱなんか聞いてみたいっていうのはありますね。
ReazonSppechによる文字起こし (30秒区切りのアウトプットです)
output/cut_wav/000.wav
うわっすごいなあ
output/cut_wav/001.wav
うん
output/cut_wav/002.wav
うんうん
全然違うじゃん… どうしてこうなった……
相槌しかないし、そもそも、相槌ないし。
30秒区切りの方法や、あるいはインタビュー音声自体に問題があるのかと思い、YouTubeの動画で実験してみました。
やったこと
文字起こしの素材となる音声は、Youtubeを開いて最初に出てきたshort動画にしました。
視聴者が下ネタを言ってると勘違いされたひろゆきが煽りまくる
素材として微妙であることは否めませんが、やり直すのが面倒だったので許してください。決して下ネタが直接的に出る動画ではありません。
環境
Amazon Sage Maker(Jupyter Notebook)
モジュール等インストールのコード
#諸ツールのインストール
%%capture
!pip install -q espnet==0.10.3
!pip install -q espnet_model_zoo
import warnings
warnings.filterwarnings('ignore')
from huggingface_hub import notebook_login
notebook_login()
conda install -c conda-forge libsndfile
import torch
#ReazonSpeechのダウンロード
from espnet2.bin.asr_inference import Speech2Text
device = "cuda" if torch.cuda.is_available() else "cpu"
beam_size = 5#@param {type:"integer"}
reazonspeech = Speech2Text.from_pretrained(
"reazon-research/reazonspeech-espnet-v1",
beam_size=beam_size,
batch_size=3,
device=device
)
#モジュールのインストール
import librosa
import librosa.display
from IPython.display import display, Audio
import matplotlib.pyplot as plt
from datetime import datetime
%cd ASR
!ls
import pydub
sound = pydub.AudioSegment.from_mp3("hiroyuki.mp3")
sound.export("hiroyuki.wav", format="wav")
ReazonSpeechによる文字起こし部分
# 音声ファイル読み込み
import soundfile
speech, _ = soundfile.read("hiroyuki.wav") # 認識させたい音声ファイルを指定
#認識結果の取得と表示
nbests = reazonspeech(speech)
text, *_ = nbests[0]
print(text)
手動文字起こし
君ら大丈夫?ディープスロートって一般的に言うと、一応歴史上の、その、ウォーターゲート事件の話なんですよ。でも、今のコメントでさ、39000人さ、みんな下ネタだと思ってんの?だいじょうぶ?君ら。ちょっと知識偏ってますよ。そういう下ネタで使われるのかもしれないですけど、(略)
ReazonSppechによる文字起こし
それではいきましょう続いてはこちらのコーナーですけれどもどういうことなんでしょうかということなんですけれどもどういうことが起こっているんですかということですけれどもどうしたらいいかということでしたけれどもこれはどういうことでしょうかということなんですけどもこれはどういうことですか
こちらこそどういうことですかという気分です
なぜこうなるのか原因がわかる人がいたら教えてください。
自分は、雑音にロバストでないのかなと思いましたが、よくわかりません。
サンプリングレートを16000に変更すると無事認識されます。(1/25 追記)
参考
公式サイトのデモ音声では、本コードが全く問題なく作動することは確認済みです
ReazonSppechによる文字起こし
気象庁は雪や路面の凍結による交通への影響暴風雪や高波に警戒するとともに雪崩や屋根からの落雪にも十分注意するよう呼びかけています
参考文献