资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

语音合成 HarmonyOS SDK

1. 文档说明

文档名称 语音合成集成文档
所属平台 HarmonyOS
提交日期 2026-08-11
概述 百度语音合成客户端Harmony版SDK(以下简称BDTTSClient)是一种面向HarmonyOS设备的语音合成解决方案,以Har包的形式发布。目前版本已支持SDK内部直接播放合成语音和从SDK获取语音数据,并支持男女声、语速、音调、音量、音频码率设置。
若您在2025年11月27日及之前购买或申请SN(序列号),请点击下载往期基础音库资源,及往期精品音库资源。详细发音人信息请看离线发音人列表
短语说明 语音合成:将文本合成为语音,即声音文件
合成引擎:将文本合成为语音的核心模块
TTS:Text To Speech,即“从文本到语音”
BDTTSClient:语音合成SDK简称,是一个封装了网络收发、音频播放功能的语音合成解决方案。
语音合成SDK:封装网络收发、音频播放功能,可快速集成

2. 版本说明

名称 版本号 说明
语音合成 1.1.3 语音合成demo版本
系统支持 HarmonyOS 6.0.0(APILevel 20)+ 需要开发者通过compatibleSdkVersion来保证支持系统的检测
架构支持 arm64-v8a 仅适配arm64-v8a架构,不支持x86等其他架构

3. SDK说明

3.1 开发包说明

文件名称 说明
doc/Baidu_TTS_SDK_Harmony_Manual.pdf 完整集成文档(含离线授权补充内容)
har 语音合成har包版本baidu_tts_1.0.3(1.0.3三端统一版本)
BaiduTtsDemo 开发示例(DevEco Studio project,含离线授权配置demo)
version.readme 产物版本说明(含so库、har包版本信息)

3.2 总体框图

image.png

4.集成指南

4.1 添加BDTTSClient到工程

har方式集成:将开发包中的har目录拷贝到工程entry/libs/目录;在oh-package.json5文件中增加以下依赖:

"dependencies": {
  "@package/baidutts": "file:./libs/xxxx.har" // 替换“xxxx.har”为实际har包文件名
}

4.2 添加语音合成资源文件

  1. BaiduTtsDemo中的资源文件、参数值仅用于demo运行体验,业务方需申请自有资源文件与参数(如离线音库、SN码等)。
  2. 参照demo路径和代码逻辑,将自有离线资源文件(文本模型、发音人模型)放置到设备可访问路径(如/data/storage/el2/base/haps/entry/files/),并在代码中配置正确路径。

4.3 权限声明

BDTTSClient需在module.json5文件中声明以下权限,确保离线授权下载、网络请求正常:

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET" // 在线授权、离线授权文件下载必需
  },
  {
    "name": "ohos.permission.READ_EXTERNAL_STORAGE" // 读取离线资源文件必需
  },
  {
    "name": "ohos.permission.WRITE_EXTERNAL_STORAGE" // 存储离线授权文件、资源文件必需
  }
]

4.4 离线在线授权补充说明

4.4.1 离线授权核心依赖信息

离线合成需3个核心信息完全匹配,否则触发授权失败(错误码-100、-102等),具体要求如下:

信息类型 说明 来源渠道
APP_ID 离线请求认证参数:AI开放平台用户填app_id,非AI开放平台用户填产品pid 百度语音技术控制台
授权SN码 离线专属授权码,与APP_ID、包名绑定,用于下载离线授权文件 百度语音技术控制台-离线合成SDK管理
应用包名 与百度控制台配置的包名一致,需和工程module.json5appId完全匹配。build-profile信息参考demo配置 工程module.json5文件、百度控制台应用配置页

4.4.2 离线授权文件获取机制

  1. 自动下载:首次使用离线合成时,SDK会在联网状态下,根据APP_IDSN码包名自动向百度服务器请求并下载离线授权文件,默认存储路径为/data/storage/el2/base/haps/entry/files/baidu_tts_license(可通过PARAM_TTS_LICENCE_FILE参数自定义路径)。
  2. 重新授权:若授权文件过期、设备更换或包名修改,需重新申请SN码,并确保新SN与新配置信息匹配,SDK会自动重新下载授权文件。

4.4.3 离线授权失败排查要点

当出现-100(离线引擎授权失败)、-102(离线授权下载License失败)等错误时,按以下步骤排查:

  1. 检查APP_IDSN码是否正确:确认与百度控制台申请的信息一致,无空格、大小写错误。
  2. 验证包名匹配:工程module.json5appId需与百度控制台绑定的包名完全一致(离线授权与包名强绑定)。
  3. 网络状态:首次授权需联网,确保设备网络正常,无防火墙拦截SDK的授权请求。
  4. 存储权限:确认已申请WRITE_EXTERNAL_STORAGE权限,授权文件下载路径有写入权限。
  5. SN码有效性:检查SN码是否在有效期内、是否已绑定其他设备(同一SN默认绑定有限数量设备,超限需重新申请)。

4.4.4 在线sdk鉴权:

在线sdk分为4种激活方式,实际使用种选择其中一种方式进行激活,4种激活方法为:

激活方式 说明
永久iamKey激活 需在官网申请的永久iamKey,使用该方法进行在线鉴权,每次启动app需激活一次,不退出app永久有效
accessToken激活 需在使用appkey和secretKey获取的access_token,使用access_token进行授权,该token存在时限,时间到期后需要从新获取新的token从新授权
临时iamKey激活 与accessToken类似,需获取临时iamKey,该key存在时限,时间到期后需要从新获取新的key从新授权

4.4.5 鉴权激活方式说明

永久iamKey激活方式:将官网申请的永久iamKey放到项目中

image (31).png

临时accessToken和临时iam key激活方式:

accessToken和临时iamKey为相同接口,接口会随时间失效,客户需要在callback中创建http请求获取到对应token返回给sdk,sdk会在过期前3分钟通过callback重新向客户端获取最新token

accessToken获取地址:https://cloud.baidu.com/doc/AI_REFERENCE/s/Km3zhy5t7

iamKey获取地址:https://cloud.baidu.com/doc/AI_REFERENCE/s/Hm5us339w

image (32).png

将accessToken或iamKey 还有过期时间返回给sdk

image (33).png

将callback传递到sdk中

image (34).png

5. 语音合成功能代码

5.1 TTS初始化设置(分为离在线两种方式)

  // SDK初始化
  private initialTts(): void {
    LoggerProxy.printable(true);
    LoggerProxy.saveNativeLogFile("PRINTF:0");
    this.printEngineInfo();
    // TODO 代码中的所有参数与文件均是测试demo使用,集成自己工程时,请使用自己的参数
    this.addDebugSpeechSynthesizer();
  }
  private addDebugSpeechSynthesizer(): void {
    // 公共参数设置
    this.setPublicParam(this.speechSynthesizer);
    // 如果需要离线,设置离线资源
    this.setOfflineParam(this.speechSynthesizer);
    // 如果需要在线,设置在线离线资源
    this.setOnlineParam(this.speechSynthesizer);
  }
  
    // 设置公共参数
  private setPublicParam(speechSynthesizer: SpeechSynthesizer): void {
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_APP_ID, "APPID");
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PLAYER_USAGE, audio.StreamUsage.STREAM_USAGE_UNKNOWN + "");
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PLAYER_VOLUME_MODE, audio.AudioVolumeMode.APP_INDIVIDUAL + "");
    // speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PLAYER_INTERRUPT_MODE, audio.InterruptMode.INDEPENDENT_MODE + "");
  }
  
 // 在线语音合成
 private setOnlineParam(speechSynthesizer: SpeechSynthesizer): void {
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_ACCESS_TOKEN, "IAMKEY或TOKEN");
    // 请初始化您的在线发音人
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_ONLINE_SPEAKER, "4100");
    // 在线超时时间,MIX模式超时会切换至离线,ONLINE模式会超时
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_ONLINE_TIMEOUT, "6000");
    // 初始化在线tts服务,服务会读取相应资源进行加载,此过程是耗时操作
    speechSynthesizer.loadOnlineTts().then(
      (ttsError: ITtsError) => {
        hilog.info(0x0000, 'index', 'loadOnlineTts ttsError errorCode= %{public}d , errorMessage = %{public}s',
          ttsError.getDetailCode(),
          ttsError.getDetailMessage());
      }
    );
  }
  
  // 离线语音合成
  private setOfflineParam(speechSynthesizer: SpeechSynthesizer): void {
    // 设置离线需要的认证参数,产品SN
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUTH_SERIAL_NUMBER, "填写申请的SN");
    // 离线资源库路径,设置需要的离线发音人
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_OFFLINE_MODEL, this.setOfflineModel());
    // 初始化离线tts服务,服务会读取相应离线资源进行加载,此过程是耗时操作
    speechSynthesizer.loadOfflineTts().then(
      (ttsError: ITtsError) => {
        hilog.info(0x0000, 'index', 'loadOfflineTts ttsError errorCode= %{public}d , errorMessage = %{public}s',
          ttsError.getDetailCode(),
          ttsError.getDetailMessage());
      }
    );
  }

5.语音合成功能代码

5.1 TTS初始化设置(分为离在线两种方式)

  // SDK初始化
  private initialTts(): void {
    LoggerProxy.printable(true);
    LoggerProxy.saveNativeLogFile("PRINTF:0");
    this.printEngineInfo();
    // TODO 代码中的所有参数与文件均是测试demo使用,集成自己工程时,请使用自己的参数
    this.addDebugSpeechSynthesizer();
  }
  private addDebugSpeechSynthesizer(): void {
    // 公共参数设置
    this.setPublicParam(this.speechSynthesizer);
    // 如果需要离线,设置离线资源
    this.setOfflineParam(this.speechSynthesizer);
    // 如果需要在线,设置在线离线资源
    this.setOnlineParam(this.speechSynthesizer);
  }
  
    // 设置公共参数
  private setPublicParam(speechSynthesizer: SpeechSynthesizer): void {
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_APP_ID, "APPID");
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PLAYER_USAGE, audio.StreamUsage.STREAM_USAGE_UNKNOWN + "");
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PLAYER_VOLUME_MODE, audio.AudioVolumeMode.APP_INDIVIDUAL + "");
    // speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PLAYER_INTERRUPT_MODE, audio.InterruptMode.INDEPENDENT_MODE + "");
  }
  
 // 在线语音合成
 private setOnlineParam(speechSynthesizer: SpeechSynthesizer): void {
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_ACCESS_TOKEN, "IAMKEY或TOKEN");
    // 请初始化您的在线发音人
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_ONLINE_SPEAKER, "4100");
    // 在线超时时间,MIX模式超时会切换至离线,ONLINE模式会超时
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_ONLINE_TIMEOUT, "6000");
    // 初始化在线tts服务,服务会读取相应资源进行加载,此过程是耗时操作
    speechSynthesizer.loadOnlineTts().then(
      (ttsError: ITtsError) => {
        hilog.info(0x0000, 'index', 'loadOnlineTts ttsError errorCode= %{public}d , errorMessage = %{public}s',
          ttsError.getDetailCode(),
          ttsError.getDetailMessage());
      }
    );
  }
  
  // 离线语音合成
  private setOfflineParam(speechSynthesizer: SpeechSynthesizer): void {
    // 设置离线需要的认证参数,产品SN
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUTH_SERIAL_NUMBER, "填写申请的SN");
    // 离线资源库路径,设置需要的离线发音人
    speechSynthesizer.setParam(SpeechSynthesizer.PARAM_OFFLINE_MODEL, this.setOfflineModel());
    // 初始化离线tts服务,服务会读取相应离线资源进行加载,此过程是耗时操作
    speechSynthesizer.loadOfflineTts().then(
      (ttsError: ITtsError) => {
        hilog.info(0x0000, 'index', 'loadOfflineTts ttsError errorCode= %{public}d , errorMessage = %{public}s',
          ttsError.getDetailCode(),
          ttsError.getDetailMessage());
      }
    );
  }

5.2 参数设置

5.2.1 在线必设参数

参数名 默认值 备注
PARAM_ACCESS_TOKEN "" 产品iam api_key 或 token
PARAM_ONLINE_SPEAKER "0" 在线发音人,参考开放平台文档获取,例“4100”

5.2.2 离线必设参数

参数名 默认值 备注
PARAM_APP_ID “0” 离线请求认证参数,从开放平台获取,例:"1234567"
PARAM_AUTH_SERIAL_NUMBER " " 离线鉴权认证参数,从开放平台获取。例如:"abcd1234-567aa1f96-148b0e-048e-11f6c4-01"
PARAM_OFFLINE_MODEL " " ⾳库json信息

5.2.3 SDK默认自带基础音库离线资源文件

离线合成SDK默认自带4个普通音库资源文件,精品音库资源文件需单独下载。若您在2025年11月27日之前购买或申请序列号,请点击下载往期音库资源文件。详细发音人信息请看离线发音人列表

资源文件 具体文件名(支持新序列号)
m15 离线男声(度小宇) bd_etts_common_speech_duxiaoyu_mand_eng_high_am-tac-csubgan16k_v4.9.0_20240918_20251031153737.dat
f7 离线女声(度小美) bd_etts_common_speech_duxiaomei_mand_eng_high_am-tac-csubgan16k_v4.9.0_20240918_20251031153737.dat
yy 离线度逍遥 bd_etts_common_speech_duxiaoyao_mand_eng_high_am-tac-csubgan16k_v4.9.0_20251110_20251210203318.dat
c1 离线度丫丫 bd_etts_common_speech_duyaya_mand_eng_high_am-tac-csubgan16k_v4.9.0_20220419_20251031153737.dat
中文离线文本模型 bd_etts_common_text_txt_all_mand_eng_middle_big_v5.5.0_20250410.dat

5.2.3 其它辅助参数

参数名 默认值 备注
PARAM_ONLINE_TIMEOUT "6000" 在线合成请求的超时时间,单位为毫秒,最小值为 800,推荐设置为 2000
PARAM_VOLUME "5" 合成音频音量,范围 [0-15],float 类型
PARAM_SPEED "5" 合成音频速度,范围 [0-15],float 类型
PARAM_PITCH "5" 合成音频语调,范围 [0-15],float 类型
PARAM_OPEN_XML "0" "0":关闭 xml 解析,"1":打开 xml 解析
PARAM_TEXT_CTRL "" 前端模型配置参数,json 类型(表格笔误 son)
PARAM_AUDIO_CTRL "" 前端模型配置参数,json 类型
PARAM_BITRATE "64" 在线音频下发类型。

PCM = 0,

OPUS_64K = 64,

OPUS_128K = 128
PARAM_PLAYER_VOLUME "1.0" 播放器音量 [0,1.0],float 类型
PARAM_PLAYER_USAGE audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT 播放器 usage

5.3 初始化

speechSynthesizer.setParam("设置相应的参数key", "设置相应的参数value");
// 如果需要在线合成,加载在线模型
auto ttsResult = await speechSynthesizer.loadOnlineTts();
// 如果需要离线合成,加载离线模型
auto ttsResult = await speechSynthesizer.loadOfflineTts();

5.4 合成并播报

//合成
speechSynthesizer.synthesize(TtsEntity): Promise<ITtsError>;

TtsEntity参数详解

  • text:此次要合成的文本内容。必设参数。
  • utteranceId:此次文本合成的标识,默认值 UUID 的唯一值。
  • TtsMode:此次合成模式。
  • ttsParams: Record<string,string>:本条合成的合成参数,仅在本条合成生效,参数参见 setParam
  • 合成模式说明:ONLINE 纯在线模式,OFFLINE 纯离线模式,MIX 优先使用在线,在线超时后使用离线模式。
//合成并播报
speechSynthesizer.speak(TtsEntity): Promise<ITtsError>;

5.5 流程控制

方法名 说明
stop() 停止当前实例合成或者停止合成播报
release() 释放当前实例,当所有实例都被释放时,tts 整个服务停止。
pause() 暂停当前实例的合成播报内容。
resume() 继续播报当前实例的播报内容,与pause()相对应。

5.6 状态监听

为了更好地实现用于界面,BDTTSClient提供了SpeechSynthesizerListener监听接口用于对合成器的状态进行通知。 完整的开发示例请参见开发包所附示例BaiduTtsDemo

5.7 合成状态监听器回调接口

5.7.1 合成状态监听器回调接口

onSynthesizeResponse(SynthesizerResponse synthesizerResponse):void;
let sn = synthesizerResponse.getSn(); // 此次SDK侧传递的文本合成标识,建议保存,后续排查服务器问题时使用
let utteranceId = synthesizerResponse.getUtteranceId(); // 此次业务侧传递的文本合成标识,用于业务逻辑判断

5.7.2 合成开始时的回调接口

synthesizerResponse.getSynthesizeType() === SYNTHESIZE_START

5.7.3 合成过程中的回调接口

synthesizerResponse.getSynthesizeType() === SYNTHESIZE_DATA_ARRIVED
let progress = synthesizerResponse.getAudioProgress();
let engineType = synthesizerResponse.getEngineType();
let sampleRate = synthesizerResponse.getAudioSampleRate();
let audioData = synthesizerResponse.getAudioData();

5.7.4 合成出错时的回调接口

synthesizerResponse.getSynthesizeType() == PLAY_ERROR
synthesizerResponse.getErrorCode();
synthesizerResponse.getErrorMessage();

5.7.5 合成播报出错时的回调接口

synthesizerResponse.getSynthesizeType() == PLAY_ERROR
synthesizerResponse.getErrorCode();
synthesizerResponse.getErrorMessage();

5.8 SynthesizerTool类(工具类辅助离线合成开发)

5.8.1 检验模型文件的有效性

public static verifyModelFile(filePath:string):Promise<ITtsError>

5.8.2 获取离线引擎基本信息

public static getEngineInfo():string

5.8.3 获取离线引擎版本信息

1 public static getEngineVersion():number

5.8.4 检查模型文件与当前引擎版本是否匹配

/**
 * 校验模型文件是否与当前离线引擎版本兼容(避免因版本不匹配导致合成失败)
 * @param filePath 模型文件绝对路径
 * @return 数字:0=匹配,1=模型版本过高,-1=模型版本过低,-2=文件不存在
 */
let matchResult = SynthesizerTool.matchResEngine("/data/storage/el2/base/haps/entry/files/bd_etts_navi_speech_f7_mand_eng_high_am-style24k_v4.6.0_20210721.dat");
switch (matchResult) {
  case 0:
    console.log("模型文件与引擎版本匹配");
    break;
  case 1:
    console.error("模型版本过高,请升级离线引擎");
    break;
  case -1:
    console.error("模型版本过低,请下载最新模型文件");
    break;
  case -2:
    console.error("模型文件不存在,请检查路径");
    break;
}

5.8.5 获取音库文件的采样率

/**
 * 获取离线发音人模型(speech.dat)的音频采样率(用于自定义音频播放配置)
 * @param filePath 发音人模型文件绝对路径
 * @return 数字:采样率(如16000、24000,单位Hz;返回-1表示文件无效)
 */
let sampleRate = SynthesizerTool.getSpeechSampleRate("/data/storage/el2/base/haps/entry/files/bd_etts_navi_speech_f7_mand_eng_high_am-style24k_v4.6.0_20210721.dat");
if (sampleRate !== -1) {
  console.log("发音人模型采样率:" + sampleRate + "Hz");
}

5.8.6 获取定制化语音包的采样率

public static getDomainSampleRate(filePath:string):number

5.8.7 验证定制化语音包是否可用

public static checkDomainFile(filePath:string):number

5.8.8 获取sdk内部当前使用的设备id

// 建议在new Synthesizer()之后调用
public static getCuid(): string

6.错误码列表

错误码值 错误码描述
-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 未知错误

7. FAQ

1.日志收集

(1)TTS SDK Java 层日志 收集方式:使用 logcat 抓取日志并导出日志文件

开启日志打印代码:

LoggerProxy.printable(true);

(2)TTS SDK 引擎层日志

两种输出方式:

方式 1:输出引擎日志到本地指定文件

LoggerProxy.saveNativeLogFile("FPRINTF:0:" + File.separator + context.getExternalFilesDir(null).getPath() + File.separator + "tts_engine.log");

方式 2:仅开启引擎日志控制台输出

LoggerProxy.saveNativeLogFile("PRINTF:0");

收集方式:配合 logcat 收集,或直接读取本地输出的日志文件

2.离线引擎信息
String engineInfo = SynthesizerTool.getEngineInfo();
3.使用的文本资源信息

传入离线 TTS 文本资源文件绝对路径,获取文本模型详情:

String textModelInfo = SynthesizerTool.getModelInfo(初始化离线TTS引擎使用的文本资源绝对路径);
4.使用的音库资源信息

传入离线 TTS 音库资源文件绝对路径,获取音库模型详情:

String speechModelInfo = SynthesizerTool.getModelInfo(初始化离线TTS引擎使用的音库资源绝对路径);
5.查看 SDK 版本号信息(bash 命令)

进入 so 库所在目录执行以下指令:

# 查看TTS SDK版本
strings -a libBDSpeechClientSDK.so | grep TTS_SDK_VERSION
# 查看ETTS唯一标识
strings -a libBDSpeechClientSDK.so | grep ETTS_UNIQUE
上一篇
语音合成 iOS SDK
下一篇
语音合成 Linux SDK