世界を動かす技術を、日本語で。

Show HN: 9百万の音声モデルを訓練して、私の中国語の声調を修正しました

2026年1月31日原文(simedw.com)

概要

  • Mandarinの発音矯正 のため、約300時間の音声データで Conformer-CTCモデル を自作・訓練
  • ブラウザ上で動作、1音節ごとに発音と声調を厳密採点
  • Pinyin+声調 をトークン化、音声認識よりも発音重視
  • モデル圧縮・量子化 で11MBに、即時ロード可能
  • ライブデモ を公開、今後は会話データ追加を検討

Mandarin発音矯正支援AIの開発記録

  • Mandarinの発音 が難しく、 自分の間違い も聞き取れない課題
  • Langseed で語彙力は伸びたが、 発話理解 は依然困難
  • 声調 の習得が特に課題、 教師不在 でフィードバック不足

初期アプローチ:ピッチ可視化

  • 音声を分割・FFT解析 し、 ピッチ変化 を可視化するツールを試作
  • 背景ノイズ・連音・話者差 などで、手作業チューニングが破綻
  • 大量データと計算資源 があれば、 機械学習 が手法を凌駕する事実

最終アプローチ:ディープラーニングCAPT

  • 商用API も存在するが、 自作 で技術習得と楽しさを優先
  • ASR(自動音声認識) の枠組みで、 Conformerエンコーダ+CTC損失 を採用

Conformer選択理由

  • 局所特徴(zh/z等) はCNNで、 グローバル特徴(声調・文脈依存) はTransformerで抽出
  • Conformer は両者を組み合わせ、 発音細部と全体構造 を同時把握

CTC選択理由

  • 通常ASR は「意味重視」で自動補正するが、 発音矯正 では「実際の発音」重視
  • CTC は40msごとに 発音確率分布 を出力し、 フレーム単位 で評価
  • <blank>トークンアライメント を管理し、 Viterbiアルゴリズム で最適経路を探索

トークン設計:Pinyin+声調

  • 漢字出力 は発音ミスを隠すため、 Pinyin+声調 を1トークン化
    • 例: zhong1zhong4 は別トークン
  • 声調5(軽声) も明示的に採用、 全1,254トークン+<unk>/<blank>

データ・訓練

  • AISHELL-1/Primewords (計約300時間)+ SpecAugment で拡張
  • RTX 4090×4 で8時間訓練
  • 重視指標 :TER(Token Error Rate)、Tone Accuracy、混同ペア(zh/ch/sh等)

モデル圧縮

  • 75M→35M→9Mパラメータ まで縮小、精度ほぼ維持
    • 例:9Mモデルで TER 5.27%、Tone 98.29%
  • FP32で37MB→INT8量子化で11MB、精度低下ほぼなし
  • onnxruntime-web で即時ロード・ブラウザ動作

アライメント課題と修正

  • 先頭無音区間 でアライメント誤判定、 無音フレーム がスコアを下げる問題
  • UIハイライトスコア計算 を分離、 無音フレーム除外 で正しい信頼度に
  • 1行の修正 で、信頼度0.0→0.99に改善

実用・今後

  • 厳格なフィードバック で発音向上を実感
  • 母語話者・子供 は認識率が下がる傾向(訓練データのドメイン差・ピッチ差)
  • 会話音声データ(Common Voice等) 追加が今後の課題
  • デモ公開中 (約13MB)、 完全ブラウザ動作

付記:技術仕様と公開デモ

  • 9MパラメータConformer-CTCモデル
  • AISHELL+Primewords 約300時間で訓練、 INT8量子化で11MB
  • onnxruntime-web で100%ブラウザ実行
  • Viterbi強制アライメント で1音節ごとに発音・声調採点
  • デモはこちらhttps://simedw.com/projects/ear/

Hackerたちの意見

台湾に住んでいたとき、トーンをはっきり発音するのを思い出すために、自分の手を前に振って、各文字のトーンの弧をなぞるようにしてたんだ。見た目はちょっと変な外国人オーケストラ指揮者みたいだったけど、すごく役立ったよ。もう一つ言うと、中国本土の地域アクセントによってトーンの発音が結構変わることもあるから、ネイティブスピーカーに基準を教えてもらうのもいいかもね。

アクセントについては、今のところ友達といくつか試してみたんだけど、地域をパラメーターにした方がいいのかなって思ってる。全ての方言でトレーニングすると、システムがちょっと緩くなっちゃうかもしれないし。

大学のマンダリンのクラスで、ある成人学生(多分40歳くらい)がトーンをめちゃくちゃ誇張してて、先生が彼の答えに大笑いしたことがあったんだ。数年後、彼はクラスの中で一番きれいで一貫した発音をしていて、北京アクセントと他のアクセントを簡単に切り替えてた。彼を真似しなかったことをちょっと後悔してるけど、20年近く使ってないし、ほとんど忘れちゃったんだよね。

これはソルフェージュのトレーニングみたいだね。特定のトーンを示すために手のジェスチャーを使うんだ:ド・レ・ミ・ファ・ソ・ラ・ティ。

手の動きが助けになるよ!特に新しい単語を覚えたいときは、トーンを覚えるための追加の要素として扱う必要があるからね。俺はシンプルな人差し指の動きでトーンを示してた。

マイク老師が好きになるよ!: https://youtu.be/cna89A2KAU4?si=SQEZ_0ooO1z119_k

すごいね!20年くらい前に中国語をカジュアルに学んでたとき、先生がWindowsのソフトを使って、私の発音の形を図に描いてくれたんだ。それで、どこが間違ってるかを客観的に示してくれたの。君が作ったものは本当に素晴らしいし、マンダリンを学んでたときにあったらよかったな。いくつかの文で試してみたけど、どのトーンが間違ってるかをうまく特定してくれたよ。

あなたが思ってるのはPraatのことだと思うけど、今でもあるよ。20年前と同じUIだし。

長いこと見てるだけだったけど、中級者としてフィードバックをするためにアカウントを作ったよ。:) これは素晴らしい取り組みで、もっと色々出てくることを期待してる。批判するつもりはないけど、ユーザー体験を共有したいと思ってる。要するに、私の経験はネイティブスピーカーの意見と一致してる。早口で話すと音素を追えなくなっちゃうし、普通の会話速度で話すとトーンが合わないことがある。例えば、「他是我的朋友」を普通の会話速度で言うと、私の「我」に de が割り当てられたり、shi のレトロフレックスが抜けて si になったりすることがある。録音を聞き返してみたけど、音素はちゃんと言ってるのに、UIには間違った音素とトーンが表示されてる。逆に、ゆっくり話して各トーンをしっかり押すと、音素とトーンは正しく認識されるよ。それと、トーンの変化も考慮されてるのかな?例えば、第三声(底上げトーン)は連続して話すと第二声(上昇トーン)に混ざっちゃうことがあるし、第一声が次のトーンに少し影響を与えることもある。改めて素晴らしい取り組みだけど、会話の中で自然に話されるスピーチや、ちょっと舌が回らないようなスピーチにも対応できる方法が必要だと思う。

同じ問題を抱えてた!もしかしたら、別のダパンツィが問題かもね(笑)

トーンの変換には対応してないと思う(例えば、他是 ni3shi4 -> ni2shi4)。もし対応してたとしても、俺のトーンがちょっとずれてるかも。でも、すごく面白いアイデアだよ!

このツールはトーンの変化にもっと対応する必要があるね。言語の話し方の大事な部分だから。そうじゃないと、初学者が孤立して話す時にはあまり役に立たないと思う。この分野での改善を期待してるよ。

Hacker Newsで議論の続きを見る