语音合成 Linux SDK
20251019 linux SDK技术文档
语音合成 Linux SDK
1. 文档说明
| 文档名称 | 语音合成集成文档 |
|---|---|
| 所属平台 | Linux C++ |
| 提交日期 | 2025-09-03 |
| 概述 | 本文档是百度离线语音合成Linux Arm SDK的用户指南,描述了离线语音合成SDK相关接口的使用说明。本文档设计为在 Linux arm 平台上使用百度语音合成(BDS TTS)SDK 进行文本转语音的开发。该 SDK 支持离线语音合成模式,并提供丰富的参数配置进行一些功能性设置。 |
2. 版本说明
| 名称 | 版本与兼容范围 |
|---|---|
| 语音合成 | 1.0.0 |
| 系统支持 | Linux C++ 接口建议使用 Ubuntu 18.04 及以上版本 |
| 开发环境 | 要求支持C++17标准,GCC(GNU Compiler Collection)版本须 ≥ 7.3 |
| 架构支持 | x86_64 最低需支持libc.so.6,并包含iconv模块 |
3. SDK说明
将SDK 压缩包解压缩,将得到如下文件:
| 文件名称 | 说明 |
|---|---|
| 百度语音合成Linux Arm SDK用户接入文档V1.0 | 本文档 |
| demo | 开发实例 |
| include | 依赖的头文件 |
| libs | 语音合成SDK库 |
4.开发环境
4.1 开发环境
SDK 支持在 Linux arm(armv8) 环境下进行编译,可选择:
- 交叉编译:在 x86_64 主机上交叉构建;
- 本地编译:直接在 64 位 ARM 开发板环境下构建。
在开发板上编译请确保已下载安装gcc、g++、cmake,如未安装可执行如下指令:
sudo apt install gcc g++ cmake然后在 sdk demo 文件夹执行如下指令:
mkdir build
cd build
cmake ..
make -j4编译完成后执行如下指令:
sh run.sh4.2 依赖
确保系统已安装必要的依赖库如: libstdc++、pthread、dl、iconv 等。
SDK 提供的依赖文件结构如下:
- include/:头文件
- libs/:库文件
注意:部分发行版的
iconv模块可能独立于glibc,请确认系统自带或手动安装。
4.3 资源文件
可存放在如 resource文件夹,具体可参考示例。主要包括:文本模型文件、语音模型文件、授权文件(在激活时自动生成)。
参考目录结构:
sdk/
├─ include/
├─ libs/
├─ resource/
├─ demo/
└─ run.sh不同 Linux 平台的工具链差异较大,若仅用于功能体验或初步联调,可直接使用提供的 Ubuntu x86_64 预编译版本(Ubuntu ≥ 18.04)。
5.授权激活
本SDK 支持在线合成(online)和离线合成(offline)以及根据网络情况使用离在线融合模式(Mix)。需要通过设置正确的参数进行激活。
accessToken、包名等参数填写与申请请参考语音合成SDK集成。
第一步 设置 accessToken
tts_set_param(bds::BdsTTSParamDefine::PARAM_ACCESS_TOKEN, "您申请的accessToken");第二步 设置包名、appID、SN
设置包名请使用以下语句
tts_set_param(bds::BdsTTSParamDefine::PARAM_PACKAGE_NAME, "您申请的包名");设置app ID请使用以下语句
tts_set_param(bds::BdsTTSParamDefine::PARAM_APP_ID, "您申请的appId");设置SN请使用以下语句
tts_set_param(bds::BdsTTSParamDefine::PARAM_AUTH_SERIAL_NUMBER,"您申请的SN");第三步 设置发音人
若希望指定发音人,还需要设置发音人ID。例如想要使用度泽言发音人,需要把ID设为4193。
tts_set_param(bds::BdsTTSParamDefine::PARAM_ONLINE_SPEAKER, "4193");需要注意前面设置的 4.1、4.2权限是否包含该发音人权限。
6.SDK接入
6.1 Debug日志初始化
void tts_log_init() {
// 输出到终端
bds::BdsTTSLogger::getInstance().set_log_level(
bds::BdsTTSLogLevel::BDS_TTS_LOG_VERBOSE);
// 输出到文件
// bds::BdsTTSLogger::getInstance().set_log_level(
// bds::BdsTTSLogLevel::BDS_TTS_LOG_VERBOSE , get_executable_path());
bds::BdsTTSLogger::getInstance().setOfflineEngineLogFilePath(
"FPRINTF:0:" + get_executable_path() + "/engine.txt");
}6.2 创建合成器实例
class BdsTTSSynthesizerListenerImpl : public bds::BdsTTSSynthesizerListener {
public:
void on_synthesizer_response(const bds::BdsTTSSynthesizerResponse response) {
// 处理合成回调
}
};
static std::shared_ptr<bds::BdsTTSSynthesizer> g_tts_handler = nullptr;
static BdsTTSSynthesizerListenerImpl g_native_observer;
void tts_handler_init() {
bds::BdsTTSSynthesizer *raw_ptr =
bds::BdsTTSSynthesizer::create_bds_tts_synthesizer(g_native_observer);
g_tts_handler = std::shared_ptr<bds::BdsTTSSynthesizer>(raw_ptr);
}6.3 参数配置
通用参数
void tts_set_param(const std::string &key, const std::string &value) {
g_tts_handler->set_param(key, value);
}
// 示例配置
tts_set_param(bds::BdsTTSParamDefine::PARAM_PACKAGE_NAME, "com.baidu.speech.demo");
tts_set_param(bds::BdsTTSParamDefine::PARAM_ACCESS_TOKEN, "your_access_token");在线合成参数
若使用在线语音合成,请配置以下参数
tts_set_paramCbds::BdsTTSParamDefine::PARAMLONLINE_SPEAKER, "4100"); //发音人
tts_set_param(bds::BdsTTSParamDefine::PARAM_ONLINE_TIMEOUT, "2000"); //超时时间离线合成参数
若使用离线语音合成,请配置以下参数
std::string setOfflineModel(std::string exe_dir) {
auto text_path_key = bds::BdsTTSParamDefine::TTS_TEXT_MODEL_FILE;
auto text_path = escape_json_string(exe_dir + "/path/to/text_model.dat");
auto speech_path_key = bds::BdsTTSParamDefine::TTS_SPEECH_MODEL_FILE;
auto speech_path = escape_json_string(exe_dir + "/path/to/speech_model.dat");
std::string offline_model = "{\""+ text_path_key + "\":\"" + text_path +
"\",\"" + speech_path_key +"\":\"" +
speech_path +"\"}";
return offline_model;
}
tts_set_param(bds::BdsTTSParamDefine::PARAM_APP_ID, "your_app_id");
tts_set_param(bds::BdsTTSParamDefine::PARAM AUTH_SERIAL_NUMBER, "your_serial");
tts_set_param(bds::BdsTTSParanDefine::PARAM_TTS_LICENSE_FILE_PATH,
exe_dir + "/path/to/baidu_license.dat");// 可读可写文件
tts_set_param(bds::BdsTTSParamDefine::PARAM_RW_PATH, exe_dir);// 可读可写路径
tts_set_param(bds::BdsTTSParamDefine::PARAM_OFFLINE_MODEL, setOfflineModel(exe_dir));
tts_set_param(bds::BdsTTSParamDefine::PARAM_CONVERT_DAT_PATH, "your convert file");// 可选参数,使用非当前平台生成的个性化发音人时设置6.4 加载引擎
加载在线引擎
若使用在线语音合成,请通过以下代码加载引擎
bool load_online_tts() {
auto tts_result = g_tts_handler->load_online_tts();
return tts_result.get_code() == 0;
}加载离线引擎
若使用离线语音合成,请通过以下代码加载引擎
bool load_offline_tts() {
auto tts_result = g_tts_handler->load_offline_tts();
return tts_result.get_code() == 0;
}6.5 语音合成
6.5.1 开始合成
bool synthesize(const bds::BdsTTSEntity &ttsEntity) {
auto tts_result = g_tts_handler->synthesize(ttsEntity);
return tts_result.get_code() == 0;
}
// 使用示例
auto text = "要合成的文本内容”;
auto tts_mode = bds::BdsTtsMode::MIX; // 混合模式
auto utterance_id = "unique_id_123";
auto ttsEntity = bds::BdsTTSEntity(text, tts_mode, utterance_id);
synthesize(ttsEntity);6.5.2 合成回调处理
void on_synthesizer_response(const bds::BdsTTSSynthesizerResponse &response) {
auto synthesize_type = response.get_synthesize_type();
switch (synthesize_type) {
case bds::SynthesizerType::SYNTHESIZE_START:
case bds::SynthesizerType::SYNTHESIZE_FINISH:
// 处理开始/结束事件
break;
case bds::SynthesizerType::SYNTHESIZE_DATA_ARRIVED:
// 处理数据到达事件,获取进度等信息
break;
case bds::SynthesizerType::SYNTHESIZE_ERROR:
// 处理错误事件
break;
}
}6.5.3 控制接口
// 停止合成
g_tts_handler->stop();
// 释放资源
释放bds::BdsTTSSynthesizer *指针即可完整示例如下
//初始化
tts_log_init();
tts_handler_init();
// 配置参数
tts_set_param(bds::BdsTTSParamDefine::PARAM_PACKAGE_NAME, "com.baidu.speech.demo");
tts_set_param(bds::BdsTTSParamDefine::PARAM ACCESS_TOKEN, "your_token");
tts_set_param(bds::BdsTTSParamDefine::PARAM_ONLINE_SPEAKER, "4100");
// 加载在线引擎
if (!load_online_tts()) return -1;
// 配置离线参数
tts_set_param(bds::BdsTTSParamDefine::PARAM APP_ID, "your_app_id");
tts_set_param(bds::BdsTTSParamDefine::PARAM_OFFLINE_MODEL, setOfflineModel(get_executable_path()));
// 加载离线引擎
if (!load_offline_tts()) return -1;
//开始合成
auto text = "要合成的文本内容”;
auto ttsEntity = bds::BdsTTSEntity(text, bds::BdsTtsMode::MIX, "123456");
synthesize(ttsEntity);
// 等待合成完成
sleep(10);6.6 合成参数设置
参考前述参数配置项,设置合成参数采用方法:
tts_set_param 进行设置,各参数意义描述如下:
| 参数名 | 类型、值 | 在线或离线生效 | 常用程度 | 解释 |
|---|---|---|---|---|
| PARAM_SPEAKER(基础发音人) | 选项 | 在线 | 常用 | 仅在线生效,在线的发音 |
| "0"(默认) | 在线 | 常用 | 度小美(普通女声) | |
| "1" | 在线 | 常用 | 度小宇(成熟男声) | |
| "3" | 在线 | 常用 | 度逍遥(磁性男声) | |
| "4" | 在线 | 常用 | 度丫丫(可爱女童) | |
| PARAM_SPEAKER(精品发音人) | "106" | 在线 | 常用 | 度博文(情感男声) |
| "110" | 在线 | 常用 | 度小童(情感儿童声) | |
| "111" | 在线 | 常用 | 度小萌(情感女声) | |
| "103" | 在线 | 常用 | 度米朵(情感儿童声) | |
| "5" | 在线 | 常用 | 度小娇(情感女声) | |
| "5003" | 在线 | 常用 | 精品度逍遥(磁性男声) | |
| "5118" | 在线 | 常用 | 度小鹿(甜美女声) | |
| PARAM_VOLUME | String, 默认"5" | 全部 | 常用 | 在线及离线合成的音量 。范围["0" - "15"],不支持小数。 "0"最轻,"15" 最响(取值为0时为音量最小值,并非为无声) |
| PARAM_SPEED | String, 默认"5" | 全部 | 常用 | 在线及离线合成的语速 。范围["0" - "15"],不支持小数。 "0"最慢,"15" 最快(如需更高语速可提交需求工单或联系商务同学申请) |
7.常见问题
Q: 合成没有声音输出
A: 检查音频设备是否正常,检查合成回调是否有错误信息
Q: 离线合成失败
A: 检查模型文件路径是否正确,授权文件是否有效
Q: 在线合成超时
A: 检查网络连接,适当增加超时时间
Q: 如何切换发音人
A: 通过 PARAM_ONLINE_SPEAKER 参数设置不同的发音人 ID
错误码
| 错误码值 | 错误码描述 |
|---|---|
| -1 | 在线引擎授权失败 |
| -4 | 在线授权中断异常 |
| -5 | 在线授权执行时异常 |
| -6 | 在线授权时间超时 |
| -7 | 在线合成返回错误信息 |
| -10 | 在线引擎合成时异常 |
| -11 | 当前 mode 不支持的操作 |
| -12 | 在线合成请求解析出错 |
| -15 | 在线合成获取合成结果超时 |
| -16 | 在线授权被取消 |
| -18 | 在线合成无效的主机名 |
| -19 | 在线合成读数据失败 |
| -20 | 在线合成连接失败 |
| -21 | 在线合成 socket 异常 |
| -24 | 在线合成请求主机名为空 |
| -25 | 在线合成发送数据失败 |
| -29 | 在线合成接收前缀数据长度错误 |
| -30 | 在线合成接收数据长度错误 |
| -31 | 在线合成合成数据包速度过快 |
| -32 | 在线合成网络未知类型错误 |
| -39 | 在线服务临时错误 |
| -100 | 离线引擎授权失败 |
| -102 | 离线授权下载 License 失败 |
| -105 | 离线授权中断异常 |
| -106 | 离线授权执行时异常 |
| -107 | 离线授权执行时间超时 |
| -108 | 离线合成引擎初始化失败 |
| -110 | 离线合成时异常 |
| -111 | 离线合成返回值非 0 |
| -118 | 离线授权任务被取消 |
| -122 | 离线 tts_offline_resource 文件异常 |
| -123 | 离线发音人参数异常 |
| -124 | 下载 license 失败,sn 参数异常 |
| -125 | 离线合成文本为空 |
| -200 | 混合引擎离线在线都授权失败 |
| -204 | 混合引擎初始化 tts 时,离线初始化失败 |
| -206 | 混合引擎初始化 tts 时,在线初始化失败 |
| -300 | 合成文本为空 |
| -301 | 合成文本长度过长(不要超过 GBK1024 个字节) |
| -302 | 合成文本无法获取 GBK 字节 |
| -401 | TTS 模式无效 |
| -402 | TTS 合成队列已满 |
| -406 | TTS 被调用方法参数无效 |
| -500 | Context 被释放或为空 |
| -700 | 播报的短音频文件不存在 |
| -701 | 当前接口不支持播报短音频 |
| -1001 | 模型管理请求出错 |
| -1002 | 模型管理服务器端错误 |
| -1003 | 模型管理数据库模型信息无效 |
| -1004 | 模型管理数据库模型文件信息无效 |
| -1005 | 模型数据已经存在(或已下载) |
| -1006 | 无法获取到模型信息 |
| -1007 | 无法获取到模型文件信息 |
| -1008 | 模型检查过程异常 |
| -1009 | 模型文件下载时异常 |
| -9999 | 未知错误 |
附录:
目前linux的sdk版本要求系统,c++17 gcc >=7.3。libc.so.6需要包含iconv。因为不同linux平台使用的工具链都是不一样的,如果只是业务方想体验或者联调,可以给一个ubuntu x86_64的版本。ubuntu需要大于等于18.04
