Chat with Anyone - 誰とでも会話 は何をしますか?
オンラインビデオから実在の人物の声をクローンしたり、写真から声をデザインして、その人物になりきってTTSでロールプレイできます。
重要:倫理的使用と著作権
このスキルは実際の声を模倣する音声を合成します。進める前に、エージェントは必ず以下を遵守してください:
- なりすましによる欺瞞、詐欺、嫌がらせを決して行わないこと。
- 公開メディアのみ(公開スピーチ、インタビュー、記者会見)を参照音声として使用すること。
- ユーザーに通知すること:生成された音声は合成音声であり、本物の録音として提示すべきではないこと。
- リクエストを拒否すること:同意のない個人を対象とするもの、または明らかに欺瞞、嫌がらせ、名誉毀損を意図したものは拒否すること。
ユーザーの意図が有害であると思われる場合は、丁寧に拒否し、理由を説明してください。
前提条件
| 依存関係 | タイプ | 確認方法 |
|---|---|---|
ffmpeg | システムバイナリ | ffmpeg -version |
yt-dlp | システムバイナリ | yt-dlp --version |
tts スキル | Cursorスキル | ls skills/tts/scripts/tts.py |
NOIZ_API_KEY | 環境変数またはファイル | python3 skills/tts/scripts/tts.py config --show |
初回実行前に、すべての依存関係が揃っていることを確認してください:
ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py
yt-dlp がない場合はインストールしてください:
uv pip install yt-dlp
Noiz APIキーが設定されていない場合:
python3 skills/tts/scripts/tts.py config --set-api-key YOUR_KEY
モード選択
- ユーザーが人物名を指定(実在または架空) --> ワークフローA
- ユーザーが画像を提供、人物が認識できない --> ワークフローB
- ユーザーが画像を提供、人物が認識可能な公人 --> ワークフローA(実際の声の方がより本格的)
- 画像に複数の人物がいる --> 先に誰について話すか質問
ワークフローA:名前ベース(オンラインビデオからの音声)
チェックリストで進捗を記録してください:
- [ ] A1. キャラクターの特定
- [ ] A2. 参照ビデオを探す
- [ ] A3. 音声と字幕をダウンロード
- [ ] A4. 最適な参照区間を抽出
- [ ] A5. 音声を生成
A1. キャラクターの特定
曖昧な場合(例:「アメリカ大統領」「スパイダーマン俳優」)は、進める前に正確な人物をユーザーに確認してください。
A2. 参照ビデオを探す
ウェブ検索を使用して、その人物がはっきりと話しているYouTube(またはBilibili)のビデオを見つけてください。最適な候補:インタビュー、スピーチ、記者会見。背景音楽が激しいビデオは避けてください。
検索クエリの例:
{CHARACTER_NAME} interview/{CHARACTER_NAME} 采访{CHARACTER_NAME} speech/{CHARACTER_NAME} 演讲{CHARACTER_NAME} press conference
A3. 音声と字幕をダウンロード
mkdir -p "tmp/chat_with_anyone/{CHARACTER_NAME}"
yt-dlp -x --audio-format mp3 \
--write-subs --write-auto-subs --sub-langs "en,zh-Hans" \
--convert-subs srt \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/%(title)s.%(ext)s" \
"{VIDEO_URL}"
ダウンロード後、出力ディレクトリをリストして音声ファイルとSRT字幕ファイルを確認してください:
ls tmp/chat_with_anyone/{CHARACTER_NAME}/
期待される出力:.mp3 音声ファイルと1つ以上の .srt 字幕ファイル。
字幕ファイルが表示されない場合:自動キャプションが付いている別のビデオを試すか、対象言語に合わせて --sub-langs を調整してください。
A4. 最適な参照区間を抽出
自動抽出スクリプトを使用します。SRTを解析し、最も密度の高い3〜12秒の音声区間を見つけてWAVとして抽出します:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py \
--srt "tmp/chat_with_anyone/{CHARACTER_NAME}/{SRT_FILE}" \
--audio "tmp/chat_with_anyone/{CHARACTER_NAME}/{AUDIO_FILE}" \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/ref.wav"
スクリプトは選択された時間範囲を表示し、参照WAVを保存します。出力が存在し、空でないことを確認してから進めてください。
スクリプトが適切な区間を見つけられなかった場合:短いクリップには --min-duration 2 を試すか、別のビデオをダウンロードしてください。
A5. 音声を生成してロールプレイ
キャラクターになりきって応答テキストを書き、それを合成します:
python3 skills/tts/scripts/tts.py \
-t "{RESPONSE_TEXT}" \
--ref-audio "tmp/chat_with_anyone/{CHARACTER_NAME}/ref.wav" \
-o "tmp/chat_with_anyone/{CHARACTER_NAME}/reply.wav"
生成された音声ファイルをテキストと一緒にユーザーに提示してください。以降のメッセージでは、同じ --ref-audio パスを再利用してください。
ワークフローB:画像ベース(写真からの音声)
チェックリストで進捗を記録してください:
- [ ] B1. 画像を分析
- [ ] B2. 声をデザイン
- [ ] B3. プレビュー(オプション)
- [ ] B4. 音声を生成
B1. 画像を分析
視覚認識機能を使って画像を確認してください:
- 人物が認識可能な公人の場合 --> 本物の声のためにワークフローAに切り替えてください。
- 認識できない場合、以下の内容を含む声の説明を作成してください:
- 性別(男性 / 女性)
- おおよその年齢(例:「30歳くらい」)
- 印象(例:明るい、権威がある、優しい)
- 文脈の手がかり(例:スーツ → プロフェッショナルな口調;アスレチックウェア → エネルギッシュ)
B2. 声をデザイン
画像と説明の両方を音声デザインスクリプトに渡します:
python3 skills/chat-with-anyone/scripts/voice_design.py \
--picture "{IMAGE_PATH}" \
--voice-description "{VOICE_DESCRIPTION}" \
-o "tmp/chat_with_anyone/voice_design"
スクリプトの出力:
- 検出された音声特徴(標準出力に表示)
- 出力ディレクトリ内のプレビュー音声ファイル
- 最適な音声IDを含む
voice_id.txt
音声IDを読み取ってください:
cat tmp/chat_with_anyone/voice_design/voice_id.txt
B3. プレビュー(オプション)
出力ディレクトリからプレビュー音声ファイルを提示し、ユーザーが声を聞けるようにします。満足できない場合は、--voice-description または --guidance-scale を調整してB2を再実行してください。
B4. 音声を生成してロールプレイ
python3 skills/tts/scripts/tts.py \
-t "{RESPONSE_TEXT}" \
--voice-id "{VOICE_ID}" \
-o "tmp/chat_with_anyone/voice_design/reply.wav"
以降のメッセージでは、一貫性のために同じ --voice-id を使い続けてください。
例:名前ベース
ユーザー: 我想跟特朗普聊天,让他给我讲个睡前故事。
エージェントの手順:
- キャラクター:Donald Trump。明確化不要。
Donald Trump speech youtubeを検索し、明瞭なスピーチビデオを見つける。- ダウンロード:
yt-dlp -x --audio-format mp3 --write-subs --write-auto-subs --sub-langs "en" --convert-subs srt -o "tmp/chat_with_anyone/trump/%(title)s.%(ext)s" "https://youtube.com/watch?v=..." - 参照区間を抽出:
python3 skills/chat-with-anyone/scripts/extract_ref_segment.py --srt "tmp/chat_with_anyone/trump/....srt" --audio "tmp/chat_with_anyone/trump/....mp3" -o "tmp/chat_with_anyone/trump/ref.wav" - TrumpスタイルでTTSを生成:
python3 skills/tts/scripts/tts.py -t "Let me tell you a tremendous bedtime story..." --ref-audio "tmp/chat_with_anyone/trump/ref.wav" -o "tmp/chat_with_anyone/trump/reply.wav" reply.wavとストーリーテキストをユーザーに提示する。
例:画像ベース
ユーザー: [uploads photo.jpg] 我想跟这张图片里的人聊天
エージェントの手順:
- 視覚分析:認識できない若い女性、約25歳、カジュアルなセーター、温かい笑顔。
- 声をデザイン:
python3 skills/chat-with-anyone/scripts/voice_design.py --picture "photo.jpg" --voice-description "A young Chinese woman around 25, gentle and warm voice, friendly tone" -o "tmp/chat_with_anyone/voice_design" - 音声IDを
tmp/chat_with_anyone/voice_design/voice_id.txtから読み取る。 - TTSを生成:
python3 skills/tts/scripts/tts.py -t "你好呀!很高兴认识你!" --voice-id "{VOICE_ID}" -o "tmp/chat_with_anyone/voice_design/reply.wav" - 音声を提示し、同じ
--voice-idでロールプレイを続ける。
トラブルシューティング
| 問題 | 解決策 |
|---|---|
yt-dlp のダウンロードが失敗する、またはビデオが利用できない | 別のビデオURLを試す。一部の地域やビデオは制限されている場合があります。yt-dlp -U を実行して更新 |
| SRT字幕ファイルがない | --sub-lang en,zh-Hans で再ダウンロード。それでもない場合は、自動キャプション付きの別のビデオを試す |
extract_ref_segment.py が適切な区間を見つけられない | 短いクリップには --min-duration 2 を使用するか、別のビデオを試す |
| 音声デザインがエラーを返す | Noiz APIキーを確認。画像が人物の明確な写真であることを確認 |
| TTS出力の音質がおかしい | ワークフローAの場合は別の参照ビデオを試す。ワークフローBの場合は --voice-description を調整 |