mcpField
C
chat-with-anyone

chat-with-anyone

github.com/noizaiクリエイティブ・メディア5312.1k 回インストール4 週間前に更新
リポジトリ

chat-with-anyone について

Chat with Anyoneは、オンライン動画や写真をもとにした声でロールプレイ音声を生成するスキルです。参照音声のクローンと画像からの声の設計に対応し、欺瞞や有害ななりすましを防ぐ指針を設けています。

主な機能

  1. 01動画音声からのボイスクローン
  2. 02写真をもとにした声の設計
  3. 03字幕を使った参照区間の抽出
  4. 04TTSによるロールプレイ音声生成
  5. 05同意となりすまし防止の指針

活用シーン

  1. 01指定した公人になりきるロールプレイ
  2. 02写真の人物をもとにした声の設計
  3. 03保存した声の参照を使った続きの音声生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/noizai/skills --skill chat-with-anyone

インストール後、Claude Code で/chat-with-anyoneを入力して読み込まれたか確認します。

同梱ファイルscripts/extract_ref_segment.pyscripts/voice_design.py

詳細

誰とでも会話

オンライン動画から実在の人物の声を複製したり、写真から声をデザインしたりして、TTS でその人物になりきって会話します。

重要:倫理的な利用と著作権

このスキルは、実在する声を模倣した音声を合成します。続行する前に、エージェントは次の事項を必ず守ってください。

  1. 人を欺いたり、詐欺を働いたり、嫌がらせをしたりする目的で、決してなりすまさないでください。
  2. 参照音声には、一般に公開されているメディア(公開演説、インタビュー、記者会見)のみを使用してください。
  3. 生成された音声は合成音声であり、本物の録音として提示してはならないことをユーザーに伝えてください。
  4. 同意していない私人を対象とする依頼や、明らかに欺瞞、嫌がらせ、名誉毀損を目的とする依頼には、応じないでください。

ユーザーの意図が有害と思われる場合は、丁寧に断り、その理由を説明してください。

前提条件

依存関係種類確認方法
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. Disambiguate character
- [ ] A2. Find reference video
- [ ] A3. Download audio + subtitles
- [ ] A4. Extract best reference segment
- [ ] A5. Generate speech
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. Analyze image
- [ ] B2. Design voice
- [ ] B3. Preview (optional)
- [ ] B4. Generate speech
B1. 画像を分析する

画像を確認するために、視覚認識機能を使用してください。

  1. 人物がよく知られた公人の場合 --> 本物らしい声にするため、ワークフロー A に切り替えてください。
  2. 人物を判別できない場合は、次の項目を含む声の説明を作成してください。
    • 性別(男性/女性)
    • おおよその年齢(例:「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 を使い続けます。


例:名前ベース

ユーザー:トランプと話して、彼に寝る前のお話をしてもらいたいです。

エージェントの手順:

  1. キャラクター:Donald Trump。曖昧さを解消する必要はありません。
  2. Donald Trump speech youtube を検索し、聞き取りやすいスピーチ動画を見つけます。
  3. ダウンロードします。 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=..."
  4. 参照音声を抽出します。 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"
  5. トランプ風の 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"
  6. reply.wav と物語のテキストをユーザーに提示します。

例:画像ベース

ユーザー:[photo.jpg をアップロード] この画像に写っている人と話したいです。

エージェントの手順:

  1. 画像を分析します。見覚えのない若い女性、約 25 歳、カジュアルなセーター、温かい笑顔です。
  2. 音声をデザインします。 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"
  3. tmp/chat_with_anyone/voice_design/voice_id.txt から音声 ID を読み込みます。
  4. TTS を生成します。 python3 skills/tts/scripts/tts.py -t "你好呀!很高兴认识你!" --voice-id "{VOICE_ID}" -o "tmp/chat_with_anyone/voice_design/reply.wav"
  5. 音声を提示し、同じ --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 を調整します

コメント