关于 chat-with-anyone
Chat with Anyone 可根据在线视频或照片生成角色扮演语音,提供参考音频克隆与图片语音设计两种流程,并明确限制欺骗或有害的冒充行为。
主要功能
- 01从视频音频克隆声音
- 02根据照片设计声音
- 03基于字幕提取参考片段
- 04生成 TTS 角色扮演语音
- 05同意与冒充行为防护
适用场景
- 01以指定公众人物风格进行角色扮演
- 02根据照片中无法辨认的人物设计声音
- 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 必须:
- 绝不冒充他人进行欺骗、诈骗或骚扰。
- 仅使用公开可获取的媒体(公开演讲、采访、新闻发布会)作为参考音频。
- 告知用户生成的音频是合成的,不应冒充真实录音。
- 拒绝请求:目标是未同意的私人个体,或明显意图用于欺骗、骚扰或诽谤的请求。
如果用户的意图看起来有害,请礼貌地拒绝并说明原因。
先决条件
| 依赖项 | 类型 | 验证方法 |
|---|---|---|
ffmpeg | 系统二进制文件 | ffmpeg -version |
yt-dlp | 系统二进制文件 | yt-dlp --version |
tts skill | Cursor skill | 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 音频文件和一个或多个 .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. 分析图片
使用你的视觉能力检查图片:
- 如果人物是可辨认的公众人物 --> 切换到工作流 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"
脚本会输出:
- 检测到的声音特征(打印到 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 步骤:
- 角色:唐纳德·特朗普。无需消歧。
- 搜索
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" - 以特朗普的风格生成 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和故事文本。
示例:基于图片
用户:[上传 photo.jpg] 我想跟这张图片里的人聊天
Agent 步骤:
- 视觉分析:无法辨认身份的年轻女性,约 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" - 从
tmp/chat_with_anyone/voice_design/voice_id.txt读取声音 ID。 - 生成 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 |