メインコンテンツへ移動
AIチュートリアル

ElevenLabs、Whisper、ffmpegで自然なバイリンガル親密ボイスを作る

実際のテストに基づき、自然な中英バイリンガル音声の設計、呼吸や話し方の調整、個別素材とffmpegを使ったキス音・環境音・ボイスメッセージ・リアルタイム通話音声の制作方法を解説します。

ElevenLabs、Whisper、ffmpegで自然なバイリンガル親密ボイスを作る

プロジェクト概要

このワークフローは、自然で一貫した中国語・英語バイリンガルの親密な音声を制作するためのものです。核心となる原則は、テキスト読み上げモデルにすべての音を模倣させることではなく、完成品を役割の異なるトラックに分けることです。ElevenLabs は台詞と呼吸の表現を担当し、実素材はキス音と環境音を担当します。ffmpeg はトリミング、速度変更、ミキシング、結合を行い、Whisper は品質検査ツールとして機能します。

最も重要な結論:音声モデルが担当するのは「言葉」と、発話のリズムに溶け込む呼吸だけです。キス音や湿った音などの非言語音響効果は別途制作し、後から音声とミックスしてください。

README の手順は Mac mini で実行されていますが、使用している方法は特定の Mac モデルに依存しません。システムから ElevenLabs API を呼び出し、ffmpeg を実行し、Whisper で文字起こしできれば、主要な手順を再現できます。

主要ツールと役割

  • ElevenLabs:Voice Design で声質を作成し、テキスト読み上げモデルで台詞を生成します。
  • ffmpeg:サンプルレートの統一、速度変更、素材のトリミング、フェードイン・フェードアウト、ミキシング、結合を行います。
  • Whisper:非言語素材がモデルによって認識可能な単語として読み上げられていないかを検査します。
  • 正規に許諾された実録音:独立した環境音を提供します。元の手順ではパブリックドメインの CC0 素材のみを使用し、出典を記録しています。

開始前のインストールと準備

1. ElevenLabs の準備

ElevenLabs に登録し、Voice Design とテキスト読み上げ API を呼び出せる認証情報を取得します。実際に使用する API は POST /v1/text-to-voice/design と POST /v1/text-to-voice です。

まず voice_description と試聴用テキストを送信し、複数の候補プレビューを取得します。候補を選んだら、その generated_voice_id を使って正式な声を保存します。保存に成功したら voice_id を記録し、以後の合成ではこの ID を使用します。

2. ffmpeg のインストール

ターミナルから ffmpeg を直接実行できることを確認します。macOS では一般的なパッケージマネージャーでインストールできます。インストール後、次のコマンドで確認します。

ffmpeg -version

3. Whisper の準備

この手順で Whisper は音声生成に使うのではなく、「音声検査プローブ」として使います。候補となるキス音や非言語音の断片を確認し、安定して単語に文字起こしされる場合は、モデルが実際には非言語音ではなく擬音語を読み上げていることを示します。

4. 素材ディレクトリの作成

あらかじめファイルを役割ごとに分け、少なくとも音声出力、キス音候補、選別済みのキス音素材、元の環境音、トリミング済みの環境音ウィンドウ、最終ミックスファイルを含めることを推奨します。これにより、未確認の候補素材をそのまま完成品に使うことを防げます。

ステップ 1:中英バイリンガルの声質を設計する

音声ライブラリから選ぶだけでなく、文章で説明する

README のテストでは、既存の中国語音声は英語で訛りが出ることがあります。一方、Voice Design でバイリンガルの背景を明確に説明すると、中国語と英語の両方で自然な結果を得やすくなります。説明には、母語能力、年齢層、人物関係または役柄の雰囲気、目標とする感情の 4 種類を明記してください。

以下は元の手順で使用した説明です。役柄に応じて調整できます。

Native bilingual speaker of Mandarin Chinese (standard putonghua) and American English,
both at native level, with no cross-language accent in either. Male, 35–40. Studio quality.
Persona: mature, dominant, doting. Emotion: composed, doting, low-burning.
Rich, chesty, slightly gravelly low voice; unhurried, even pacing with weight on key words
and a breathy softness at the ends of sentences.

試聴用テキストには広告コピーを使わないでください。役柄が普段実際に話しそうな言葉を選び、同じ説明から複数の候補を生成します。試聴では、声が低いか心地よいかだけでなく、目標とする人物が自然に話しているように聞こえるかを優先して判断します。

適切なモデルを選ぶ

  • 通常の会話:README では v3 を推奨しています。テキスト内容から日常的な感情を表現するのに適しています。
  • リアルタイム通話や親密な場面:v4 を推奨します。同じ声質で中国語、英語、中国語と英語の混在を処理するのに適しており、軽い音声指示タグも認識しやすくなっています。
  • 英語のみの長文:v4 を使わない場合は eleven_turbo_v2_5 を選択し、language_code=en を明示的に設定すると、英語での中国語訛りを抑えられます。

声質パラメータを調整する

README に記録された実測上の開始値は次のとおりです。

  • stability=0.35:変化とドラマ性が比較的強くなります。
  • stability=0.5:日常会話に近くなり、「演技している」感じを抑えられます。
  • similarity_boost=0.8:目標の声質を一貫して保つために使用します。
  • style=0.3:元の記録では v3 がこのパラメータを認識しないため、v3 の制御に依存しないでください。

デバッグ時は一度に 1 つの変数だけを変更します。評価の高かった基準音声を保存し、安定度またはタグのどちらか 1 つだけを調整すれば、変化の原因を正確に判断できます。

ステップ 2:呼吸を発話のリズムに溶け込ませる

声の雰囲気が変わるときだけタグを入れる

すべての文にタグを付けないでください。6〜10 文ごとに 2〜3 個の軽いタグを使えば、通常は十分です。後の文では、直前の声の雰囲気を引き継げます。元の手順でよく使う語には low、close、quiet、soft、unhurried があります。

[low and close to her ear, unhurried]
……こっちへ来い。隠れるな。

……もう少し近くへ。そうだ。

[quiet laugh under the breath]
……何を急いでいる。

intense、heavy、growl、strained、rough のような強い語も完全に使えないわけではありませんが、元のテストでは声が誇張されやすくなりました。より信頼性の高い方針は、強く演じさせるのではなく、低く、近く、ゆっくりと指示することです。

句読点で呼吸を形作る

heavy breathing と何度も書くより、文頭、文末、または文中に適度な「……」を入れるほうが、自然な間を得やすくなります。1 グループにつき明確な呼吸は 2〜3 箇所にとどめ、軽く息を吐く、話の途中で止まる、短く息を止める、笑いを含んで息を吐く、声を半分で抑えるなど、表現を変えてください。

同じ息づかいが連続すると、繰り返しが目立ちます。生成後は一文だけでなく、全体を通して試聴してください。

できるだけ段落単位で生成する

段落全体を一度に生成すると、呼吸、感情、音程が連続しやすくなります。8 文を別々に合成してから結合すると、各ブロックが毎回最初から始まるように聞こえます。リアルタイム通話で段落全体を生成できない場合は、2 文または約 40 文字の漢字で 1 ブロックを構成し、1 文 1 ブロックを避けてください。

コンテキストを渡す

v4 は previous_text と next_text に対応しています。ブロックごとに生成する際、前後のテキストをモデルに渡すことで、機械的な読み上げ感を軽減できます。README では、v3 はこの 2 つのフィールドに対応しておらず、v3 に渡すとエラーになる可能性があると特に説明しています。そのため、モデルごとにリクエストを組み立てる必要があります。

誤った言語ルーティングを避ける

プログラムが漢字の割合でモデルや言語を決める場合は、角括弧内の英語タグを先に取り除いてください。そうしないと、短い中国語の文でも大量の英語タグが含まれるため、英語と誤判定される可能性があります。v4 では同じモデルを使い続けることで、中国語と英語の切り替えを減らせます。

ステップ 3:速度を調整する

元のテストでは、v4 の speed パラメータが期待どおりに機能しませんでした。v4 を遅くするには、まずテキストに自然な間を増やし、その後 ffmpeg で音程を保ったまま速度を落とします。

ffmpeg -i input.mp3 -filter:a "atempo=0.9" output.mp3

英語のみで turbo モデルを使う場合、README に記録された使用可能な開始値は speed=0.84 です。文の間に間を入れることもできます。

<break time="0.4s"/>

1 つの段落に間のタグを詰め込みすぎないでください。元のテストでは最大で約 6 個が推奨されており、多すぎると出力が不安定になる可能性があります。

ステップ 4:再利用できるキス音素材ボックスを作る

なぜ擬音語を直接書かないのか

テキスト読み上げモデルにキスの擬音語を読ませると、自然な非言語音ではなく、認識可能な音節や文字のような音になることがよくあります。動作タグだけを書いた場合も、普通のハミングに変わる可能性があります。そのため、元のプロジェクトでは「まず一括生成し、その後トリミングと選別を行う」素材ボックス方式を採用しています。

制作手順

  1. 同じ声質と、キスの動作を含む同じテキストを使い、完全な出力を 5〜6 回生成します。元の手順では v4 と stability=0.35 を使用しています。
  2. 無音検出または音声編集ツールを使い、各出力から候補となる非言語音の断片を切り出します。
  3. Whisper で各断片を文字起こしします。明確な文字や単語に変換された断片は直接破棄します。
  4. 差分エネルギーと元のエネルギーの比率を確認します。元のテストでは、信頼性が比較的高い断片は通常 0.2 を超え、文字として読み上げられた断片は約 0.12〜0.16、普通のハミングは通常 0.1 未満でした。これらの数値は特定の素材に基づくもので、初期の参考値にすぎません。
  5. 人が試聴して合格した素材を、軽いキス、深めのキス、位置の変化などのカテゴリに整理します。
  6. 使用時には最近使っていない断片をランダムに選び、音程と速度に約 3% を超えない軽微な変化を加えます。元の手順では遅くすることだけを許可し、速くはしません。

自動選別で人による試聴を代替することはできません。README では、持続的なノイズを含む断片があり、Whisper が Sssss に似た結果を文字起こししていたにもかかわらず、確認漏れによって完成品に入ったことがありました。正しい手順では、文字起こしテキスト、波形指標、実際の聴感を同時に確認してください。

ステップ 5:実環境音で 2 トラックミックスを完成させる

素材を選ぶ

元の手順では、音声モデルによるシミュレーション、AI 音響効果の生成、実録音の 3 つを比較しました。最終的に選んだのは、人の声を含まず、許諾が明確な CC0 の実素材です。外部録音を使用する前に、ライセンスを確認し、出典を記録してください。

固定の音量係数を直接掛けない

環境録音は平均ラウドネスとピークが大きく異なる場合があり、長い無音部分を含むこともあります。固定の音量係数をそのまま適用すると、ほとんど聞こえないか、人の声を覆ってしまうことがあります。より安定した方法は次のとおりです。

  1. 元の素材から、人の声と同程度の長さのウィンドウを 2 つランダムに切り出します。
  2. 2 つのウィンドウのピークを測定し、有効な音が多いほうを選びます。
  3. 環境音のピークが現在の人の声のピークより約 12 dB 小さくなるようにゲインを計算します。
  4. 環境音に 0.5 秒のフェードインを追加します。
  5. 人の声が終わった後に約 1 秒の余韻を残し、約 1.4 秒のフェードアウトを適用します。
  6. キス音素材自体に適切な質感がある場合は、環境音をさらに重ねません。

ffmpeg によるミックス例

人の声が v.mp3、トリミング済みの環境音ウィンドウが w.wav、GAIN がピーク調整後に算出したゲイン、END がフェードアウト開始位置だとします。

ffmpeg -i v.mp3 -i w.wav -filter_complex \
 "[1:a]volume=GAIN,afade=t=in:st=0:d=0.5,afade=t=out:st=END-1.4:d=1.4[w];\
  [0:a]apad=pad_dur=1.0[v];[v][w]amix=inputs=2:duration=first:normalize=0[a]" \
 -map "[a]" -c:a libmp3lame -q:a 2 out.mp3

normalize=0 は重要です。README のテストによると、これを省略すると amix が人の声を明らかに小さくする可能性があります。

ミックス用マーカーと読み上げタグを分ける

執筆段階では、[low, close, wet] のようなタグを使い、wet を後処理用のミックスマーカーとして扱えます。音声モデルへのリクエスト前に、プログラムはこの語を削除し、モデルが音響効果を演じようとするのを防ぐ必要があります。人の声が返った後、マーカーに応じて対応する実素材を重ねます。次のタグにそのマーカーが含まれなくなったら、環境音をフェードアウトします。

ステップ 6:完全な音声トラックを制作する

スクリプトを 3 種類のブロックに分けます。通常の台詞ブロックはテキスト読み上げに送り、純粋な非言語ブロックは素材ボックスから選び、環境音マーカー付きのブロックは先に人の声を生成してから、2 トラックミックスを実行します。

異なるソースの音声はサンプリングレートが異なる場合があるため、結合前に統一します。たとえば、先に 44100 Hz へ変換します:

ffmpeg -i input.wav -ar 44100 output.wav

サンプリングレートを統一したら、ffmpeg の concat フィルターを使い、台本の順序に沿って1本につなぎます。結合後は最初から最後まで試聴し、ブロック間で音色、バックグラウンドノイズ、音量、呼吸が急に変化していないかを重点的に確認します。

ステップ7:リアルタイム通話に使用する

リアルタイムモードの要点は、待ち時間を短縮しながらコンテキストを維持することです。独立した行にあるタグごとに分割し、新しいタグがない後続の文には現在の声色を引き継がせます。2文、または約40文字の漢字がたまった時点で生成をリクエストします。

  1. 現在のブロックを再生している間に、バックグラウンドで次のブロックを先行生成する。
  2. v4 には、現在のブロックの前の文と次の文を渡す。
  3. 非言語のみのブロックは素材ボックスから直接取得し、テキスト読み上げを再度リクエストしない。
  4. 最後の文の再生が終わってからマイクをオンにし、音声が重ならないようにする。
  5. 合成に失敗した場合は、文字だけを表示するか短時間無音にし、別の声色へ急に切り替えない。

途中で声色を変えることによるキャラクターの断絶は、通常、1秒程度の間よりも目立ちます。そのため、まずキャラクターの声の一貫性を維持すべきです。

高度なデバッグのコツ

固定の比較サンプルを作成する

自然だと確認できた基準音声を1本保存します。安定度、タグ、句読点、モデル、後処理の速度のうち、毎回1項目だけを変更し、基準版とブラインド試聴で比較します。

生成用タグと後処理用タグを分ける

音声モデルには、演じるべき声色のタグだけを渡します。環境音、素材の種類、ミックスの強度は後処理用のメタデータなので、リクエスト前に必ず削除します。これにより、モデルが制作指示を読み上げたり、効果音をまねようとしたりするのを防げます。

最近の使用履歴を保存する

素材ボックスに最近の使用キューを用意し、たとえば直近で使用した10個のクリップを避けます。これにより繰り返し感を抑えられ、毎回完全にランダム抽出するより安定します。

品質基準を自動化する

次のチェックを出力パイプラインに組み込めます:

  • Whisper が本来存在しない語句まで文字起こししていないか。
  • 人の声と環境音のピーク差が目標値に近いか。
  • サンプリングレートが統一されているか。
  • 出力の末尾に自然な余韻が残っているか。
  • リクエストで使用するモデルが、渡したパラメータに対応しているか。
  • 言語検出の前に英語タグを削除したか。

コスト、ライセンス、コンテンツの境界

README には Creator プランを使用し、料金は月額22ドル、約12万字の利用枠と記録されています。最初の声色作成では約3000字を消費し、通常の利用量は数百字から2000字までさまざまです。README には、当時 v4 に期間限定の割引があったことも記載されています。そのため、実際の料金、利用枠、課金方式は利用時点の公式ページを基準にしてください。

すべてのコンテンツは、明確に成人のみを扱う必要があります。未成年と受け取られる可能性のあるキャラクター設定や、年齢が曖昧な表現は使用しないでください。プラットフォームはテキストに基づいて審査するため、違反コンテンツはアカウント停止につながる可能性があります。

他人の録音を使用する場合は、必ず許諾を確認してください。素材を無料でダウンロードできても、再配布や商用利用が許可されているとは限りません。元の手順では CC0 素材のみを使用し、各ファイルの出典を記録しています。

結論

自然で親密な音声は、強いタグを積み重ねるだけでは得られません。より確実な方法は、音声モデルにセリフ、控えめな感情、呼吸のリズムだけに集中させ、非言語音を文字起こしと人による試聴で選別した素材に分け、ffmpeg でピーク調整、フェードイン・フェードアウト、結合を行うことです。

最小構成から始めます。まず安定した2種類の声色を作り、次に全体生成とコンテキストの受け渡しを検証し、その後で素材ボックスと環境音を追加します。各段階で基準サンプルを残し、1つの変数だけを調整するほうが、タグを増やし続けるよりも、自然で一貫性があり再利用しやすい結果を得やすいでしょう。