1 ポイント 投稿者 GN⁺ 2026-02-01 | 1件のコメント | WhatsAppで共有
  • 中国語の発音と声調の練習を支援するため、約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つのトークンとして定義
    • 例: zhong1zhong4は別々のトークン
    • 軽声はtone 5(ma5)に統一
    • 合計1,254個のトークン + , で構成
  • Viterbiアルゴリズムで音声フレームとトークン間の最適経路を計算
    • 例: 「Nǐ hǎo」の発音時にni3hao3の区間を区別

モデル軽量化と性能

  • 初期の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件のコメント

 
GN⁺ 2026-02-01
Hacker Newsのコメント
  • 本当に素晴らしいプロジェクトに感謝。
    ただし「我想学中文」という文で 「wén」を「guó」と認識した点は不思議だった。
    これはモデルが 声調よりも単語構造 を学習した結果のように見える。「Zhōng guó」が学習データに多く出てきたため、そのようなバイアスが生じたのだろう。
    ブログ記事で述べられていたように、「自分が実際に発音したものを教えてくれるモデル」ではなく、可能な1254個の音節の中で最も近いものに マッピング する構造に見える。

    • 「guó」を何度も繰り返してみたが、繰り返しとして認識されなかった。
      それでも、このような 音声中心の学習アプローチ は気に入っている。文字ベースの学習は国ごとに表記法が異なって混乱しやすい。初心者にとっては pinyin ですら紛らわしい記号が多い。
  • アイデアとUIが直感的で印象的だった。
    しかし北京出身で 標準中国語を完璧に話せる 自分ですら、簡単な設問を通過するのが難しかった。
    例の「你好吃饭了吗」では声調認識が誤っており、「了」は文脈上「liǎo」ではなく「le」であるべきだ。
    声調を心配する意見が多いが、実際には声調が完璧でなくても意思疎通に大きな問題はない。
    地域ごとに抑揚が異なるため、声調が多少混ざってもみんな十分理解できる。声調にこだわりすぎず、文脈中心の学習 を勧めたい。

    • 母語話者として反論すると、声調は非常に重要 だ。
      地域方言が違っても人々が意思疎通できる理由は、1) 隣接地域間では声調差がそれほど大きくなく、2) 通じないときは 標準語(普通話) に切り替えるからだ。
      中国語が成り立っている理由そのものが声調体系のおかげだ。声調を間違えると意思疎通はほぼ不可能になる。
    • 台湾でC1レベルまで学んだ立場からすると、声調は初期には重要だが、表現力が増すほど文脈が補ってくれる
      ただし中国語圏で文字中心に意思疎通する理由の一つは、地域ごとに発音や声調が異なり、音声だけでは通じないため でもある。
    • 母語話者同士なら声調パターンが異なっていても文法や抑揚が予測できるので理解できるが、学習者はそうではない。
      声調を無視するよう動機づけるのは危険だ。声調が本当に重要でなかったなら、すでに消えていたはずだ。
    • 「了」の問題は JavaScriptのバグ で、修正済み。残りはより多様なデータセットで改善できる。
    • 声調が重要でないと言っても、「熊猫(xióngmāo)」と「胸毛(xiōngmáo)」のように 声調差で全く異なる意味 になる例は多い。
      文脈が狭いと混乱が起きるので、声調は依然として重要だ。また「吃」を「shi2」と認識するなど、データ補強も必要だ。
  • 中級学習者としてフィードバックを残すためにアカウントを新しく作った。
    速く話すと 音素追跡がうまくいかず、声調認識がずれる
    たとえば「他是我的朋友」を自然な速度で話すと、「我」を「de」と認識したり、「是」を「si」と処理したりする。
    ゆっくりはっきり話せば正確に認識する。
    連続する第3声の変化(声調変化) のような現象も考慮すべきだ。自然な会話中の発音を扱える機能が必要だ。

    • 声調変化は中国語発音の核心だ。現状は初級者向けレベルなので改善が必要。
    • フィードバックのおかげで sandhi(声調変化) 対応を追加した。うまく動くか知らせてほしいとのこと。
    • 自分も声調変化が処理されていないように感じた。それでもアイデアは本当に素晴らしい。
    • 自分も同じ問題を経験した。もしかして「大胖子(dapangzi)」だからかな、と冗談を言った。
  • ヨーロッパ系言語の話者にとって、中国語や他の 声調言語を学ぶのは非常に難しい
    耳が声調に慣れていないので、自分では正しく話しているつもりでも、母語話者には通じない。

    • 中国語母語話者としては、英語の 母音体系 のほうがはるかに難しいと感じる。
      英語は地域ごとに母音が変化し、「done vs down」「beat vs bit」のような違いを区別しづらい。
      一方でスペイン語は母音が単純で、ずっと学びやすかった。
    • だから中国人が英語やドイツ語の発音でミスする理由も理解できる。注意の焦点が違うから だ。
    • 声調やピッチに慣れていない人には狂いそうなくらい難しいが、このようなツールはその過程を少し楽にしてくれる。
      日本語の ピッチアクセント を学んだときも、最初はまったく違いが分からなかったが、反復練習で徐々に聞き取れるようになった。
      「uh-oh」のように英語にもピッチパターンがあると気づいてから感覚がつかめた。
    • ときどき簡単な文を言っても相手に通じないことが多い。
      特に英語風の抑揚で 不確実さを表そうとする癖 が問題になる。
    • しかし声調はそこまで難しくない。本当に難しいのは 語彙量 だ。
      声調と文法は初期に身につける基礎で、その後の数年間は単語の暗記に努力の大半が注がれる。
      中国語の本当の難しさは 共有語彙の少なさ非音素的な文字体系 にある。
  • 単語単位で話すときだけうまく動き、文単位や自然な速度では 誤認識が多い
    自分は 標準語2A資格 を持つ母語話者だが、それでもくだけて話すとエラーが出る。
    日常会話と公式な発音の違いをモデルが区別できていない。

  • 台湾で勉強していたとき、声調を覚えるために 手で声調の曲線を描きながら練習 していた。
    狂った外国人のように見えたが、効果は確かだった。
    地域アクセント差も大きいので、基準データを母語話者ごとに収集 するとよいと思う。

    • 自分の授業でも、ある学生が声調を大げさに発音していたが、後には 最も正確な発音 を身につけた。
      あのとき真似しなかったのを後悔している。
    • Mike LaoshiのYouTube講義 を勧める。
    • 自分も数人の友人だけでテストしたが、地域をパラメータとして設定 するべきか悩んでいる。すべての方言を学習させると甘すぎる判定になるかもしれない。
    • これはまるで ソルフェージュ訓練 のように、手の動きで音高を表す方法に似ている。
    • 手の動きは特に新しい単語を覚えるときに役立つ。指で声調を示すと記憶に残りやすい。
  • 母語話者なのにデモが自分の発音を認識しなかった。
    おそらく 背景ノイズ のせいだと思う。横で娘がアニメを見ていた。

    • 現在は背景ノイズに敏感だが、データ拡張で改善したバージョン を訓練中とのこと。
  • 本当に素晴らしいプロジェクトだが、外部フィードバックに過度に依存しないほうがよい と助言したい。
    発音矯正の核心は 耳の訓練 だ。成人学習者にも神経可塑性は残っているので、ミニマルペアの聴き分け訓練などで耳を鍛えるべきだ。
    そうすれば発音だけでなく、リスニング力や語彙習得の速度 も大きく向上する。

    • 自分は Phrasing.app を開発中だが、この助言には全面的に同意する。
      SSTより テキストと音声の同期(カラオケスタイル) のほうがはるかに効果的だった。
      ユーザーが自分の音声を元音声と重ねて聞き、違いを自分で認識する方式は学習に非常に役立った。
    • 自分も同じ考えだ。聞くことこそ話すことの核心だ。
      単語ごとの声調を覚えるより、母語話者の発音をそのまま模倣 するほうがずっと自然だ。
  • ONNX Runtime Web でブラウザ内ですべて動作する点が印象的だった。
    強制アライメント方式で意味推測を排除し、声調の問題だけを切り分けた アプローチが賢い。
    今後のバージョンでは 声調変化(sandhi) を後処理段階に追加すれば、会話速度の練習にさらに有用になるだろう。

  • pinyinモード があるとよいと思う。自分は話すことだけを学んでおり、文字の読みは学んでいない。
    自分が作った フラッシュカードWebアプリ で語彙を整理している。

    • 良い提案なので pinyinトグル機能 を追加したとのこと。
    • 自分も同じ意見だ。ただ子音認識がうまくいかず、少しもどかしかった。そこまでひどい発音ではないはずなのに。
    • pinyinモードに一票。