ある金曜の夜、クライアントから「これ、機械っぽすぎ」と返された瞬間

大阪のスタートアップ向けにスペイン語プロモを作ったとき、スクリプトをそのままオンラインの TTS に放り込んだら、出てきた音声がまるで説明書を棒読みするロボット。クライアントは即座に動画を差し戻してきた。

その時気づいたのは、「読める」だけじゃダメだということ。イントネーションの上下、ポーズの長さ、さらに地域ごとのアクセントの微妙なズレまで、全部が「人間らしさ」を決める。

後で同じテキストを 無料音声クローン に通し、話速とポーズマークだけ調整したら、一発で「これ、本物?」って顔された。

イントネーション・ポーズ・方言の落とし穴

イントネーションは単なる高低じゃない。フランス語なら疑問文の語尾が上がり、ドイツ語なら平叙文の語尾が下がる。同じパラメータで全部やろうとすると、一瞬で「偽物」バレする。

ポーズも見えない殺し屋。日本語は「、」「。」で呼吸を取るけど、英語は文法構造で自然に切れる。固定長の無音を挟むと、タイプライターみたいにカタカタ聞こえる。

方言レベルでは、ブラジルポルトガル語と欧州ポルトガル語の母音差がでかすぎて、ネイティブなら一発で「素人」と見抜く。専用モデルなしじゃ無理。

文字コードと句読点の見えない影響

全角記号、ゼロ幅スペース、絵文字などをそのまま通すと、エンジンがスキップしたりエラー吐いたりして、謎のカクツキや飛び読みが発生。

スクリプトを一度 Unicode 正規化し、特殊記号を対応する SSML タグに置き換えるだけで、後工程の修正時間が半分以下になる。

俺がハマった数字・日付の読み方トラップ

日本語ナレーションで「2024年3月15日」を入れたら、エンジンが「ニーゼロニーヨン ネン サン ガツ ジュウゴ ニチ」と小学生みたいに読んできた。日本語では「二千二十四年三月十五日」が自然なのに、多くのツールは言語デフォルトの数字読み上げルールしか持ってない。

対策は単純:事前に数字をターゲット言語の文字表記へ変換する。ドイツ語なら「vierundzwanzig twenty-four」じゃなくて「vierundzwanzig」だけ、スペイン語なら「veinticuatro」。手動で一回やっとけば、後でパラメータいじるより十倍早い。

時間表記も罠。「3:15」を英語だと「three fifteen」だが、ドイツ語は「viertel nach drei」(3時15分前)。コロンそのまま渡すと「ドライ フュンフツェーン」と機械丸出し。

話速とピッチの微調整は数学だ

「速くすれば元気、遅くすれば落ち着き」と思いがちだけど、実際は全然違う。同じドイツ語で 1.0 だと駆け足、0.9 だと寝ぼけ声、0.93 あたりが日常会話のリズムに一番近い。

ピッチも言語ごとに法則がある。英語男性の平叙文は語尾で 2‑3 半音下がり、疑問文で 4‑5 半音上がる。スペイン語の疑問文は上がり幅が 2 半音程度しかない。これ、適当に決めてない。Audacity で母語ポッドキャストを波形解析して出た数値。手元に録音ソフトあれば、適当なネイティブ音源と比較しながら合わせるとすぐ分かる。

無料ツールだけで細部を詰める今のワークフロー

  1. オンライン文字読み上げ で多言語スクリプトを区切りごとに生成
  2. 重要なセリフだけ 無料音声クローン で微調整
  3. チュートリアル集 のパラメータ表を使って話速・ピッチ・ポーズを一括適用

登録なし、回数制限なし、API もそのまま自動化パイプラインに繋げられる。無料 AI 吹き替え・AI ボイスクローン・真人語音合成無料といったタグは魅力的だけど、イントネーション・ポーズ・方言・文字コードの四層を磨き切らなきゃ、耳を騙せない。

「感情タグ」という隠し機能を見逃すな

SSML タグに対応してても、使ってる人ほぼいない。<emphasis level="strong"> で単語を強調、<break time="300ms"/> でポーズを制御。グローバルパラメータ弄るより圧倒的に精密。

先日フランス語プロモで「incroyable」の前後に 200ms のブレイクと emphasis を入れただけで、クライアントから「これ、プロのナレーター雇ったの?」と聞かれた。タダの機能なのに、ドキュメントの奥深くに埋もれてて気づかないだけ。

実録:多言語ナレーションの現場で起きたトラブル

先月、韓国語とベトナム語を同時に納品する案件で、ベトナム語の声調記号が全角のままエンジンに渡ってしまい、トーンが全部フラットになった。現地スタッフから「まるでロボットの読み上げ」と即座に指摘され、納期前夜に全セグメントを再生成する羽目に。

原因はスクリプトのエンコード確認をスキップしたこと。以来、全言語共通で「文字コード→NFKC 正規化→SSML 変換」の三段階を自動化スクリプトに組み込み、CI で検証するようにした。

パラメータ自動化スクリプトの作り方

Python で pydub と requests を使い、生成済み WAV を一括で読み込み、話速・ピッチ・ポーズの目標値を JSON から読み取って ffmpeg の atempo/asetrate フィルタで調整。最後に loudnorm でラウドネスを -16 LUFS に揃えると、手動マスタリングなしで放送品質に近づく。

スクリプトの肝は「言語ごとのデフォルト値」を外部ファイルに切り出し、新規言語追加時に JSON だけ書き換えれば済む設計にした点。これでクライアントから「もう一回だけ速度変えて」と言われても、コマンド一発で再エンコードできる。

品質チェックリストと納品前の最終確認

  1. 全セグメントの文字コード・SSML タグが正規化済みか
  2. 数字・日付・時間がターゲット言語の表記に置換済みか
  3. 話速・ピッチ・ポーズが言語別パラメータ表と一致しているか
  4. 感情タグ(emphasis / break)が意図した箇所に入っているか
  5. ラウドネス -16 LUFS ±1、ピーク -1 dBFS 以内か

このリストをスプレッドシートにして、担当者がチェックボックスを埋めるだけで「漏れゼロ」を保証できる。納品前には必ずネイティブの同僚に 30 秒だけ聴いてもらい、「違和感ない?」の一言をもらうのが最後の砦。

FAQ

なぜ日本語の中に英語が混じるとローマ字読みになるの?

モデルが単一言語前提で分詞してるから、混在するとアルファベットを一文字ずつ読み上げる。スクリプト内で <lang=en> で囲むか、英語部分だけ別合成して後で繋ぐのが確実。

ドイツ語の話速を機械っぽくしないコツは?

話速パラメータを 0.92‑0.95 に設定し、長文の前後に 150‑200ms のブレイクタグを入れ、わずかにピッチを下げると、自然な朗読感に近づく。

無料ツールで商用利用できる?

VoxClone の利用規約では商用利用 OK。モデル重みの再配布だけ禁止で、生成された音声の著作権は生成者に帰属する。

次回ドイツ語広告を作るときは、話速 0.93、各従属節後に 180ms ポーズ、聞き直せばもう機械には聞こえないはず。