音声処理と認識|第8回

第8回:ニューラルASRモデル

Conformer / WhisperによるEnd-to-End認識

小野原彩香|北星学園大学

Zoom録画を後日公開します。課題はメール/Google Driveでも提出可。
小野原彩香 / 北星学園大学
音声処理と認識|第8回

本日の到達目標

  1. End-to-End モデルの概念と従来型との違いを説明できる
  2. CTC・Attention-based Encoder-Decoder の仕組みを理解する
  3. Conformer と Whisper のアーキテクチャ的特徴を説明できる
  4. OpenAI Whisper を使って実際に音声認識を行える
小野原彩香 / 北星学園大学
音声処理と認識|第8回

従来型とEnd-to-Endモデル

項目従来型(GMM-HMMなど)End-to-Endの代表例
構成音響モデル・発音辞書・言語モデルを統合入力から出力列を学ぶニューラルモデル
入力MFCCなどの特徴量波形やログメル特徴量など
出力複数モデルを用いてテキストを探索文字・サブワードなどの列
学習モデルごと・段階ごとの学習入力と出力列の対応から学ぶ
時間位置HMM内で推定する方法や強制アライメント文字ごとの正解時刻を事前に与えず学習できる
「アライメント不要」は、正解の文字に時間位置を付けなくてよいという意味。対応関係そのものがなくなるわけではない。
小野原彩香 / 北星学園大学
音声処理と認識|第8回

代表的なEnd-to-Endの学習・出力方式

音声とテキストのペアから、系列の認識を目的とした損失で学習する。

方式概要
CTC時間順序を保つ複数の対応経路をまとめる
Attention-based Encoder-Decoder(AED)出力履歴とエンコーダ出力から次のラベルを生成
RNN-T(Transducer)音響情報と出力履歴を組み合わせ、対応経路を扱う
ハイブリッド複数の学習目的・復号方式を組み合わせる

1つのモデルでも、特徴量抽出・エンコーダ・デコーダなど複数のモジュールを含む。外部言語モデルや辞書を併用する構成もある。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

CTC:時間位置を与えずに出力列を学ぶ

エンコーダ出力の時刻数T(例:300)と、正解ラベル数L(例:20)は一般に一致しない。

ブランク(_)を含む出力パスを、次の順で変換する。

  1. 隣り合う同じラベルをまとめる
  2. ブランクを除く
c c a a t t  →  c a t        →  cat
c _ a _ t _  →  c _ a _ t _  →  cat
a _ b _ _ b  →  a _ b _ b    →  abb
ブランクを挟んだ2つのbは、別のラベルとして残る。
ブランクは、無音を直接表す記号ではない。
小野原彩香 / 北星学園大学
音声処理と認識|第8回

CTC損失:同じ答えになるパスの確率を足す

𝓑:繰り返しの統合とブランク除去。𝓑−1(Y):正解Yになる全パス。

項目内容
計算正解長Lに対し、標準的な動的計画法はO(TL)
独立性入力Xを条件として、各時刻のラベル出力を独立に扱う
ストリーミング未来の参照を制限したエンコーダとの組合せが必要
復号最良の1パスと、パスの和が最大のラベル列は区別する

音声フレーム自体が独立という仮定ではない。Graves et al. (2006)

小野原彩香 / 北星学園大学
音声処理と認識|第8回

Attention-based Encoder-Decoder(AED)

エンコーダが音声の特徴列hを作り、デコーダが過去の出力ラベルとhを参照して次を生成する。

基本的な再帰型デコーダの式。sは前ステップの状態、αは参照の重み、cは文脈ベクトル。

  • 自己回帰の推論では、出力を順に生成する
  • Transformer型の学習では、正解の出力履歴を使って並列計算できる
  • 全音声を参照する構成をストリーミングで使うには、先読み範囲などの設計変更が必要
小野原彩香 / 北星学園大学
音声処理と認識|第8回

TransformerとSelf-Attentionの復習

RNNでは同じ層の状態を時刻順に更新する。Self-Attentionは位置間の関係を直接計算できる。

  • 各ヘッドでは、重みの和が1になる値ベクトルの加重平均
  • 学習時の並列化が可能。自己回帰推論は順次生成
  • 全位置を比較する計算量は、特徴次元を固定するとO(T²)
Conformerも大域的Self-Attentionを使う。
二乗の計算量を解消する方式ではなく、畳み込みで局所情報も扱う構造。

Vaswani et al. (2017)/Gulati et al. (2020)

小野原彩香 / 北星学園大学
音声処理と認識|第8回

Conformer:大域的な関係と局所的な構造

Conformerはエンコーダの構造。CTCやTransducerなどの出力方式と組み合わせる。

順序モジュール役割
1Feed-Forward位置ごとの変換。出力を1/2倍して残差へ加える
2Multi-Head Self-Attention大域的な関係
3Convolution近隣フレームのパターン
4Feed-Forwardもう一度、出力を1/2倍して残差へ加える
5LayerNormブロックの最後に正規化

Macaron形式の1/2は残差へ加える出力の係数。FFNの隠れ次元を半分にする意味ではない。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

Conformerの性能:外部言語モデルを区別する

Gulati et al. (2020), Table 2。Conformer Transducer、LibriSpeechのWER(%)。

モデルパラメータLMなし clean / otherLMあり clean / other
S10.3M2.7 / 6.32.1 / 5.0
M30.7M2.3 / 5.02.0 / 4.3
L118.8M2.1 / 4.31.9 / 3.9

clean / otherはtest-clean / test-other。LMは外部言語モデル。

  • 学習データ、モデルサイズ、復号条件、評価データを確認する
  • 言語モデルの有無を混ぜて、モデル構造だけの差と解釈しない
  • この表は指定された英語読み上げ音声の条件での結果
小野原彩香 / 北星学園大学
音声処理と認識|第8回

Whisper:弱教師あり学習による音声認識

Radford et al. (2022, OpenAI)。ここでは原論文と、実習の多言語版smallを中心に扱う。

  • Web上の音声とテキストの対応を使って学習
  • 文字起こし・英語への音声翻訳・言語識別を切り替える
  • 言語ごとの学習量と精度は異なる
2022年の原論文:合計680,000時間内訳(概算)
英語の文字起こし438,000時間
英語以外の文字起こし117,000時間
他言語の音声から英語への翻訳125,000時間

後発のモデルは学習データが異なる場合がある。版を区別する。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

Whisperのアーキテクチャ

TransformerのEncoder-Decoder。実習のsmallを例にする。

処理内容
音声の前処理16 kHz、最大30秒の窓 → 80チャネルのログメル特徴量
2層Conv + GELU時間方向を1/2に縮小
Transformerエンコーダ音声表現を計算
Transformerデコーダ過去の出力と音声表現から自己回帰生成
<|startoftranscript|>  # 開始
<|ja|>                 # 言語
<|transcribe|>          # 文字起こし
<|translate|>          # 英語へ翻訳
<|notimestamps|>       # 時刻を出さない場合

large-v3は128メルチャネル。80チャネルという説明を全モデルへ一般化しない。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

Whisperのモデルサイズ

モデルパラメータ数GPUメモリの概数
tiny39M約1 GB
base74M約1 GB
small244M約2 GB
medium769M約5 GB
large系1550M約10 GB
turbo809M約6 GB

公式READMEの概数。実際の速度とメモリ量は機器・設定・音声によって変わる。

実習はsmall。メモリ・待ち時間に応じてbaseやtinyへ変更できる。日本語では.enなしを使う。

turboは翻訳用には訓練されていないので、翻訳実習にはsmallを使う。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

Whisperの機能と、結果を確認する観点

機能・特性意味と確認点
ゼロショット評価対象データセットで追加学習せずに評価。未見の条件での精度保証ではない
多言語・多タスク文字起こし、英語への翻訳、言語識別
タイムスタンプ通常はセグメント単位。単語時刻はattentionとDTWによる追加推定
長い音声30秒窓を順次処理。既定では前の認識テキストも条件に使う
認識誤り雑音・沈黙での架空のテキスト、固有名詞などの誤りを確認

word_timestamps=Trueはlarge-v2以降だけの機能ではない。language="ja"は認識条件の指定で、正答を保証しない。

公式transcribe実装。自動言語検出は最初の最大30秒を使う。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

ASRフレームワーク・ライブラリの例

名前用途
ESPnetEnd-to-End音声処理のモデルと学習レシピ
SpeechBrainASR・TTS・話者処理などのPyTorchツール
KaldiGMM-HMMやDNN-HMMなどの音声認識
fairseqwav2vec 2.0・HuBERTなどの系列モデル
Hugging Face Transformers対応モデルを共通APIで利用するライブラリ
from transformers import pipeline
asr = pipeline("automatic-speech-recognition",
               model="openai/whisper-small", device="cpu")
result = asr("audio.wav", generate_kwargs={
    "language": "japanese", "task": "transcribe"})
print(result["text"])

短い日本語音声の例。transformers・PyTorch・FFmpegの導入が必要。次の実習はopenai-whisperを直接使う。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

実習:Whisperを使ってみよう(Step 1〜3)

1:Colabでインストール

%pip install -q openai-whisper jiwer
!apt-get -qq update
!apt-get -qq install -y ffmpeg

2:デバイスを確認

import whisper
import torch

device = "cuda" if torch.cuda.is_available() else "cpu"
print("使用デバイス:", device)

3:モデルをロード

model = whisper.load_model("small", device=device)
decode_options = {"fp16": device == "cuda"}

GPUの割り当ては環境による。CPUでも動くが時間がかかる場合がある。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

実習:音声ファイルの認識(Step 4)

from google.colab import files

# 短い音声ファイルを1つ選ぶ
uploaded = files.upload()
if not uploaded:
    raise ValueError("音声ファイルを1つ選んでください")
file_path = next(iter(uploaded))

result_file = model.transcribe(
    file_path, language="ja", task="transcribe", **decode_options)
print("認識結果:", result_file["text"])

# これはセグメント単位のタイムスタンプ
for segment in result_file["segments"]:
    start, end = segment["start"], segment["end"]
    print(f"[{start:.1f}s → {end:.1f}s] {segment['text']}")

language="ja"は日本語として認識する条件を指定する。ここで表示する時刻はセグメント単位。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

実習:マイク録音して認識(Step 5)

本文のStep 5にあるRECORD_JSとrecord_audio()の定義を先に実行する。

段階処理
録音eval_jsで録音完了のPromiseを待つ
形式の扱いMediaRecorderの実際のMIME形式で保存し、FFmpegでPCM WAVへ変換
終了成功・失敗のどちらでもマイクのtrackを停止
recorded_path = record_audio(sec=5)
result_mic = model.transcribe(
    recorded_path, language="ja", task="transcribe",
    **decode_options)
print("認識結果:", result_mic["text"])

録音データを最初からWAVと仮定しない。変換後は16 kHz・モノラル。

ブラウザ録音を利用できない場合は、端末で録音したファイルをStep 4でアップロードできる。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

実習:オプション比較とCER(Step 6〜7)

同じ音声で設定を比較

audio_path = file_path  # マイク音声なら recorded_path
result_ja = model.transcribe(
    audio_path, language="ja", task="transcribe", **decode_options)
result_auto = model.transcribe(
    audio_path, task="transcribe", **decode_options)
result_en = model.transcribe(
    audio_path, language="ja", task="translate", **decode_options)

日本語の文字起こしをCERで評価

from jiwer import cer
reference = "今日の天気はとても良くて気持ちがいい"
# 上の文を audio_path の実際の発話へ書き換える
hypothesis = result_ja["text"].strip()
cer_value = cer(reference.strip(), hypothesis)
print(f"CER: {cer_value:.1%}")

両端の空白だけを除き、句読点などは残す設定。全条件で同じ規則を使う。英語翻訳を日本語の正解文とのCERで評価しない。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

演習:Whisperの誤りパターン分析

条件例から用意できる2〜3条件を試す。速度・雑音の比較は、同じ文・話者・モデル・認識設定で行う。

条件正解文認識結果CER誤りの例
読み上げ………%…
速い発話………%…
雑音を加える………%…
自然な方言・アクセント………%…
専門用語………%…
  • 実際に話された内容を正解文にする
  • 置換・削除・挿入と、表記だけの違いを観察する
  • 今回の録音での結果を、方言や条件全体へ一般化しない

CERは挿入が多いと100%を超えることもある。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

課題の提出について

提出方法:Google Drive(または メール添付)
締め切り:翌週末 23:59

提出内容:

  • 誤りパターン分析表(条件別 CER と誤りの種類)
  • 考察(100〜200字程度)

任意追加:最も興味深い誤りパターンを1つ選んで、なぜその誤りが起きたかを推測して書く。

小野原彩香 / 北星学園大学
音声処理と認識|第8回

本日のまとめ

  1. End-to-End ASR:文字ごとの時間位置を事前に与えず、系列の損失で学習できる
  2. CTC:同じ正解になる対応パスの確率を足す
  3. AED:出力履歴と音声表現を使って自己回帰デコード
  4. Conformer:Self-Attentionと畳み込みを組み合わせたエンコーダ
  5. Whisper:原論文は680,000時間の弱教師あり学習。版・言語・評価条件を区別する
  6. 実習:認識設定と評価の前処理をそろえ、誤りの具体例を分析する
小野原彩香 / 北星学園大学
音声処理と認識|第8回

次回予告(第9回)

音声認識システムの評価指標(WER・CER・SLUE ベンチマーク)

  • WER・CER を数式に基づいて手計算する
  • 編集距離(Levenshtein 距離)との関係を理解する
  • SLUE ベンチマークによる意味理解の評価

第9回は動画回です。
Google Forms テストがあります。事前に今日の実習でやった CER の計算に慣れておきましょう。

小野原彩香 / 北星学園大学

本日は同期回。Zoomで参加していない学生は録画視聴で補完してもらう。実習コード(Colab)は後日メールでも共有する。

目標を冒頭で明示して、本日の流れを頭に入れてもらう。第7回(GMM-HMM, wav2vec 2.0)の続きとして位置づける。

第7回の構成に発音辞書も含めて対比する。「文字の時間位置を事前に与えない」と説明する。HMMも学習中に対応を推定できる。

それぞれの概念を次のスライドで詳しく説明する。まず大枠のイメージを掴んでもらう。

CTCの変換は隣接重複の統合が先、blank除去が後。a_b__bはabbになる。blankを無音と同一視しない。

数式は「すべての有効な変換経路の確率を足し合わせて最大化する」という直感を伝える。厳密な導出は省略してよい。

自己回帰デコーダは過去の出力ラベルを条件にする。推論の逐次生成と、teacher forcingを使うTransformer学習時の並列化を区別する。

全位置間のSelf-AttentionはO(T^2)。標準Conformerもこの計算を含み、二乗の計算量を解消する方式ではない。

Macaron形式の1/2はFFN出力を残差へ加える際の係数。隠れ次元を半分にする意味ではない。

Table 2のConformer Transducerの結果をLMあり/なしで分けて比較。MのLMありtest-otherは4.3%。Lの1.9/3.9も外部LMありの値。

2022年のWhisperはWeb上の音声・テキスト対応による弱教師あり学習。英語以外の文字起こし117,000時間、英語翻訳125,000時間。後発モデルと区別する。

smallでは80メルチャネル、large-v3では128。transcribeは30秒窓を順に処理し、既定では過去の認識テキストも条件として使う。

実習は多言語版smallを使用。GPUの有無と空きメモリ・待ち時間に応じてbaseやtinyを選べる。turboは翻訳実習には使わない。

実習での誤りパターン観察の観点として弱みを記憶しておいてもらう。

Transformersのpipelineは対応モデルを使う選択肢の一つ。主実習はopenai-whisper。別のツールで公開されたモデルがすべて同じAPIで動くわけではない。

ColabのGPU割当は保証されない。deviceを確認し、CPUではfp16=Falseとする。

表示しているのはセグメント時刻。単語時刻はword_timestamps=TrueによるattentionとDTWの追加推定で、large-v2以降だけの機能ではない。

本文の完全な録音コードを先に実行する。eval_jsが返すPromiseの完了を待ち、MediaRecorderのMIME形式を保持する。FFmpegで内容を判別してWAVに変換し、finallyでマイクを停止する。

同じ音声・正解文で比較する。jiwer.cerは文字編集距離を正解長で割る。句読点・空白などの前処理規則を全条件でそろえ、英語翻訳を日本語CERで評価しない。

全条件をやりきれなくてもOK。2〜3条件の分析でも十分な考察ができる。完成した分析表はGoogle Driveに提出(翌週末23:59)。