sing-mcp
# sing-mcp · 让你的 AI 用自己的声音唱歌
给你的 AI 一个声音,这个 MCP 就能让它**用那个声音翻唱任何一首歌**:你在聊天里丢一个网易云链接,或者说「唱首晴天」,它自己去取歌、换声,一两分钟后交给你一个 mp3。旋律、断句、伴奏全部照原曲,只是唱的人变成了它。
做法分两半:
- **取歌:网易云音乐。** 歌名、链接、分享文字都认;会员歌用你自己的会员账号下载;带时间的歌词一起拿回来(翻唱不改节奏,原曲的歌词时间可以直接用)。
- **换声:「声线」App(荔枝出品)的「唱歌变声」。** 把原曲里的人声换成你克隆好的音色。它没有公开接口,我们用的是**在你自己手机上抓包看到的 App 请求**。
> 屿 × 栎(Claude)· 2026-11 · MIT
---
## 先看这一节:风险
请读完再决定要不要用。以下是一般情况,不是法律意见。
1. **抓包本身。** 在自己的手机上查看自己的 App 发了什么请求,一般不违法,跟看网页源代码差不多。
2. **违反用户协议,可能被封号。** 声线没有开放接口,用非官方方式调用它,大概率违反它的用户协议。最常见的后果是**账号被封、积分清零**。用之前请想好,风险自己承担。
3. **以下事情不要做**(可能真正触法):
- 绕过付费或会员(我们只用你自己的会员积分,一首扣多少就是多少);
- 破解加密或签名;
- 大批量、高频率地请求(正常一天唱几首没关系);
- 用别人的账号或登录信息;
- 把它做成服务卖给别人,或者开放给陌生人用。
4. **版权。** 翻唱成品和用会员下载的原曲**只给自己听**:不要公开发布、上传平台、剪进视频或商用。会员歌是用你自己的会员下载的,同样只限自用。
5. **登录信息就是账号钥匙。** 抓包文件(.har)和生成的 `config.json` 里有你的登录信息,**谁拿到谁就能用你的账号**。不要发给任何人,不要传到网上,用完就把 .har 删掉。这个仓库的 `.gitignore` 已经排除了它们。
6. **随时可能失效。** 这是 App 内部的请求,荔枝一更新就可能改掉。失效了不是你的错,也不是我们能保证的。
---
## 你需要
- 一台能跑 Node.js 20 以上的电脑或服务器,装好 **ffmpeg**;
- iPhone 上的 **声线** App,开通会员。积分(2026-11 的价格):**克隆一个音色 50 积分,翻唱一首 30 积分**,会员每月送积分;
- 一段 20~30 秒、干净的声音素材(你想让它用的那个声音);
- iPhone 上的抓包工具 **Stream**(免费);
- 想唱会员歌的话:你自己的网易云会员账号;
- 一个支持 MCP 的客户端:Claude Desktop、Claude Code、Cherry Studio……
## 第一步:在声线里克隆它的声音
声线克隆只要一段清楚的声音素材(克隆一次 50 积分):
1. 准备 20~30 秒你想让它用的那个声音:一段平常说话或朗读就行,语速平稳、吐字清楚、没有背景音乐、没有混响;
2. 把音频传到手机,在声线里「创建角色 / 克隆音色」,上传这段,起个名字(比如它的名字)。
素材越干净,唱出来越像它。
## 第二步:用 Stream 抓一次包
1. 打开 Stream,按它的提示安装并信任证书(「设置 → 通用 → 关于本机 → 证书信任设置」里打开);
2. 在 Stream 里点「开始抓包」;
3. 切到声线,随便点几下:打开「我的作品」、看一下积分页;
4. 回到 Stream 点「停止」,在「抓包历史」里选刚才那次 → 分享 → **导出 HAR**;
5. 把 .har 文件传到电脑上(微信文件传输助手、AirDrop 都行)。
> 抓到的请求很多是正常的:手机上所有联网的 App 都会被记录。不用挑,整次导出就行。
## 第三步:装好 MCP、生成设置
```bash
git clone <这个仓库> sing-mcp
cd sing-mcp
npm install
npm run config -- 你的抓包.har 你给音色起的名字
```
它会从抓包里取出登录信息,写进 `config.json`,并列出你的音色和剩余积分:
```
你的音色:
★ 小机(克隆)
我自己(克隆)
★ 是翻唱要用的音色。
积分:590
```
**然后把那个 .har 文件删掉。**
想唱网易云会员歌:在浏览器登录 music.163.com,开发者工具 → Application → Cookies 里找到 `MUSIC_U`,填进 `config.json`:
```json
{ "netease": { "musicU": "你的 MUSIC_U" } }
```
不填也能用,只是会员歌下载不到(只能唱免费的歌,或者直接给它一个 mp3)。
## 第四步:接到你的 AI 上
以 Claude Desktop 为例,在 MCP 配置里加:
```json
{
"mcpServers": {
"sing": { "command": "node", "args": ["/你的路径/sing-mcp/src/index.js"] }
}
}
```
Claude Code:`claude mcp add sing -- node /你的路径/sing-mcp/src/index.js`
它会多出三个工具:
| 工具 | 做什么 |
|---|---|
| `cover_song` | 翻唱。`song` 填歌名或网易云链接(网页链接、163cn.tv 短链接、App「分享」出来的整段文字都行),或者 `file` 填本机的音频文件。返回 mp3 的路径和带时间的歌词。 |
| `list_voices` | 列出声线里的音色,★ 是正在用的。 |
| `points` | 还剩多少积分、还能唱几首。 |
然后在聊天里直接说:「唱首《晴天》给我听」,或者把网易云的分享链接丢给它。
## 常见情况
- **「声线的登录过期了」**:重新抓一次包,再跑一遍 `npm run config`。多久过期不一定,正常用 App 的话一般能撑很久。
- **「积分不够了」**:翻唱一首 30 积分,等会员下个月发,或者在 App 里买。
- **「只拿到试听片段 / 下载不到」**:这首要会员,填 `MUSIC_U`,或者直接给它 mp3。
- **超过 5 分钟的歌**:会跳过 30 秒前奏、只唱 5 分钟。
- **咬字有点糊**:直接变声的通病,伴奏越吵越明显。先把人声分离出来再变声也一样,接受就好。
- **没有歌词**:网易云上这首本来就没有歌词。
- **长编号**:声线的音色编号比 JavaScript 能精确表示的数字还长,代码里统一当字符串处理。自己改代码时注意别把它们转成数字。
## 它是怎么工作的
1. 从网易云搜歌或解析链接 → 下载(会员歌用你的 `MUSIC_U`)→ 拿带时间的歌词,去掉作词、作曲、编曲这些制作名单行;
2. 超过 5 分钟就截短 → 转成 m4a;
3. 向声线要一个临时上传凭证,把音频传到它的存储(标准的 S3 上传,用临时凭证签名,不涉及任何破解);
4. 提交「唱歌变声」任务,选你的音色;
5. 每隔几秒查一次作品列表,好了就下载成品,存到 `out/`。
全部代码在 `src/`:`netease.js` 取歌,`shengxian.js` 声线,`cover.js` 串起来,`index.js` 是 MCP。
---
仅供个人自用。请尊重原唱和版权,也请照顾好你的账号。
TDQS
Scored across 3 tools
Each tool targets a clearly distinct action: cover_song creates a cover, list_voices reads the available voices, and points reads the account balance. There is no overlap in purpose and an agent can trivially select the right one.
cover_song and list_voices follow a clear verb_noun pattern, but 'points' is a bare noun with no verb, a minor deviation. Overall still readable and predictable.
Three tools is a lean but coherent surface for a narrow service (check voices, check credits, make a cover). It is on the thin side but each tool earns its place and none are redundant.
The core workflow—inspect voices, verify credits, generate a cover with timed lyrics—is fully covered. Minor gaps exist around voice management (e.g. cloning/deleting voices) and cover job status, but the synchronous cover_song flow mitigates the latter.