Skip to content

火山引擎浏览器端文本转语音(TTS)工具库,支持流式文本输入、SSML 发音规则转换、iOS 兼容处理和音频播放控制。

安装

bash
pnpm add @mingto/huoshan-tts

快速开始

typescript
import huoshanTts from '@mingto/huoshan-tts'

huoshanTts.config({
  ttsRequestBaseUrl: 'wss://audio.workbrain.cn/tts',
})

const ttsInstance = huoshanTts.create({
  voice_type: 'zh_female_daimengchuanmei_moon_bigtts',
})

ttsInstance
  .on('audioFirstStart', () => {
    console.log('音频首次播放')
  })
  .on('appError', (error) => {
    console.error('应用错误', error)
  })
  .on('appFinish', () => {
    console.log('应用已结束')
  })

ttsInstance.start()
ttsInstance.send('你好呀。')
ttsInstance.end()

API

huoshanTts.config(systemConfig)

配置系统参数,返回当前模块对象,支持链式调用。

参数类型默认值说明
ttsRequestBaseUrlstringwss://audio.workbrain.cn/ttsTTS WebSocket 请求地址

huoshanTts.create(businessParams?, ssmlConfig?)

创建 TTS 控制器实例。

typescript
const ttsInstance = huoshanTts.create(
  {
    voice_type: 'zh_female_daimengchuanmei_moon_bigtts',
    text_type: 'ssml',
  },
  {
    pronunciationRules: [
      {
        content: '筠连',
        alphabet: 'py',
        ph: 'jvn1 lian2',
      },
    ],
  }
)

businessParams

参数类型默认值说明
voice_typestringzh_female_daimengchuanmei_moon_bigtts音色类型
text_typeplain / ssmlplain文本类型
speed_rationumber1语速,约 [0.2, 3]
volume_rationumber1音量,约 [0.1, 3]
pitch_rationumber1音高,约 [0.1, 3]
languagestringcn语言代码
providerstring0供应商 ID;100 会强制使用纯文本,iOS 下使用 URL 输出
cachebooleanfalse是否使用缓存
streambooleantrue是否流式返回
encodingstringiOS 下为 pcm音频编码,可由运行环境或 provider 自动调整
output_formatstringiOS 下为 base64输出格式,可由运行环境或 provider 自动调整

ssmlConfig

参数类型默认值说明
pronunciationRulesArray<{ content: string; alphabet: 'py' | 'ipa'; ph: string }>[]发音规则,仅在 text_type: 'ssml' 时参与转换

实例方法

方法说明
start()激活应用,准备接收文本
send(text)发送文本进行合成;仅在执行中生效
end()通知文本输入结束,不会立即停止剩余音频播放
finish()停止所有处理器并重置状态
mute()静音当前音频输出
unmute()恢复音频输出
pause()暂停播放
resume()恢复播放
on(eventName, callback)订阅应用事件,返回当前实例

应用事件

事件名说明
audioFirstStart音频首次播放时触发
appError应用发生错误时触发
appFinish应用结束或销毁时触发

流式文本示例

typescript
const textList = ['第一段文本,', '第二段文本。']

const ttsInstance = huoshanTts.create({
  voice_type: 'zh_female_daimengchuanmei_moon_bigtts',
})

ttsInstance.start()

textList.forEach((text, index) => {
  ttsInstance.send(text)
  if (index === textList.length - 1) {
    ttsInstance.end()
  }
})