AI音声合成とAppleのsayコマンドを対比したイメージ

Article

Qwen3-TTSとGemini TTSで九九を読ませたら, 結局Appleのsayが一番安定した

2026年4月8日
6 min read
#AI#TTS#Qwen#Gemini#Apple#macOS

日本の九九を音声ファイルにしたかった。

やりたかったのは, 「いんいちがいち」「くくはちじゅういち」みたいな昔ながらの読み方を, 1つずつきれいに読み上げた音声を81個ぶん用意することだ。

最初は「今どきならAI TTSのほうが自然でしょ」と思って, Qwen3-TTSGemini TTS を試した。でも結果は意外で, 最終的に採用したのはmacOS標準の say コマンドだった。

なんというか, いちばん未来っぽくないやつが勝った。


やりたかったこと

用途としてはかなりシンプルだ。

  • 九九の81パターンを個別音声にしたい
  • 読み方は日本の慣用的な言い回しに寄せたい
  • 子どもが聞いて違和感の少ない発音にしたい
  • できれば自動生成でまとめて作りたい

普通の文章読み上げなら, いまのTTSはだいぶ優秀だ。だから最初は楽勝だと思っていた。

でも九九は, 普通の文章じゃなかった。


1. Qwen3-TTSを試した

最初に試したのはローカル実行の Qwen3-TTS

  • モデル: mlx-community/Qwen3-TTS-12Hz-1.7B-CustomVoice-bf16
  • 話者: Ono_Anna
  • 実行環境: Apple M4 Max + mlx-audio

ローカルで回せるのはかなり魅力だったし, うまくいけば一番自由度が高いはずだった。

結果

正直, 惜しいところまでは行く。でも安定しない。

  • instruct なしだと, 咳っぽいノイズや不自然な間が混じる
  • 全体に異様にゆっくりになることがある
  • 「九九の暗唱。はっきりと標準的な日本語で。」のような instruct を入れると多少マシ
  • ただし, 訛りっぽさや発音の揺れは残る
  • テキスト側を「いん いち が いち」とスペース区切りにしても改善は限定的

つまり, 一発だけそれっぽく読めることはあるけど, 81個を安定生成するにはつらい という感じだった。

この手の用途で欲しいのは, 芸術的な表現力より再現性だ。そこが足りなかった。


2. Gemini TTSも試した

次にクラウド側として Gemini TTS を試した。

  • モデル: gemini-2.5-flash-preview-tts
  • モデル: gemini-2.5-pro-preview-tts
  • 話者: Kore

こちらは「クラウドなら学習も強いだろうし, 日本語ももっと安定するかも」と期待していた。

結果

これも意外と厳しかった。

  • 短いひらがな列だと生成自体が失敗しやすい
  • finish_reason: OTHER で落ちることがある
  • 「くにじゅうはち」みたいな特定フレーズは, 工夫しても生成できないケースがあった
  • Proにしても状況は大きく変わらない
  • 成功しても, 九九として気持ちよく聞けるかというと微妙

こっちは品質以前に, そもそも通らないフレーズがある のが痛かった。

81個を機械的に揃えたい用途で, 数個だけ頑固に落ちるのはかなり困る。


3. 最後にAppleのsayを試した

そこで試したのが, ものすごくベーシックな say コマンドだった。

  • 音声: Kyoko
  • ベース: AVSpeechSynthesizer
  • いわゆるルールベース寄りの標準TTS

これが, いちばん派手さはない。でもいちばん壊れなかった。

良かった点

  • 毎回同じ読みで安定する
  • 変なノイズが混ざらない
  • 破綻しない
  • アプリからリアルタイムに呼んでも成立する
  • 事前に81ファイルを全部生成しなくても運用できる

もちろん, 音としてはぶっきらぼうだ。AIっぽい自然さや情感は薄い。

でも九九に必要なのは, そこじゃない。

変にうまいことより, 間違えず, ぶれず, 毎回同じことのほうが大事だった。

この条件では, say が普通に勝った。


なぜAI TTSで九九が難しいのか

今回ちょっと面白かったのは, 「普通の日本語読み上げなら強いモデル」が, 九九になると急に頼りなくなったことだ。

理由はたぶんいくつかある。

1. 九九の読みは, そもそも普通の語彙ではない

「いんいちがいち」「しちは」「くくはちじゅういち」みたいな表現は, 日常会話の文章としてほぼ出てこない。

TTSモデルからすると,

  • どこで区切るのか
  • どこにアクセントを置くのか
  • 何の文脈で発話しているのか

このあたりを推定しにくい。

2. 会話ではなく, ほぼ詠唱に近い

九九って, 意味を伝える会話ではなく, 決まったリズムで唱えるもの だ。

自然会話の読み上げに最適化されたTTSは, この「等時的で反復的な詠唱パターン」がむしろ苦手なのかもしれない。

3. 学習データに十分入っていない

これはかなりありそうだ。

英語のナレーションや日常会話は大量にあっても, 日本の九九を81パターンきれいに唱える音声データなんて, たぶんほとんど入っていない。

そりゃ強くない。

4. テキストが短すぎる

6文字とか8文字のひらがな列だけ渡されても, モデルからすると文脈が薄すぎる。

普通の文章なら前後から意味を補えるけれど, 九九はそれがない。短いのに特殊, という地味に厄介なタスクだった。


今回の結論

今回の結論はかなり明快だ。

  • Qwen3-TTS はローカルで試せて面白いが, 九九用途では安定性が足りない
  • Gemini TTS はクラウドでも, 短い特殊フレーズで失敗しやすかった
  • Appleの say は地味だけど, 九九にはいちばん実用的だった

AI TTSは「自然な読み上げ」が求められる場面ではたしかに強い。

でも今回みたいに,

  • 決まり文句
  • 特殊な読み
  • リズム重視
  • 全件同品質で揃えたい

みたいな条件になると, ルールベース寄りの古典的な仕組みのほうが強いことがある。

新しいものが必ず勝つわけじゃない。こういうの, けっこう好きだ。


環境メモ

  • Python 3.12 + venv
  • mlx-audio 0.4.2
  • google-genai SDK
  • 検証プロジェクト: /Users/ogi/Develop/Qwen3-TTS-Test/