---
前言
前段时间和某 DeepSeek 聊天时,偶然又动了做 TTS 的念头,于是随口问了句有没有免费的 TTS 接口。没想到它直接甩给我一个 OpenAI 的 TTS 文档,仔细一看,居然是走 UCloud 旗下优云科技(Modelverse)的 API 服务。我顿时来了精神,立马上官网注册、实名、拿 API Key,整个过程顺畅得让人意外。拿到密钥后,我马上动手写代码——从插件框架到编辑器界面,再到核心的 getAudio 与 getAudioInternal,一步步把功能堆起来。这种从零搭建的过程,不断调试、不断看到结果,对我来说始终是最过瘾的。
没想到刚写完没多久,优云科技的客服居然打电话来了。可惜我当时在上课没接到,课后加微信也没回音,只好暂时搁置。后来我把接口分享到了一个千人左右的 QQ 群,刚发出去,群里的命无言大佬就冒出来,一顿改造,做出了可通过 URL 上传音频进行声音克隆的版本。之后迷糊博士也改了一版,加入了情感控制等高级参数,让合成效果更细腻。那段时间官方文档写得比较抽象,比如情感控制方法中“0 表示无情绪”,但实际上要配合“情绪多样性”开关才有效,这些细节都是我们一点点试出来的。
后来听说要收费了,我在群里发了公告,结果没过多久又接到 UCloud 客服电话,说 TTS 继续免费,收费时间另行通知。这消息一出,群内自然是喜大普奔。
🧠 核心功能与技术实现
目前,我和迷糊博士共同实现了以下几个关键功能:
1. 声音克隆
现在无需跳转外部页面,可直接在插件内完成音色克隆。上传音频时可同步绑定情感参考音频,使合成的声音自带情感基调。注意:情感参考音频只对当前音色生效,不可全局共用。
2. 情感控制
支持通过情感权重(emo_weight)调节情感强度,并使用提示词(emo_text)指定说话情绪。例如输入“高兴地说话”或“撒娇卖萌”,甚至更具体的描述,均可生效。
3. 云端音色同步与删除
无需退出插件,即可同步最新音色列表,并可直接替换已过期的音色。同步时会自动清理旧缓存,避免因音色失效导致合成报错。
4. 高效分片传输
为避免长文本合成等待,设计并实现了分片发送与接收机制:将文本分段发送至服务器,再分段接收音频数据,最后合并为完整的 WAV 文件(采样率 22050),在保证音质的同时提升响应速度。
⚙️ 接口调用与请求分析(专业但不深奥)
如果你懂编程,可以直接使用下面的请求示例来接入;如果不太熟悉,也可以使用我们打包好的 TTS Server 宿主程序配合插件使用。
📦 请求示例(关键代码分析)
我们来看核心的 getAudio 函数中与服务器通信的部分:
```下面是一段很简单的代码示例,懂编程的朋友可以看一下
let requestBody = {
'model': 'IndexTeam/IndexTTS-2',
'input': String(text).trim(),
'voice': targetVoice,
'speed': reqSpeed,
'gain': reqGain,
'sample_rate': 22050,
'interval_silence': parseInt(ttsrv.tts.data['idx_silence'] || "200"),
'max_text_tokens_per_sentence': parseInt(ttsrv.tts.data['idx_max_tokens'] || "120")
};
```
这是一个标准的 JSON 请求结构,包含模型、输入文本、音色、语速、增益等基本参数。
🎭 情感控制参数扩展
如果开启情感控制,会根据选择的方法附加不同参数:
if (idxUseEmo === 'true') {
requestBody['emo_control_method'] = method; // 方法编号 0~3
switch(method) {
case 1: // 基于情感参考音频
requestBody['emo_weight'] = 0.6; // 控制情感强度
break;
case 2: // 基于情感向量
requestBody['emo_weight'] = 0.6;
requestBody['emo_vec'] = [0,0,0,0,0,0,0,0]; // 8维情感向量
case 3: // 基于情感文本
requestBody['emo_random'] = false; // 是否增加随机性
requestBody['emo_text'] = "高兴地说话"; // 情感提示词
}
📤 发送请求与接收响应
请求通过 HTTP POST 发送到 Modelverse 的语音合成端点:
let response = ttsrv.httpPost(
'https://api.modelverse.cn/v1/audio/speech',
JSON.stringify(requestBody),
{
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + apiKey
);
关键点分析:
· 认证方式:在请求头中使用 Bearer + API Key 进行身份验证
· 数据格式:请求体为 JSON 格式,包含所有合成参数
· 响应处理:服务器返回 200 状态码和音频二进制数据,异常时返回错误信息 JSON
🔊 音频数据处理
服务器返回的是分片的音频数据,我们需要进行合并处理:
if (response.code() !== 200) {
// 错误处理:解析错误信息
let errStr = response.body().string();
throw new Error('IndexTTS 合成失败: ' + errStr);
return response.body().bytes(); // 返回音频二进制数据
🔄 分片传输机制详解
为提高长文本合成效率,我们实现了以下流程:
1. 客户端分片:将长文本按语义或长度切分为多个片段
2. 并行发送:将分片几乎同时发送到服务器(网络允许情况下)
3. 服务器并行处理:服务器同时处理多个片段,生成对应的音频分片
4. 客户端接收与合并:按顺序接收音频分片,合并为完整 WAV 文件
这种方法显著减少了长文本的合成等待时间,提升了用户体验。
🚀 如何开始使用
如果你懂编程:
1. 注册 UCloud 账号并完成实名认证
2. 在 Modelverse API 密钥管理页面 创建并复制 API Key
3. 使用上面提供的请求结构,直接调用 https://api.modelverse.cn/v1/audio/speech 接口
4. 根据需要实现音色管理、情感控制等扩展功能
如果你不熟悉编程:
1. 可以联系命无言大佬(B站搜索 @命無言,注意是繁体“無”)
2. 或加群联系迷糊博士获取插件和宿主程序
3. 也可直接使用我们提供的临时下载链接(30天内有效)
📝 注意事项
1. 音色有效期:克隆的音色默认保留 7 天,过期后需重新克隆
2. 情感绑定:情感参考音频仅绑定到特定音色,不是全局设置
3. 速率限制:目前无严格速率限制,合成速度主要取决于网络状况
4. 合规使用:请遵守相关法律法规,勿在未授权情况下克隆他人音色
❓ 获取帮助
如有任何问题:
· 在评论区留言提问
· 联系迷糊博士或命无言大佬
· 在群内交流讨论
目前服务仍处于免费阶段,建议大家合理使用。如果需要更稳定的生产环境,建议关注官方后续的收费政策。需要下载链接的朋友,评论区找我要链接哈。
目录
---
前言
前段时间和某 DeepSeek 聊天时,偶然又动了做 TTS 的念头,于是随口问了句有没有免费的 TTS 接口。没想到它直接甩给我一个 OpenAI 的 TTS 文档,仔细一看,居然是走 UCloud 旗下优云科技(Modelverse)的 API 服务。我顿时来了精神,立马上官网注册、实名、拿 API Key,整个过程顺畅得让人意外。拿到密钥后,我马上动手写代码——从插件框架到编辑器界面,再到核心的 getAudio 与 getAudioInternal,一步步把功能堆起来。这种从零搭建的过程,不断调试、不断看到结果,对我来说始终是最过瘾的。
没想到刚写完没多久,优云科技的客服居然打电话来了。可惜我当时在上课没接到,课后加微信也没回音,只好暂时搁置。后来我把接口分享到了一个千人左右的 QQ 群,刚发出去,群里的命无言大佬就冒出来,一顿改造,做出了可通过 URL 上传音频进行声音克隆的版本。之后迷糊博士也改了一版,加入了情感控制等高级参数,让合成效果更细腻。那段时间官方文档写得比较抽象,比如情感控制方法中“0 表示无情绪”,但实际上要配合“情绪多样性”开关才有效,这些细节都是我们一点点试出来的。
后来听说要收费了,我在群里发了公告,结果没过多久又接到 UCloud 客服电话,说 TTS 继续免费,收费时间另行通知。这消息一出,群内自然是喜大普奔。
---
🧠 核心功能与技术实现
目前,我和迷糊博士共同实现了以下几个关键功能:
1. 声音克隆
现在无需跳转外部页面,可直接在插件内完成音色克隆。上传音频时可同步绑定情感参考音频,使合成的声音自带情感基调。注意:情感参考音频只对当前音色生效,不可全局共用。
2. 情感控制
支持通过情感权重(emo_weight)调节情感强度,并使用提示词(emo_text)指定说话情绪。例如输入“高兴地说话”或“撒娇卖萌”,甚至更具体的描述,均可生效。
3. 云端音色同步与删除
无需退出插件,即可同步最新音色列表,并可直接替换已过期的音色。同步时会自动清理旧缓存,避免因音色失效导致合成报错。
4. 高效分片传输
为避免长文本合成等待,设计并实现了分片发送与接收机制:将文本分段发送至服务器,再分段接收音频数据,最后合并为完整的 WAV 文件(采样率 22050),在保证音质的同时提升响应速度。
---
⚙️ 接口调用与请求分析(专业但不深奥)
如果你懂编程,可以直接使用下面的请求示例来接入;如果不太熟悉,也可以使用我们打包好的 TTS Server 宿主程序配合插件使用。
📦 请求示例(关键代码分析)
我们来看核心的 getAudio 函数中与服务器通信的部分:
```下面是一段很简单的代码示例,懂编程的朋友可以看一下
let requestBody = {
'model': 'IndexTeam/IndexTTS-2',
'input': String(text).trim(),
'voice': targetVoice,
'speed': reqSpeed,
'gain': reqGain,
'sample_rate': 22050,
'interval_silence': parseInt(ttsrv.tts.data['idx_silence'] || "200"),
'max_text_tokens_per_sentence': parseInt(ttsrv.tts.data['idx_max_tokens'] || "120")
};
```
这是一个标准的 JSON 请求结构,包含模型、输入文本、音色、语速、增益等基本参数。
🎭 情感控制参数扩展
如果开启情感控制,会根据选择的方法附加不同参数:
```下面是一段很简单的代码示例,懂编程的朋友可以看一下
if (idxUseEmo === 'true') {
requestBody['emo_control_method'] = method; // 方法编号 0~3
switch(method) {
case 1: // 基于情感参考音频
requestBody['emo_weight'] = 0.6; // 控制情感强度
break;
case 2: // 基于情感向量
requestBody['emo_weight'] = 0.6;
requestBody['emo_vec'] = [0,0,0,0,0,0,0,0]; // 8维情感向量
break;
case 3: // 基于情感文本
requestBody['emo_weight'] = 0.6;
requestBody['emo_random'] = false; // 是否增加随机性
requestBody['emo_text'] = "高兴地说话"; // 情感提示词
break;
}
}
```
📤 发送请求与接收响应
请求通过 HTTP POST 发送到 Modelverse 的语音合成端点:
```下面是一段很简单的代码示例,懂编程的朋友可以看一下
let response = ttsrv.httpPost(
'https://api.modelverse.cn/v1/audio/speech',
JSON.stringify(requestBody),
{
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + apiKey
}
);
```
关键点分析:
· 认证方式:在请求头中使用 Bearer + API Key 进行身份验证
· 数据格式:请求体为 JSON 格式,包含所有合成参数
· 响应处理:服务器返回 200 状态码和音频二进制数据,异常时返回错误信息 JSON
🔊 音频数据处理
服务器返回的是分片的音频数据,我们需要进行合并处理:
```下面是一段很简单的代码示例,懂编程的朋友可以看一下
if (response.code() !== 200) {
// 错误处理:解析错误信息
let errStr = response.body().string();
throw new Error('IndexTTS 合成失败: ' + errStr);
}
return response.body().bytes(); // 返回音频二进制数据
```
🔄 分片传输机制详解
为提高长文本合成效率,我们实现了以下流程:
1. 客户端分片:将长文本按语义或长度切分为多个片段
2. 并行发送:将分片几乎同时发送到服务器(网络允许情况下)
3. 服务器并行处理:服务器同时处理多个片段,生成对应的音频分片
4. 客户端接收与合并:按顺序接收音频分片,合并为完整 WAV 文件
这种方法显著减少了长文本的合成等待时间,提升了用户体验。
---
🚀 如何开始使用
如果你懂编程:
1. 注册 UCloud 账号并完成实名认证
2. 在 Modelverse API 密钥管理页面 创建并复制 API Key
3. 使用上面提供的请求结构,直接调用 https://api.modelverse.cn/v1/audio/speech 接口
4. 根据需要实现音色管理、情感控制等扩展功能
如果你不熟悉编程:
1. 可以联系命无言大佬(B站搜索 @命無言,注意是繁体“無”)
2. 或加群联系迷糊博士获取插件和宿主程序
3. 也可直接使用我们提供的临时下载链接(30天内有效)
---
📝 注意事项
1. 音色有效期:克隆的音色默认保留 7 天,过期后需重新克隆
2. 情感绑定:情感参考音频仅绑定到特定音色,不是全局设置
3. 速率限制:目前无严格速率限制,合成速度主要取决于网络状况
4. 合规使用:请遵守相关法律法规,勿在未授权情况下克隆他人音色
---
❓ 获取帮助
如有任何问题:
· 在评论区留言提问
· 联系迷糊博士或命无言大佬
· 在群内交流讨论
目前服务仍处于免费阶段,建议大家合理使用。如果需要更稳定的生产环境,建议关注官方后续的收费政策。需要下载链接的朋友,评论区找我要链接哈。