PHP と WordPress でオフラインのテキスト読み上げ
PHP には音声合成機能がないため、多くのチュートリアルはテキストをクラウドAPIに送り、文字数で支払います。すべての記事に音声版を付けたい、通知を読み上げたい、ショップに音声を入れたいサイトでは、その請求は投稿のたびに増え、すべてのテキストがサーバーの外に出ます。
このガイドでは、無料の SuperClonica エンジンをローカルの HTTP サーバーとして使い、PHP から呼び出す方法を紹介します。自然な声、手元に残る WAV ファイル、リクエストごとの料金なしです。
PHP が話す方法
音声はテキストの版ごとに1回生成してファイルとして配信し、ページ表示のたびに合成しないようにしましょう。
- クラウドAPI:自然な声だが、アカウント、キー、文字数課金、そしてテキストは相手のサーバーへ。
- SuperClonica:サイトの隣で動くローカル HTTP サーバー。自然な声、キャラクターの声、独自の声をオフラインで。
- どちらも PHP が JSON を送り、音声を受け取るだけ。変わるのはアドレスだけです。
- 31言語を話します。中国語はまだ対応していません。
声を無料で聴く
コードを書く前に、どれかの声のページで30〜100文字のフレーズを入力し、言語を選んで生成ボタンを押しましょう。数秒で、サイトに持たせられる声を聴けます。アカウントは不要です。
音声サーバーを起動
NVIDIA のグラフィックカードがあれば cuda イメージで速くなりますが、ふつうのCPUで十分です。
- 同じマシンか非公開のマシンでサーバーを起動:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。
- 初回起動で Supertonic 3 モデル(約385 MB)をボリュームにダウンロードします。準備ができたかは GET /health でわかります。
- POST /synthesize は text、voice、lang、seed、normalize を含む JSON を受け取り、16ビットモノラルの WAV を返します。
- voice は標準名 M1〜M5、F1〜F5、または声のファイルをデコードした中身です。
PHP から呼び出す
標準関数以外の拡張は不要です:$voice = json_decode(file_get_contents('voice.json'), true); $body = json_encode(['text' => 'PHP からこんにちは!', 'voice' => $voice, 'lang' => 'ja', 'seed' => 7]); $wav = file_get_contents('http://localhost:8000/synthesize', false, stream_context_create(['http' => ['method' => 'POST', 'header' => 'Content-Type: application/json', 'content' => $body]])); file_put_contents('hello.wav', $wav); 同じリクエストは cURL 拡張や Guzzle などの HTTP クライアントでも動きます。標準の声なら、デコードしたファイルの代わりに 'voice' => 'F1' を渡します。Web 用に小さなファイルが欲しければ、ffmpeg で WAV を MP3 に変換しましょう。
WordPress と本番運用のコツ
WordPress では、公開フックやバックグラウンドジョブから音声を生成し、uploads フォルダーに保存して投稿に添付します。訪問者は合成を待たずにファイルを読み込めます。ポート 8000 をインターネットに公開しないでください。SUPERCLONICA_API_KEY を設定して Bearer トークンとして送るか、サーバーを localhost に置きます。公開記事には中立的な標準の声を選び、音声が生成されたものであることを伝え、文章の記事も読みやすいまま残しましょう。