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

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

概要

  • 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)。もし対応してたとしても、俺のトーンがちょっとずれてるかも。でも、すごく面白いアイデアだよ!

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

欧州の言語を母国語とする人で、中国語や他のトーン言語を学ぼうとしたことがない人には、どれだけ難しいか理解するのが本当に難しいよ。トーンはすごく微妙で、耳がそれに慣れてないから、正しく言ってるつもりでも、ネイティブスピーカーには全然通じないことが多いんだ。

私はロシア語が母国語で、マンダリンを学ぶことにしたんだけど、ロシア語とは言語的にほぼ真逆なんだ。トーンの発音には問題なかったけど、トーンの認識は本当に難しかった。速いスピーチを聞くとよく迷子になるけど、ニュースなどの正式なスピーチは大体問題なくついていけるよ。

それはめっちゃ重要だよ。正しいトーンで発音しないと、言葉があいまいになっちゃうからね。

トーンやピッチのある言語で育ってない人にとって、これを学ぶのは本当にイライラするよね。こういうツールを作って、プロセスを楽にしようとする人には拍手を送りたい。日本語のピッチアクセントを学んだ経験は目から鱗だったよ。最初は全然違いが聞き取れなかったし、クイズではランダムに答えたのと同じくらいの点数だった。最初に役立ったのは、自分の母国語(英語)にピッチ情報を使うものがあることに気づいたこと。例えば、「あーあ」は高低のピッチがあるよね。間違って言うとすごく変に聞こえる。「うんうん」は理解を示すために低から高に上がる。これも逆にすると変な感じになる。次はミニマルペアの練習をたくさんしたこと。毎回、どこでピッチが変わるかを聞いて一生懸命考えた。これにはかなりの時間がかかった。毎日何時間も練習するのが、10分を定期的にやるよりも効果的だった気がする。正しく聞こうとするけど、あまり無理しない方がいいよ。理解しようと頑張っても運がなかったな。新しい色を見ようとするのに似てる。あまり意識的な思考はないんだ。最後のピースは、個々の単語ではなく、ピッチが変わるフレーズを学ぶことだった。例えば、「ゆでたまご」はゆで卵か、孫を指すこともある。どういうわけか、単語よりも複数の単語のフレーズの方が脳がつかみやすかった。かき(柿)とかき(牡蠣)を何度も聞くのはすごく難しかった。もちろん、これらのテクニックは人それぞれだからね。俺はこれを始めたときには、そこそこ日本語が話せたんだ。

心から(あるいはちょっと悲しい気持ちで?)同意するよ。時々、すごくシンプルなことを言おうとすると、みんなが火星語を話してるみたいにじっと見てくる。まあ、そうかもしれないけど!俺の大きな問題の一つは、不確かさを表現するためのトーンの暗黙の使い方だね。それを直すのは本当に難しい習慣なんだ。

同意する。ほんとに難しいよね。これが、中国で生まれた人たちが英語やドイツ語を話すときに発音ミスをしがちな理由でもあると思う。彼らは俺たち西洋人とは違うことに焦点を当ててるから。トーンを模倣することが中国語でどれほど重要かを理解するのに、すごく時間がかかったよ。

トーンって、みんなが言うほど難しくないよ。どんな言語を学ぶにしても、90%は単語を大量に覚えることだからね。トーンや文法は最初に学ぶ基本的な部分だし。初心者はそれに文句言うけど、中国語を数ヶ月勉強すれば、トーンにはかなり慣れるはず。そしたら、あとは何年も単語を覚えることになる。中国語が難しい理由は2つあって、1つ目はインド・ヨーロッパ語族との共通の語彙が少ないこと(もちろん、母国語が中国語と共通の語彙が多い言語なら当てはまらないけど)。2つ目は、書き方が音声的じゃないから、まるで新しい言語を学ぶのと同じくらいの努力が必要になること(話す中国語を超えて)。文法の問題(格変化や活用みたいな)も、インド・ヨーロッパ語を学ぶときにみんなが文句言うことと同じだよ。これらは最初に学ぶ基本的な部分だから。実際の努力の大半は単語を覚えることにあるんだ。

まあ、単語ごとに話すときだけうまくいくんだ。普通の会話のスピードでは無理だね。モデルは、カジュアルに話すときにミスをしてると思ってるみたい(母国語が中国語の俺は、教師や高い精度が求められる職業に必要な普通話2Aの資格を持ってる)。実際には気づかないかもしれないけど、言語の発音はカジュアルとフォーマルで全然違うんだよね…。

ピンインモードがあったらいいな…!今、普通話を話す練習してるけど、読むことや書くことは学んでないんだ。自分で作ったフラッシュカードのウェブアプリを使って、出会ったり必要な単語を更新してるよ: https://memalign.github.io/m/mandarin/cards/index.html

同じく!でも、最初に間違えると、ピンインを教えてくれるんだよね。でも、自分が発音してる子音を文字に起こすのが難しかったし、トーンなんてなおさら。自分はそんなにひどくないと思うんだけど!

ピンインに+1!

すごくいいけど、他の人のフィードバックに頼りすぎない方がいいよ。発音の間違いがはっきり聞こえないなら、耳を鍛えることにもっとエネルギーを注いだ方がいい。大人の言語学習者は、音素認識を担当する脳の部分が変わりにくくなってるけど、全く変わらないわけじゃない。神経可塑性はまだあるけど、問題をはっきりさせるための集中した練習が必要なんだ。例えば、最小対の認識ドリルは始めるのにいい場所だよ。楽しい作業ではないけど、やる価値はある。外部からのフィードバックよりも発音練習のフィードバックループをもっと強化できるから、より良いアクセントが得られるのが一番のメリットだよ。それだけじゃなくて、リスニング理解にも大きな違いが出る。そうすれば、もっと面白い学習素材に早くアクセスできるようになるし、楽しさが増して、学習時間も増えるはず。さらに、正確で自動的な音素認識ができるようになると、他の入力素材の処理に使える神経資源が増えるから、語彙や文法の習得も早くなるかもしれないね。

これには完全に同意する!知らない単語を聞いても、どのピンインを辞書アプリに入力すればいいか分かると自信がつくよね。以前、Mandarin BlueprintのYouTubeにあるピンイン発音の動画を見て、それから台湾で数週間の没入体験をしたら、みんなが何を言ってるか本当にわかるようになった。リスニングがスピーキングの鍵だと思う。各単語のトーンを丸暗記する必要はないよ。聞こえた通りに言えばいいんだ。

自分は言語学習アプリを作ってるんだけど [https://phrasing.app]、これは本当に良いアドバイスだね。アプリにはSSTに対する興味が全くなくて、統合する予定もないんだ。自分の経験では、言語学習の過程で本当に役立つことは見たことがない。すごく役立ったのは、音声を聞くたびにテキストと音声が強制的に整列されてハイライトされるカラオケスタイルだった。これで音素認識が驚くほど改善されたよ。何人かのユーザーも同じことを報告していて、ネイティブの話し方がただの音の塊じゃなくて、別々の単語のように感じるって。これは主にカラオケスタイルの音声のおかげだと思う。音声表記に対しては、ピンインや粤拼、ふりがなを使うのがいいと思う。制作の時、Regina Coeli(世界的な語学学校)にいた時は、彼らのメインのやり方は、1. オランダ語の短い文章を聞く(10〜40語) 2. 同じ文章を自分で読み上げる 3. その2つの音声トラックを重ねて、違いを聞く。オプションのステップ4. 近くなるまで再録音して再生。採点もなければ、先生が録音をチェックすることもないし、正解も不正解もない。ただ無数のランダムな文とそれを重ねるシンプルなアプリがあるだけ。自分で違いを聞き取れるようになって、実験していく必要があったんだ。(ちなみに、これはphrasingにはないけど、関連性があると思った。いつか追加したいな!)

すごくいいね、シェアしてくれてありがとう!一つ気になったことがあるんだけど、「我想学中文」のフレーズで「wén」を「guó」と識別されたんだ。自分の発音は完璧じゃないけど、言ったことが「guó」に近いわけがない。「wén」に近いはずだよ。これは、モデルがトーンじゃなくて単語の構造を学習したことを示してると思う。「Zhōng guó」はトレーニングデータにたくさん出てくるから、モデルがそれを認識するバイアスがあるんだ。- 編集 - ブログ記事から: > 「トーンが間違っている場合、モデルには自分が何を言ったかを推測してほしくない。実際に自分が言ったことを教えてほしい。」君のアーキテクチャも、実際に自分が言ったことを教えてくれない。君が言ったことを、許可した1254音節の中で最も可能性の高いものにマッピングするだけなんだ。例えば、「wo」の代わりに「wi」や「wr」と言ったことを教えてくれないのは、その音節が設定に存在しないからだよ。

いいね!中国語は得意じゃないけど、トーンや単語を認識させるためにはゆっくり話さないといけないんだ。トレーニングデータはどれくらい速いんだろう。