与任何人聊天 是做什么的?
从在线视频克隆真实人物的声音,或从照片设计语音,然后以该人物的身份进行角色扮演并生成语音回复。
重要提示:道德使用与版权
此技能合成了模仿真实人声的语音。在继续之前,代理必须:
- 绝不冒充他人进行欺骗、欺诈或骚扰。
- 仅使用公开可用的媒体(公开演讲、采访、新闻发布会)作为参考音频。
- 告知用户生成的音频是合成的,不应作为真实录音呈现。
- 拒绝针对未经同意的个人,或明显用于欺骗、骚扰或诽谤的请求。
如果用户的意图看起来有害,礼貌拒绝并解释原因。
先决条件
| 依赖项 | 类型 | 如何验证 |
|---|---|---|
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 音频文件和一个或多个 .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 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" - 以特朗普风格生成语音:
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] 我想跟这张图片里的人聊天
代理步骤:
- 视觉分析:无法识别的年轻女性,约25岁,休闲毛衣,温暖微笑。
- 设计语音:
python3 skills/chat-with-anyone/scripts/voice_design.py --picture "photo.jpg" --voice-description "一位25岁左右的中国年轻女性,声音温柔温暖,语气友善" -o "tmp/chat_with_anyone/voice_design" - 从
tmp/chat_with_anyone/voice_design/voice_id.txt读取语音 ID。 - 生成语音:
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 |