- 中国語の発音と声調の練習を支援するため、約300時間の音声データで学習した9MパラメータのCTCベース音声モデルを自作
- Conformerエンコーダ構造を用い、局所的な音声特徴と大域的な文脈の両方を捉え、Pinyin+声調単位のトークン化で発音誤りを明確に区別
- CTC損失により、ユーザーが実際に発音した内容をフレーム単位で評価し、Viterbiアルゴリズムで時間アラインメントを実行
- モデルサイズを75M→9Mに縮小しても精度低下はほとんどなく、INT8量子化後は約11MBとなり、Webブラウザ上でも即時実行可能
- ブラウザベースのデモは、オンデバイス発音矯正システムの可能性を示しており、データ品質の改善が今後の性能向上の鍵
発音評価モデルの概要
- 中国語の発音学習の難しさを解決するため、発音を採点する小型音声モデルを自ら学習
- 約300時間の書き起こし付き音声データ(AISHELL-1、Primewords)を使用
- ブラウザで直接実行できる形で提供
- 従来のピッチ可視化方式はノイズや発話差異などにより不安定であり、データ駆動型アプローチの方が有効であることを確認
- 目標は、商用APIなしで**オンデバイス Computer-Assisted Pronunciation Training (CAPT)**システムを実装すること
モデル構造と学習方式
- Conformerエンコーダ + CTC損失構造を採用
- CNNが短時間帯の音響特徴(例: zh vs z)を捉える
- Transformerが文脈的な声調パターン(例: tone sandhi)を処理
- CTC方式はフレームごとの確率分布を出力し、実際に発音された音素を直接評価
- `` トークンを用いて繰り返しと空白をアライン
- 自動補正なしで、実際に発音された内容をそのまま反映
トークン化とアラインメント
- Pinyin+声調の組み合わせを1つのトークンとして定義
- 例:
zhong1とzhong4は別々のトークン
- 軽声はtone 5(
ma5)に統一
- 合計1,254個のトークン +
, で構成
- Viterbiアルゴリズムで音声フレームとトークン間の最適経路を計算
- 例: 「Nǐ hǎo」の発音時に
ni3とhao3の区間を区別
モデル軽量化と性能
- 初期の75Mパラメータモデルから9Mまで縮小
- 75M: TER 4.83%, Tone Accuracy 98.47%
- 9M: TER 5.27%, Tone Accuracy 98.29%
- 精度低下がごく小さいことから、データ依存型(data-bound) の課題であることを示唆
- FP32モデル(37MB)をINT8量子化で11MBまで縮小
onnxruntime-webによりブラウザで即時ロード可能
アラインメント誤りと修正
- 無音区間が発音評価を歪める問題が発生
- 例: 「我喜欢…」の発音前の1秒の静寂が
wo3に誤ってアラインされ、0点扱いになる
- 解決策: 無音フレームをスコア計算から除外
- `` 確率が0.7以上のフレームをフィルタリング
- 修正後、最初の音節の信頼度スコアが0.0 → 0.99に改善
結果と限界
- ベータテスト中に発音矯正効果を実感
- ネイティブ話者と子どもの音声では精度が低下
- AISHELLデータが主に朗読音声のため、速度やイントネーションに差がある
- 今後はCommon Voiceなどの会話音声データの追加が必要
- Webデモは約13MBで、大半のWebサイトより軽量なサイズで完全な発音矯正機能を提供
1件のコメント
Hacker Newsのコメント
本当に素晴らしいプロジェクトに感謝。
ただし「我想学中文」という文で 「wén」を「guó」と認識した点は不思議だった。
これはモデルが 声調よりも単語構造 を学習した結果のように見える。「Zhōng guó」が学習データに多く出てきたため、そのようなバイアスが生じたのだろう。
ブログ記事で述べられていたように、「自分が実際に発音したものを教えてくれるモデル」ではなく、可能な1254個の音節の中で最も近いものに マッピング する構造に見える。
それでも、このような 音声中心の学習アプローチ は気に入っている。文字ベースの学習は国ごとに表記法が異なって混乱しやすい。初心者にとっては pinyin ですら紛らわしい記号が多い。
アイデアとUIが直感的で印象的だった。
しかし北京出身で 標準中国語を完璧に話せる 自分ですら、簡単な設問を通過するのが難しかった。
例の「你好吃饭了吗」では声調認識が誤っており、「了」は文脈上「liǎo」ではなく「le」であるべきだ。
声調を心配する意見が多いが、実際には声調が完璧でなくても意思疎通に大きな問題はない。
地域ごとに抑揚が異なるため、声調が多少混ざってもみんな十分理解できる。声調にこだわりすぎず、文脈中心の学習 を勧めたい。
地域方言が違っても人々が意思疎通できる理由は、1) 隣接地域間では声調差がそれほど大きくなく、2) 通じないときは 標準語(普通話) に切り替えるからだ。
中国語が成り立っている理由そのものが声調体系のおかげだ。声調を間違えると意思疎通はほぼ不可能になる。
ただし中国語圏で文字中心に意思疎通する理由の一つは、地域ごとに発音や声調が異なり、音声だけでは通じないため でもある。
声調を無視するよう動機づけるのは危険だ。声調が本当に重要でなかったなら、すでに消えていたはずだ。
文脈が狭いと混乱が起きるので、声調は依然として重要だ。また「吃」を「shi2」と認識するなど、データ補強も必要だ。
中級学習者としてフィードバックを残すためにアカウントを新しく作った。
速く話すと 音素追跡がうまくいかず、声調認識がずれる。
たとえば「他是我的朋友」を自然な速度で話すと、「我」を「de」と認識したり、「是」を「si」と処理したりする。
ゆっくりはっきり話せば正確に認識する。
連続する第3声の変化(声調変化) のような現象も考慮すべきだ。自然な会話中の発音を扱える機能が必要だ。
ヨーロッパ系言語の話者にとって、中国語や他の 声調言語を学ぶのは非常に難しい。
耳が声調に慣れていないので、自分では正しく話しているつもりでも、母語話者には通じない。
英語は地域ごとに母音が変化し、「done vs down」「beat vs bit」のような違いを区別しづらい。
一方でスペイン語は母音が単純で、ずっと学びやすかった。
日本語の ピッチアクセント を学んだときも、最初はまったく違いが分からなかったが、反復練習で徐々に聞き取れるようになった。
「uh-oh」のように英語にもピッチパターンがあると気づいてから感覚がつかめた。
特に英語風の抑揚で 不確実さを表そうとする癖 が問題になる。
声調と文法は初期に身につける基礎で、その後の数年間は単語の暗記に努力の大半が注がれる。
中国語の本当の難しさは 共有語彙の少なさ と 非音素的な文字体系 にある。
単語単位で話すときだけうまく動き、文単位や自然な速度では 誤認識が多い。
自分は 標準語2A資格 を持つ母語話者だが、それでもくだけて話すとエラーが出る。
日常会話と公式な発音の違いをモデルが区別できていない。
台湾で勉強していたとき、声調を覚えるために 手で声調の曲線を描きながら練習 していた。
狂った外国人のように見えたが、効果は確かだった。
地域アクセント差も大きいので、基準データを母語話者ごとに収集 するとよいと思う。
あのとき真似しなかったのを後悔している。
母語話者なのにデモが自分の発音を認識しなかった。
おそらく 背景ノイズ のせいだと思う。横で娘がアニメを見ていた。
本当に素晴らしいプロジェクトだが、外部フィードバックに過度に依存しないほうがよい と助言したい。
発音矯正の核心は 耳の訓練 だ。成人学習者にも神経可塑性は残っているので、ミニマルペアの聴き分け訓練などで耳を鍛えるべきだ。
そうすれば発音だけでなく、リスニング力や語彙習得の速度 も大きく向上する。
SSTより テキストと音声の同期(カラオケスタイル) のほうがはるかに効果的だった。
ユーザーが自分の音声を元音声と重ねて聞き、違いを自分で認識する方式は学習に非常に役立った。
単語ごとの声調を覚えるより、母語話者の発音をそのまま模倣 するほうがずっと自然だ。
ONNX Runtime Web でブラウザ内ですべて動作する点が印象的だった。
強制アライメント方式で意味推測を排除し、声調の問題だけを切り分けた アプローチが賢い。
今後のバージョンでは 声調変化(sandhi) を後処理段階に追加すれば、会話速度の練習にさらに有用になるだろう。
pinyinモード があるとよいと思う。自分は話すことだけを学んでおり、文字の読みは学んでいない。
自分が作った フラッシュカードWebアプリ で語彙を整理している。