SKILL.md
QQ 点歌:小鲸唱一首#
本技能依赖本地的 RVC 换声工作流与 TTS 语音服务,命令里的路径请按你自己的环境替换。
一句话流程#
- 回一句短的(「好,等我几分钟」),别干等着不吭声。
- 释放显存:
curl -s -X POST http://127.0.0.1:<TTS端口>/unload - 出整首翻唱 → 4. 切 40 秒 → 5. 用语音条发出去。
全部命令都在 ~/.dsh-workspace\rvc2 目录下跑,先 export 这几个环境变量:
cd "~/.dsh-workspace/rvc2"
export PYTHONIOENCODING=utf-8
export TMP="~/.dsh-workspace/tmp" TEMP="~/.dsh-workspace/tmp" TMPDIR="~/.dsh-workspace/tmp"
出整首翻唱#
"python" cover.py "<歌名 歌手>" "assets/weights/xiaojing.pth" 0 "<标签>"
- 标签随便起,用来做文件名,例如
我本将心向明月。 - 下载 → 人声分离 → 45 秒分段换声 → 拼接混音,一般 3~6 分钟。
- 成功时最后一行是
OUT <mp3 路径>,产物在out/<标签>.mp3。 - 音源顺序(脚本里已写好,不用管):网易云 → SoundCloud → YouTube → B站。网易云是唯一在国内稳定的,整首能下;其它三个经常超时或 412。四个全失败才算真的下不到。
网易云会员音质(cookie)#
已接入会员账号,下载音质顺序 hires/lossless/exhigh/bestaudio(会员无损优先,实测一首 5 分钟歌约 115MB flac)。
cookie 文件:~/.dsh-workspace\rvc2\netease_cookies.txt(Netscape 格式,含 MUSIC_U)。脚本每次下网易云都先带它;带了失败会自动退回匿名(普通码率,但仍是完整整曲,不影响出歌)。
cookie 一般能撑很久,哪天发现音质掉回 320k 就是过期了,重新登录一次:
# 1. 起一个独立的 Edge(专用 profile,不动用户平时的 Edge)
powershell -NoProfile -Command "Start-Process 'msedge.exe' -ArgumentList '--remote-debugging-port=9334','--user-data-dir=~/.dsh-workspace\edge-netease-profile','https://music.163.com/#/login'"
# 2. 让用户在那个窗口扫码登录,登录完再执行:
"python" export_netease_cookies.py
# 3. 导出完关掉这个 Edge(只杀这个实例,别动用户自己的 Edge)
export_netease_cookies.py 通过 CDP Network.getAllCookies 读出 cookie 并写成 cookies.txt,成功后打印 has MUSIC_U: True。这个专用 profile 会保留登录态,下次重登通常不用再扫码。
去噪重混(建议每次都跑)#
"python" gate_vocal.py "<标签>"
输出 out/<标签>_gated.mp3。作用:按源人声能量做门限,把前奏、间奏里 RVC 生成的沙沙声压掉,并用定值增益对齐响度(不要改回单遍 loudnorm,会把静音段底噪抬成嘶声)。
切 40 秒语音条#
"python" qq_sing.py "out/<标签>_gated.mp3"
- 自动跳过前奏、挑能量最高的 40 秒(通常是副歌),输出 32k 单声道 wav:
out/<标签>_gated_qq40.wav。 - 想换长度:
--seconds 30。 - 最后一行是
OUT <wav 路径>。
发出去#
整条回复只写这一行,[[voice]] 必须在最开头,前面不能有任何字:
[[voice]]@@SING@@~/.dsh-workspace/rvc2/out/<标签>_gated_qq40.wav
- 语音服务看到
@@SING@@就把这个文件当音频返回,QQ 通道再压成语音条。不要发文件,除非用户明确说「发文件」。 - 路径写正斜杠,绝对路径,别加引号。
失败怎么办#
| 现象 | 处理 |
|---|---|
ERR 下载失败 | 音源全挂。换一首歌或过一会儿再说;别反复重试同一条,最多试两次。 |
torch.OutOfMemoryError / CUDA out of memory | 显存被占。先 POST /unload 再重跑;还不行就跟用户说这台机器现在腾不出显存,等几分钟。 |
No usable added index | --index 路径写错,索引是 F:\DSH\rvc-index\xiaojing_added_IVF920_Flat_nprobe_1_xiaojing_v2.index(脚本里已默认设好,一般不会遇到)。 |
| 出来的歌前奏有沙沙声 | 没跑 gate_vocal.py,补跑。 |
| 语音条发出去没声音/没收到 | 检查 wav 存在且大于 1MB;[[voice]] 是否在整条回复最开头。 |
音色与参数#
- 权重:
assets/weights/xiaojing.pth(Breeze 语音语料训 200 轮,13.8 分钟语料)。 - 索引:
F:\DSH\rvc-index\xiaojing_added_IVF920_Flat_nprobe_1_xiaojing_v2.index,index-rate 0.65(实测 0.65 咬字最清楚;0.5 更清楚但音色会偏,0.8 音色准但字糊)。 pitch 0是原调;女声唱男声原调可以--pitch 7之类,太高会尖,7 以内比较稳。- 一首歌不要在 GPU 上并行跑两遍,会 OOM。
别做的事#
- 不要在训练/其它 GPU 任务进行时点歌(会 OOM),先问一句或直接说明。
- 不要用
Get-Process pythonw | Stop-Process清显存:会把模型入口进程一起杀掉,整台机器的模型请求全 500。只按具体 PID 杀,或者用/unload。 - 不要为了「修好」重启 DSH。
用途与依赖
作者没写,这些是平台读文件后整理的,以文件为准。
使用示例
请求:用你的声音唱一首《起风了》
预期
先回一句「好,等我几分钟」,然后释放显存、下载音源并生成整首翻唱,去噪重混后截取 40 秒副歌,最后以 [[voice]]@@SING@@ 语音条把片段发出去。
- 适用场景
- 用户说「唱首歌」「点歌」
- 用户要求「用你的声音唱 XX」
- 用户指定歌名歌手要求翻唱
- 需要把翻唱片段以 QQ 语音条形式发送
- 需要从整首翻唱中截取副歌 40 秒片段
- 输入
- 歌名与歌手(如「起风了 买辣椒也用券」)
- 用于命名文件的标签(可选,脚本可自动生成)
- 片段长度(可选,默认 40 秒)
- 音调调整 pitch(可选,默认 0 原调)
- 输出
- 整首翻唱 mp3(out/<标签>.mp3)
- 去噪重混后的 mp3(out/<标签>_gated.mp3)
- 40 秒语音条 wav(out/<标签>_gated_qq40.wav)
- 以 [[voice]]@@SING@@ 形式发出的 QQ 语音条
- 运行环境
- Python 3(Windows 环境,需本机 GPU 与 RVC 换声工作流、本地 TTS 语音服务)
- 依赖
- RVC 换声工作流(cover.py 等脚本)
- 本地 TTS 语音服务(提供 /unload 接口)
- torch / CUDA(GPU 推理)
- ffmpeg 等音频处理工具
- Edge 浏览器(仅重新导出网易云 cookie 时使用)

