K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

動画からの音声認識

05.3.2

動画からの音声認識

最終更新 2020-02-12 読了時間 3 分
まとめ
Whisper は、音声ファイルを入力すると英文のテキストと「何秒から何秒までに何を言ったか」のセグメント一覧を返す音声認識モデルです。このページでは whisper.load_model("base") で 74M パラメーターのモデルを読み込み、Flex LNG の 2022 年第 3 四半期決算動画の mp3 を transcribe() でテキスト化します。続けて HuggingFace の FuguMT(staka/fugumt-en-ja)を pipeline("translation") で呼び、". " で区切った 1 文ずつを日本語に翻訳します。読み終えると、モデルサイズ tiny〜large の選び方と、“Ernings” のような誤認識を後処理で直す見通しが立ちます。

直感 #

海外企業の決算発表動画やアナリスト向けウェブキャストは貴重な情報源ですが、音声のままでは感情分析にもキーワード検索にも使えません。OpenAIが公開しているWhisperは、68万時間以上の多言語データで学習された自動音声認識(ASR)モデルで、英語の決算動画なら数字や社名を含めて高い精度でテキスト化できます。出力は全文の text と、開始秒・終了秒付きの segments の 2 種類です。文字起こし結果をさらに FuguMT に通せば、日本語で読みながら分析を進められます。

詳細な解説 #

環境構築 #

Anacondaを使用している場合は、以下のコマンドで専用環境を作成します。Whisper は内部で ffmpeg を呼んで mp3 を読み込むため、conda install ffmpeg を忘れると transcribe() が “No such file or directory: ‘ffmpeg’” で止まります。

1
2
3
4
5
6
conda create -n py39-whisper python=3.9 anaconda
conda activate py39-whisper
pip install git+https://github.com/openai/whisper.git
conda install ffmpeg -c conda-forge
conda install jupyter ipykernel pandas
conda install transformers[sentencepiece]

Whisperによる音声認識 #

音声データは『Flex LNG Q3 2022 Key Takeaways』の音声を使用しています。

Whisperのモデルサイズはtiny・base・small・medium・largeの5段階があり、大きいほど精度が高くなりますが処理時間も増えます。決算動画のような明瞭な音声であればbaseで十分な精度が得られます。次のコードは、モデルの読み込みと mp3 の文字起こしを 2 行で済ませ、全文を表示します。

1
2
3
4
5
6
7
import warnings
import whisper
from transformers import pipeline

model = whisper.load_model("base")
result = model.transcribe("FlexLNG_Q3_2022_Key_Takeaways.mp3")
print(result["text"])
1
Hi and welcome to FlexLng's TURD Quater Highlights. Revenue's 4D Quater came in at 91 million in line with previous guidance of approximately 90 million. Ernings was strong, net income and adjusted net income was 47.42 million, translating into Ernings per share and adjusted Ernings per share of 88.79 respectively. Freight market during the quarter boomed and this affected both short term and long term rates positively. During the quarter we had three ships...

出力を読むと、“91 million” や “47.42 million” のような数字は正しく拾えている一方で、“Third” が “TURD”、“Earnings” が “Ernings” と綴りを崩しています。数字が正しく、語の綴りだけが崩れるのは base モデルに典型的な誤り方で、置換辞書で直せる範囲です。


モデルサイズによる精度の違い #

モデルサイズを上げると固有名詞や専門用語の認識精度が向上します。WER(Word Error Rate)は認識した単語のうち誤った割合で、tiny から large に上げるほど下がりますが、パラメーター数は 39M から 1550M へ約 40 倍に増えます。

モデルパラメーター数英語WER処理速度推奨用途
tiny39M高最速プロトタイプ・短時間テスト
base74M中速い明瞭な音声・決算動画
small244M低普通ノイズのある音声
medium769M低遅い高精度が必要な場合
large1550M最低最遅最高精度・GPU推奨

タイムスタンプ付き文字起こし #

result["segments"]にはタイムスタンプ付きのセグメント情報が含まれており、どの時間帯でどの発言があったかを把握できます。次のコードは最初の 5 セグメントについて、開始秒・終了秒・本文を 1 行ずつ表示します。

1
2
3
4
5
for seg in result["segments"][:5]:
    start = seg["start"]
    end = seg["end"]
    text = seg["text"].strip()
    print(f"[{start:6.1f}s - {end:6.1f}s] {text}")

FuguMTによる日本語翻訳 #

文字起こし結果を日本語に翻訳します。文単位に分割してからモデルに入力することで、翻訳品質が向上します。FuguMT は Marian 系の英日翻訳モデルで、1 回に受け取れる長さに上限があるため、全文をまとめて渡すと途中で切れたり文脈が崩れたりします。音声認識の openai/whisper と、翻訳に使う ニューラル機械翻訳モデルFuguMT(HuggingFace 版は staka/fugumt-en-ja)の公式情報は各リンク先にあります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
MAX_LENGTH = 400
translator = pipeline("translation", model="staka/fugumt-en-ja")
translated_text = []

for t in result["text"].split(". "):
    t = t.strip()
    if len(t) > 5:
        translated_text.append(translator(t[:MAX_LENGTH])[0]["translation_text"])

for t in translated_text[:5]:
    print(t)
1
2
3
4
5
Flexingの第3四半期ハイライトへようこそ。
Revenueの4D Quaterは9100万で、前回のガイダンスで約9000万だった。
Erningsは好調で、純利益と調整済み純利益は47.42百万で、それぞれ1株当たりErningsに翻訳され、調整済みErningsは88.79だった。
第4四半期の貨物市場は急成長し、短期と長期の両方にプラスの影響を与えました。
四半期中は3隻の船が新船のチャーターを開始し

訳文を見ると、“Ernings” や “4D Quater” のような文字起こしの誤りはそのまま日本語に残っています。FuguMT は入力の綴りを直しません。したがって、Whisper の出力を翻訳の前に replace や置換辞書で修正しておくことが、日本語字幕の品質を決めます。

翻訳の正しさは保証されておらず、また本コードも動作や出力に関しては一切の責任を負えません。


使いどころと落とし穴 #

文字起こし結果に含まれる誤認識は、“TURD” → “Third”、“Ernings” → “Earnings” のように型が決まっていることが多く、re.sub と金融用語の置換辞書で翻訳前にまとめて直せます。修正したテキストを 感情分析のページ の sentiment_pipeline に渡せば、決算発表のトーン分析まで自動化できます。

長時間の動画では、transcribe() に language="en"(コマンドラインなら --language en)を指定して言語判定を固定すると、途中の無音や雑音で別言語と誤判定されるのを防げます。GPU がない環境では tiny か base を選び、1 時間の動画なら数分〜十数分で終わる処理時間を優先し、精度が必要な部分だけ small で再実行する使い分けが現実的です。