YomiScript LLM と音声合成エンジンを分離する、新しい共通インターフェース

文章を書いた LLM が読み方まで YomiScript で書き、軽量なエンジンがその通りに話します。エンジンは読みを推測しないので、ブラウザーの中だけでも動きます。

聞き比べる

同じ文を、元の Kokoro と YomiScript で聞いてください。「生物」「市」の読みが変わります。

YomiScript の音声は、録音ではありません。ボタンを押すたびに、このブラウザーの中で生成しています(サーバーには送りません)。元の Kokoro の音声は、比較のために事前に録音したものです。
モデルを読み込んでいます…
ほかの文も聞き比べる

数字で見る

読みの正解率(読み分けの難しい62文、音声から自動判定)

同形異音語、略語、数字、日付を集めたテストで、すべて同じ判定モデルが音声から読みを判定した結果です(2026年10月31日)。各社の TTS は文字をそのまま渡して声を1種類で3回ずつ、YomiScript は Kokoro で1回です。 判定モデルの確認は Kokoro の音声でのみ行っていて(一致率 93.2%)、各社の音声の判定は人の耳では確認していません。正解の読みは暫定で、日本語一般の正解率でも、声の自然さの評価でもありません。 Gemini との差は小さく、Codex との差は誤差の範囲を出ません。音声でなく LLM が書いた読みそのものを70文で採点すると、Claude は 98.6%、Codex は 100% でした(eval/tts_readings、eval/browser_tts)。

約160 MBブラウザーで動く Kokoro の語り手のモデル
サーバー不要音声の生成はブラウザーの中だけで完結
API キー不要外部 TTS を呼ぶための API キーも要りません

仕組み

  1. 読み手(Yomite) 文章を書いた LLM が、その文脈で読みを決めます。 一日から三日まで休みです。
  2. YomiScript 発音(IPA)と元の文字を書いた、エンジンに依存しない形式です。 ja /tsɯitatɕi<t:一日> kaɾa<t:から> mikka<t:三日> made<t:まで> jasɯmi<t:休み> desɯ<t:です。> ↘/
  3. 語り手(Katarite) 読みを推測せず、書かれた通りに音声にします。文章の解析が要らないので軽量です。 Kokoro-82M / Supertonic 3

「一日」を「ついたち」と読むと決めたのは LLM で、エンジンはそれに従うだけです。読み手と語り手は別々に置き換えられます。日本語では、話す直前に辞書とピッチモデルがアクセントを加えられます。

この仕組みで動くデモ

使ってみる

コマンドライン

npm install -g yomiscript
yomiscript speak "ja /ame<t:雨> desɯ<t:です。> ↘/"
yomiscript instructions   # LLM に渡す、YomiScript の書き方

MCP サーバー(Claude Code など)

claude mcp add yomiscript -- npx -y @yomiscript/mcp

ブラウザーやアプリから使うパッケージは @yomiscript/kokoro と @yomiscript/ja-accent です。モデルは初回の利用時にダウンロードします。詳しくは パッケージの一覧をご覧ください。

目指していること

音声合成エンジンごとに発音の指定方法が違う状態をやめて、LLM とエンジンの間に共通の形式を置くことを提案しています。YomiScript は IPA と BCP 47 の言語タグに基づく言語非依存の仕様で、アクセント、声調、強勢、言語の切り替えまで同じ形式で書けます。仕様は公開していて、現在は v0.2 のドラフトです。

SSML にも発音を指定する仕組みがありますが、文字が本体で、発音は省略できる補足です。YomiScript では発音が本体なので、エンジンは文字を読む必要がありません。YomiScript の狙いは読みの精度だけでなく、言語に依存せず韻律まで書けることです。

他の言語についての研究はこれからですが、省略形などの読み方に有効だと考えています。

このように分離しておくことで、語り手(Katarite)の部分だけに集中した、オープンな形での研究・開発が進むことを期待しています。