【コピペで動く】複数キャラの音声作成を完全自動化!動画制作が劇的に楽になるVOICEVOX連携術
こんにちは、『MAKO』です。
海外の最新ニュースや技術ブログをチェックしていると、「この面白い情報を、もっと親しみやすい形式で発信できたらな…」と考えることはありませんか?
私自身のプロジェクトでは、テキストで生成した記事を、複数キャラクターの「掛け合い」によるショート動画として全自動生成するシステムづくりを進めています。その動画生成プロセスの第一歩である「音声の自動生成システム」の基盤として、無料で高品質な音声合成ツールである「VOICEVOX」を採用しました。
本記事では、VOICEVOXエンジンをDocker環境でバックグラウンド起動し、Node.jsを使ってREST API経由で複数キャラクターの音声を自動生成するまでの実践的なプロセスを深掘りして解説します。既存のスクリプトを単に動かすだけでなく、実践的なAntigravity環境の「Skill」としてパッケージングした際の裏側までお伝えします。
1. なぜVOICEVOXをAPIで動かすのか?
VOICEVOXは、GUIエディタとして使うのが一般的ですが、実は内部で「VOICEVOX Engine」と呼ばれるローカルサーバーが動いており、REST APIを提供しています。このAPIを外部のスクリプトから叩くことで、一切の手動操作なしに大量のテキストを `.wav` ファイルへ変換することが可能になります。
今回は、自動記事生成システム(AutoBlog2)のパイプラインに組み込むため、GUIを介さずにコードだけで完全に制御できる仕組みが必要でした。
音声合成を担う2つの重要なエンドポイント
VOICEVOXのAPIで音声合成を行うには、順番に2つのエンドポイントにリクエストを送る必要があります。
`/audio_query` :テキストと話者ID(例: 3=ずんだもん)を渡し、「どのように発音するか(アクセントやイントネーション)」のメタデータ(JSON形式の`AudioQuery`)を生成します。
`/synthesis` :生成された`AudioQuery`と話者IDを渡し、実際に音声波形データ(バイナリの `.wav`)を合成・返却します。
この「クエリ作成」→「音声合成」の2段階プロセスを理解することが、自動化の第一歩です。
2. Docker ComposeによるVOICEVOX環境の構築
開発環境をクリーンに保つため、VOICEVOXエンジンはDockerを用いてコンテナ化しました。公式から配布されているCPU版のDockerイメージを活用することで、ホストマシンに複雑な環境構築をする手間を省いています。
今回作成した `docker-compose.yml` の基本構成は以下のようになります。
version: '3.8'
services:
voicevox:
image: voicevox/voicevox_engine:cpu-ubuntu20.04-latest
ports:
- "50021:50021"
tty: true起動とヘルスチェック
ターミナルから以下のコマンドでバックグラウンド起動を行います。
docker-compose up -d起動が完了したら、正常にアクセスできるかをPowerShellの機能を使ってヘルスチェックしてみましょう。
Invoke-WebRequest -Uri "http://localhost:50021/version" -UseBasicParsingステータスコード `200 OK` が返ってくれば、APIサーバーの準備は完了です。
3. Node.jsによる複数話者の対話プロトタイプ実装
環境が整ったところで、実際のNode.jsスクリプトを見ていきましょう。
「ずんだもん」と「四国めたん」が掛け合いをするような台本のJSONデータを定義し、それを順番に `.wav` ファイルとして出力する実装です。
台本データの定義
次のように、各キャラクターのセリフと話者ID(`speakerId`)を配列として持たせます。
const dialogueScript = [
{ character: 'ずんだもん', speakerId: 3, text: 'こんにちはなのだ!今日はAIについて話すのだ!' },
{ character: '四国めたん', speakerId: 2, text: 'あら、ずんだもんなのに真面目なテーマね。' }
];API連携スクリプトのコアロジック
Node.js標準の `fetch` や `axios` を使うことで、先ほど解説した `/audio_query` と `/synthesis` を順番に呼び出します。
const fs = require('fs');
async function generateAudio(text, speakerId, outputPath) {
const baseUrl = "http://localhost:50021";
// 1. AudioQueryの生成
const queryRes = await fetch(`${baseUrl}/audio_query?text=${encodeURIComponent(text)}&speaker=${speakerId}`, {
method: 'POST'
});
const audioQuery = await queryRes.json();
// 2. 音声波形の合成
const synthRes = await fetch(`${baseUrl}/synthesis?speaker=${speakerId}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(audioQuery)
});
// 3. ファイルを保存
const buffer = await synthRes.arrayBuffer();
fs.writeFileSync(outputPath, Buffer.from(buffer));
console.log(`Saved: ${outputPath}`);
}この処理を先ほどの `dialogueScript` とループ処理で組み合わせることで、自動的に `output_line1_ずんだもん.wav`, `output_line2_四国めたん.wav` といった音声ファイルが連番で生成されていきます。
そしてこれが生成された音声です(個別のファイルを連結したものです)
4. 今後の展望:完全な自動動画生成へ向けて
今回の作業を通じて、「テキストを入力すれば、登場人物の音声が生成される」というベース機能が完成しました。これを専用のAntigravity Skillとしてパッケージングしたことで、いつでもシステム自身から呼び出すことが可能です。
次のステップとしては以下のパイプラインが想定されます。
LLMプロンプトの調整: ニュースやブログ記事を読み込ませ、「対話形式のJSON台本」へと自動変換させる(ずんだもん・めたん等の特定のキャラクター付けを行う)。
Remotionとの連携: 生成された `.wav` 音源ファイルと台本を繋ぎ込み、Reactベースの動画構成ライブラリである「Remotion」でアニメーション動画として一括レンダリングする。
これまで手作業だった「記事の執筆」から「解説動画への変換」までをすべてコードで表現する。そのロマンに向けて、着実に前進できました。
5. 今回のプロジェクトで役立つおすすめの学習リソース
コンテナ技術や音声合成の基礎理解をさらに深めたい方に向けて、私がシステム構築時に役立つと感じた実在するおすすめの書籍を3冊ピックアップしました。技術のキャッチアップにぜひ活用してください。
開発系エンジニアのためのDocker絵とき入門
Dockerの概念が全く分からないという方でも安心です。イラストを多用してコンテナの考え方やネットワークを図解しており、今回のようなAPI環境を作るための最初の一歩に最適です。AWSコンテナ設計・構築[本格]入門
Dockerの基礎を学んだ後、ローカルから本番環境へステップアップしたいならこの本です。Voicevox Engineを本格的なクラウドで可用性を持たせて運用するなら必須の知識になります。Pythonで学ぶ音声合成 機械学習実践シリーズ
APIを叩くだけでなく、「なぜAIから声が出るのか」その仕組み自体に興味があるエンジニア向けです。日本語音声合成システムの具体的な実装手法への理解が圧倒的に深まります。
おわりに
Dockerの立ち上げからNode.jsでのAPI通信、そして連番音声の出力まで、一見難しそうに見える「音声合成APIの操作」ですが、実際はシンプルなリクエストの組み合わせで完結します。
自分好みのアバターに、自分の書いたコードを使って自動でトークしてもらうのは、それだけでエンジニアとしての喜びがあります。本記事があなたの自動化や動画制作のアイデアに繋がり、参考になれば幸いです。
参考ソース
いいなと思ったら応援しよう!
よろしければ応援お願いいたします! いただいたチップは、今後の制作のために役立てたいと思います!