WPMLサイトに音声読み上げを追加する:本当に機能する方法

2 分で読める 23 分で聴ける
WPMLサイトに音声読み上げを追加する:本当に機能する方法

WPMLサイトを運営していて、すべての翻訳に適切な声で読み上げを付けたいなら、選ぶプラグインには3つの条件があります。翻訳投稿を正しく読み取ること、言語ごとに別の音声ファイルを生成すること、そしてAJAX呼び出し内で現在の言語を正確に検出すること。ほとんどのTTSプラグインはこのどれかで失敗します。テキスト読み上げ - TTSWPはこの3つすべてに対応するために作られています。

この記事はWeglotガイドの実践版に当たります。技術的なアプローチが正反対なので、まずその違いから説明します。

WPMLは翻訳を実際の投稿として保存する。Weglotは違う。

WPMLとWeglotは多言語WordPressを全く異なる方法で実現しており、その違いがTTSプラグインに求められる動作を左右します。

WPMLは翻訳ごとに別の投稿レコードを作成します。記事の英語版はwp_postsテーブルに1つのIDで保存され、スペイン語版は同じテーブルに別のIDで保存されます。WPMLはこれらをicl_translationsテーブルでリンクします。翻訳テキストはデータベース上の実際のテキストであり、人間またはWPMLの機械翻訳パイプラインによって編集されます。

Weglotはその逆です。データベースには元のコンテンツだけが保存されます。翻訳は実行時に生成され、ページがブラウザに届く前に出力HTMLに挿入されます。WeglotサイトでWPMLサイトと同様にget_post()から読み取るプラグインは、常にソース言語しか取得できません。

TTSにとって、この違いは決定的です。WPMLではデータベースから投稿コンテンツを読み取ることが正しい方法です。翻訳テキストはすでにそこにあります。問題は、プラグインがどの投稿を読むか、どの言語と判断するか、そして音声ファイルを1つ保存するか複数保存するかという点にあります。

WPMLの別々の投稿ストレージとWeglotのランタイム翻訳を比較した図。各モデルのTTS音声ファイルへの影響を示す
WPMLはデータベース上に各翻訳を実際の投稿として保存します。Weglotは実行時に翻訳します。この2つのモデルは、TTSに対して異なる対応策を必要とします。

WPMLのTTSプラグインで起きる4つの失敗パターン

多言語WPMLのステージングサイトでいくつかの構成をテストしたところ、同じ4つの問題が繰り返し発生しました。現在使用中のプラグインにこれらの問題があれば、訪問者が聞いている音声は公開したつもりのものとは異なる可能性があります。

1. AJAXの言語検出が原因で間違った言語の音声が流れる

これは気づきにくい最大の問題です。ほとんどのTTSプレーヤーはページ読み込み後に admin-ajax またはRESTリクエストで音声ファイルまたはストリームURLを取得します。そのリクエスト内では、WordPressはフロントエンドのURLコンテキストを失っています。プラグインがWPMLに「現在の言語は何ですか?」と問い合わせると、間違った答えが返ってきます。

よくある原因は古いICL_LANGUAGE_CODE定数です。これはリクエストの早い段階で一度だけ定義され、WPMLが起動時に検出した言語を反映します。スペイン語ページから発生したAJAX呼び出し中、この定数はスペイン語ではなくデフォルト言語を返すことがよくあります。すると、TTSプラグインはスペイン語の記事に英語の音声を生成したり、キャッシュされた英語ファイルをスペイン語プレーヤーの下で再生してしまいます。

正しいアプローチはWPMLのランタイムフィルターを使うことです。wpml_current_languageフィルターは呼び出した瞬間のアクティブな言語を返します。wpml_post_language_detailsフックは特定の投稿が属する言語を返すため、リクエストの状態ではなく投稿IDに音声を紐づけられるのでさらに安全です。

読者として確認する方法:翻訳された記事を開き、再生ボタンを押して最初の1秒を聞いてください。英語以外のページで英語の声が聞こえたら、プラグインが間違った言語検出パスを使っています。

2. 1つの音声ファイルがすべての翻訳で共有されている

元の投稿が公開されたときに音声を生成し、同じファイルをすべての翻訳に紐づけるプラグインがあります。処理は早くてコストも低い方法ですが、正しくありません。スペイン語の読者が英語のナレーションを聞くことになり、また読んでいるページに合わない合成アクセントの音声になってしまいます。

WPMLの翻訳は別々のIDを持つ別々の投稿なので、翻訳投稿ごとに新しい音声ファイルを生成することが正しい動作です。各ファイルはその投稿IDに紐づけて保存され、その翻訳にのみ提供されます。TTSWPはこのモデルに従い、元のIDではなく投稿IDをキャッシュキーとして使用します。

3. すべての言語を同じ声で読み上げる

英語向けに訓練された声でフランス語の記事を読むと、言葉が正しくても不自然に聞こえます。ElevenLabsの音声はトレーニングデータからアクセントとプロソディを持ちます。アメリカ英語で訓練された声は、ターゲット言語に合った音声を割り当てない限り、アメリカ訛りでフランス語を読みます。

TTSWPではWPMLの各言語にElevenLabsの音声を1つ割り当てることができます。スペイン語翻訳にはスペイン語の声、ドイツ語翻訳にはドイツ語の声、という具合です。具体的な設定方法は言語と音声のマッピングドキュメントをご覧ください。

4. 音声の言語を宣言しないスキーマ

これはほとんどのプラグインが見落としているAEOの重要な点です。AudioObject構造化データにはinLanguageプロパティが必要です。値はページのhreflangと一致するIETF BCP 47タグ(jadenb-NO)にする必要があります。

inLanguageの値が一致していると、検索エンジンやAIツールに音声がどの言語であるかを機械可読な形で明確に伝えられます。これはページにすでに設定されているhreflangシグナルを補強します。スキーマがない場合、またはすべての翻訳が英語のみの同じ値を共有している場合、このシグナルが失われ、言語対応システムが各バージョンを区別できなくなります。AIエンジンが音声をどう扱うかについてはAEOと音声のガイドで詳しく解説しています。

WPML対応に適したElevenLabsモデルの選び方

ElevenLabsにはいくつかのモデルがあり、すべてが同じ言語をカバーしているわけではありません。WPMLが提供する言語をElevenLabsが選択したモデルでサポートしていない場合、その翻訳をきれいにナレーションすることはできません。

2026年時点での対応状況:

  • Multilingual v2は29言語をサポートします。英語、スペイン語、フランス語、ドイツ語、イタリア語、ポルトガル語、オランダ語、ポーランド語、スウェーデン語、デンマーク語、フィンランド語、トルコ語、アラビア語、ヒンディー語、日本語、韓国語、中国語などが含まれます。
  • Flash v2.5は32言語をサポートします。v2の全言語に加え、ハンガリー語、ノルウェー語、ベトナム語が追加され、モデルのレイテンシは約75ミリ秒です。
  • Eleven v3は74言語をサポートし、全モデル中最も広い対応範囲を持ちます。ただし、追加機能を上回る1つの制約があります。リアルタイム用途向けに設計されていないことです。ElevenLabsはこれを明記しています。このモデルはサイズが大きく高品質な音声コーデックを使用するため、生成に時間がかかります。リアルタイムや会話型のユースケースには、ElevenLabsはFlash v2.5を推奨しています。

ノルウェー語翻訳があるWPMLサイトでは、Multilingual v2では対応できません。Flash v2.5なら対応可能です。v3のみがサポートする言語が必要なサイトでは、より広いカバレッジを得るために生成レイテンシが高くなることを受け入れる必要があります。TTSWPは言語ごとに選択した音声にルーティングするため、必要に応じてモデルを組み合わせることができます。

TTSプラグインがWPMLに本当に対応しているかテストする方法

コードを読まなくても確認できます。ブラウザで5分あれば何が起きているかわかります。

  1. 言語を切り替える。元の記事を開き、WPML言語スイッチャーで翻訳版に切り替えます。URL(例:/ja/)が変わり、投稿スラッグが翻訳後のスラッグになっていることを確認します。
  2. 再生して聞く。声はページの言語と一致するはずです。日本語ページで英語の声が聞こえたら、プラグインの最初のステップが失敗しています。
  3. 音声URLを確認する。プレーヤーを右クリックして音声ソースをコピーします。元の記事の音声URLと比較してください。言語をまたいで同じURLなら、1つのファイルを共有しています。
  4. ページソースを表示してAudioObjectを探す。inLanguageフィールドを確認します。ページの言語コードと一致しているはずです。フィールドがない、または常にenなら、スキーマが間違っています。
  5. hreflangを確認する。音声のinLanguageはページのhreflangと一致する必要があります。不一致はAI検索を混乱させ、言語別の引用を壊します。

導入前にこのチェックリストを実行してください。TTSWPに限らず、あらゆるTTSプラグインで使えます。

正しいWPML TTS構成とは

本番環境のWPMLサイトで推奨する設定を紹介します。各ステップは上記の失敗パターンに対応しています。

課題誤ったアプローチ正しいアプローチ
AJAXの言語ICL_LANGUAGE_CODE定数投稿IDに紐づいたwpml_current_languageフィルターまたはwpml_post_language_details
音声の保存すべての翻訳で1ファイルを共有翻訳投稿IDごとに1ファイル、CDNから配信
音声の選択すべての言語で同じ声WPMLの言語ごとにElevenLabsの音声を割り当て
モデルの選択全言語でモデルを固定言語ごとにMultilingual v2、Flash v2.5、Eleven v3から選択
スキーマAudioObjectがないか英語のみページのhreflangと一致するinLanguageを持つAudioObject

TTSWPはデフォルトで右列の方法に従います。プラグインは翻訳投稿を直接読み取り、投稿IDごとに新しい音声ファイルを生成し、CloudFront経由で配信し、言語別のAudioObjectスキーマを出力します。設定手順はWPML連携ドキュメントをご覧ください。

正直な制限事項

言語ごとの音声生成は、1ファイルを共有するよりも多くの文字数を消費します。1500ワードの記事を5言語に翻訳した場合、1回ではなく5回分の生成コストがかかります。これは正確さのコストです。1ファイルを共有すればコストは下がりますが、音声はページと一致しなくなります。読者体験をクレジット節約と引き換えにすることは推奨しません。詳しくはクレジットドキュメントに記載しています。

予算が限られている場合は、実際にトラフィックがある言語の音声のみ生成してください。WPMLの言語統計とアクセス解析を見れば、どの翻訳にナレーションをつける価値があるかわかります。

よくある質問

TTSWPはWPMLにすぐ対応できますか?

はい。両方のプラグインが有効になると、TTSWPはWPMLを検出し、各言語の翻訳投稿コンテンツを読み取り、翻訳ごとに別々の音声ファイルを保存します。TTSWPの設定で言語ごとに音声を割り当て、通常どおりに翻訳を公開するだけです。翻訳が更新されると音声も再生成されます。設定手順はWPML連携ページをご覧ください。

なぜ翻訳ページでも英語の音声が再生されるのですか?

最も多い原因は、AJAX呼び出し内での非推奨のICL_LANGUAGE_CODE定数の使用です。AJAX処理中、この定数はアクティブな言語ではなくサイトのデフォルト言語を返すことが多く、英語以外のページでも英語の音声が生成・提供されます。修正するには、wpml_current_languageフィルターに切り替えるか、投稿IDから直接言語を読み取るようにしてください。

WPMLの言語ごとに異なるElevenLabsの音声を使えますか?

はい。TTSWPはWPMLの各言語にElevenLabsの音声を1つ割り当てます。スペイン語翻訳はスペイン語の声で、ドイツ語翻訳はドイツ語の声で読み上げられます。言語ごとに異なるモデルも選択できます。ターゲット言語がMultilingual v2ではなくFlash v2.5またはEleven v3のみがサポートしている場合に特に重要です。

WPMLサイトでElevenLabsはどの言語をカバーしていますか?

Multilingual v2は29言語、Flash v2.5は32言語(ノルウェー語、ハンガリー語、ベトナム語を追加)、Eleven v3は74言語に対応しています。レイテンシ要件の範囲で最も広いカバレッジのモデルを選んでください。ほとんどのWPMLサイトではMultilingual v2またはFlash v2.5で十分です。対応していない言語がある場合はその翻訳をEleven v3に移行します。

TTSWPはAI検索向けに言語別のスキーマを出力しますか?

はい。TTSWPは翻訳投稿ごとに、ページのhreflangと一致するinLanguage値を持つAudioObjectを出力します。これにより、検索エンジンとAIツールに対して、どの音声が記事のどの言語バージョンに対応するかを明確に伝えられます。すべての翻訳が同じタグを持つ状態を防ぎます。

次のステップ

今使っているTTSプラグインで5つのブラウザテストを実行してください。どれか1つでも失敗したら、翻訳を増やす前にその問題を修正する必要があります。5つすべてに最初から対応した環境を求めるなら、WordPress.orgからテキスト読み上げ - TTSWPをインストールし、TTSWPバックエンドに接続して、WPMLの各言語に音声を割り当ててください。あとはプラグインが自動で処理します。