動画からの音声認識

7.3.2.1

動画からの音声認識

最終更新 2020-02-12 読了時間 2 分
まとめ
  • OpenAIのWhisperで決算動画の音声を自動文字起こしし、分析用テキストを取得する。
  • HuggingFaceのFuguMTモデルで英語テキストを日本語に翻訳するパイプラインを構築する。
  • モデルサイズの選択や前処理の工夫で、文字起こし精度を改善する方法を学ぶ。

直感 #

海外企業の決算発表動画やアナリスト向けウェブキャストは貴重な情報源ですが、音声のままでは定量分析に使えません。OpenAIが公開しているWhisperは、68万時間以上の多言語データで学習された自動音声認識(ASR)モデルで、英語の決算動画を高精度にテキスト化できます。文字起こし結果をさらに翻訳モデルに通すことで、日本語での分析も可能になります。

詳細な解説 #

環境構築 #

Anacondaを使用している場合は、以下のコマンドで専用環境を作成します。

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のモデルサイズはtinybasesmallmediumlargeの5段階があり、大きいほど精度が高くなりますが処理時間も増えます。決算動画のような明瞭な音声であればbaseで十分な精度が得られます。

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...

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

モデルサイズを上げると固有名詞や専門用語の認識精度が向上します。

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

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

result["segments"]にはタイムスタンプ付きのセグメント情報が含まれており、どの時間帯でどの発言があったかを把握できます。

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による日本語翻訳 #

文字起こし結果を日本語に翻訳します。文単位に分割してからモデルに入力することで、翻訳品質が向上します。

 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隻の船が新船のチャーターを開始し

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


分析のヒント #

  • 文字起こし結果に含まれる誤認識(例: “TURD”→“Third”, “Ernings”→“Earnings”)は、正規表現による後処理で修正できます。金融用語の置換辞書を用意しておくと効率的です。
  • 文字起こしテキストを感情分析パイプラインに接続すると、決算発表のトーン分析が自動化できます。
  • 長時間の動画はwhisper--language enオプションで言語を明示すると、認識精度が安定します。
  • GPU環境がない場合はtinybaseモデルを使い、処理時間を短縮します。