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. 04生成 TTS 角色扮演语音
  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 扮演这个人。

重要提示:合乎伦理地使用与版权

此技能会合成模仿真人声音的语音。继续操作前,Agent 必须:

  1. 绝不冒充他人进行欺骗、诈骗或骚扰。
  2. 仅使用公开可获取的媒体(公开演讲、采访、新闻发布会)作为参考音频。
  3. 告知用户生成的音频是合成的,不应冒充真实录音。
  4. 拒绝请求:目标是未同意的私人个体,或明显意图用于欺骗、骚扰或诽谤的请求。

如果用户的意图看起来有害,请礼貌地拒绝并说明原因。

先决条件

依赖项类型验证方法
ffmpeg系统二进制文件ffmpeg -version
yt-dlp系统二进制文件yt-dlp --version
tts skillCursor skillls 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 音频文件和一个或多个 .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"

脚本会输出:

  • 检测到的声音特征(打印到 stdout)
  • 输出目录中的预览音频文件
  • 包含最佳声音 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,以保持一致。


示例:基于姓名

用户:我想跟特朗普聊天,让他给我讲个睡前故事。

Agent 步骤:

  1. 角色:唐纳德·特朗普。无需消歧。
  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] 我想跟这张图片里的人聊天

Agent 步骤:

  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

评论

支持 Markdown