我做了个index-tts的手机版,感兴趣的朋友快来观望吧。

---


前言


前段时间和某 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. 合规使用:请遵守相关法律法规,勿在未授权情况下克隆他人音色


---


❓ 获取帮助


如有任何问题:


· 在评论区留言提问

· 联系迷糊博士或命无言大佬

· 在群内交流讨论


目前服务仍处于免费阶段,建议大家合理使用。如果需要更稳定的生产环境,建议关注官方后续的收费政策。需要下载链接的朋友,评论区找我要链接哈。

发表于:2026-02-03 10:03
2个回复
您还没有登录,登录后才可回复。 登录 注册