写作与公文
想与真实人物或虚构角色聊天…
当用户想跟某个人物或图片中的人聊天、让对方用自己的声音回复时,先获取或设计参考音色,再用 TTS 生成角色语音。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
想与真实人物或虚构角色聊天、或让图片人物特定
解决思路
- 先做伦理与版权检查:绝不冒充他人进行欺骗、诈骗或骚扰;只使用公开可用媒体(公开演讲、采访、新闻发布会)作为参考音频;告知用户生成音频是合成的,不能当作真实录音;拒绝针对未同意私人个体或明显用于欺骗、骚扰、诽谤的请求;若用户意图有害,礼貌拒绝并解释原因。
- 验证依赖:运行 `ffmpeg -version && yt-dlp --version && ls skills/tts/scripts/tts.py`。依赖包括 `ffmpeg`、`yt-dlp`、`tts` skill、`NOIZ_API_KEY`(环境变量或文件),可用 `python3 skills/tts/scripts/tts.py config --show` 验证 API key。
- 若缺少 `yt-dlp`,运行 `uv pip install yt-dlp` 安装。
- 若 Noiz API key 未配置,运行 `python3 skills/tts/scripts/tts.py config --set-api-key YOUR_KEY`。
- 选择模式:用户点名人物(真实或虚构)→ Workflow A;用户提供图片且人物不可识别→ Workflow B;用户提供图片且人物是可识别的公众人物→ Workflow A(真实声音更真实);图片中有多人→先问用户指哪个人。
- Workflow 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}"`。
- A3 续:下载后运行 `ls tmp/chat_with_anyone/{CHARACTER_NAME}/` 识别音频文件和 SRT 字幕文件;预期为 `.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;继续前验证输出存在且非空。
- A4 续:如果脚本报告没有合适片段,尝试 `--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` 路径。
- Workflow B 清单:B1 分析图片;B2 设计声音;B3 预览(可选);B4 生成语音。
- B1:用视觉能力检查图片。若人物是能识别的公众人物→切换到 Workflow 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)、输出目录中的预览音频文件、包含最佳 voice ID 的 `voice_id.txt`。
- B2 续:读取 voice 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` 以保持一致。
- 故障处理:`yt-dlp` 下载失败或视频不可用→换一个视频 URL;部分地区/视频受限;运行 `yt-dlp -U` 更新。
- 故障处理:没有 SRT 字幕→用 `--sub-lang en,zh-Hans` 重新下载;若仍没有,换一个有自动字幕的视频。
- 故障处理:`extract_ref_segment.py` 找不到合适窗口→使用 `--min-duration 2` 获取更短片段,或换视频。
- 故障处理:声音设计返回错误→检查 Noiz API key;确保图片是清晰的人物照片。
- 故障处理:TTS 输出听起来不对→Workflow A 尝试不同参考视频;Workflow B 调整 `--voice-description`。
适用边界 · 注意事项
- 不要用于冒充他人进行欺骗、诈骗或骚扰。
- 不要使用非公开媒体或未经同意的私人个体作为参考音频。
- 不要把生成音频当作真实录音展示或传播。