豆包大模型实时语音合成

v1.0.1发布于:2025-02-06 13:38

说明文档
回复列表 (0)

语音合成插件

这是一个语音合成插件,基于字节跳动火山引擎的语音合成服务,支持一次性合成和流式合成两种模式。

介绍

本插件提供了三种语音合成方式:

  1. 一次性合成(HTTP) - 适合短文本快速合成
  2. 一次性合成(WebSocket) - 支持实时音频块回调
  3. 双向流式合成 - 适合需要实时交互的场景,可以一边输入文本一边合成,如大模型文本输出,边输出边播放

标识

调用插件的时候需要用到标识,标识是唯一的,不能重复,建议使用英文。对应插件 plugin.json 中的 key 字段

  • 标识:hs-tts

配置

{
  "appid": "your_app_id",
  "token": "your_token",
  "cluster": "volcano_tts"
}
  • appid:火山引擎应用ID,详情
  • token:访问令牌,详情
  • cluster:集群名称,默认为 "volcano_tts"

方法

下面是插件提供的一些方法:

once

一次性合成(HTTP方式)

/**
 * 一次性合成
 * @param req 请求参数
 */
async once(req: {
  text: string;              // 要合成的文本
  voiceType: string;         // 发音人,[列表](https://www.volcengine.com/docs/6561/1257544)
  encoding?: "pcm" | "ogg_opus" | "mp3" | "wav";  // 音频编码格式
  speedRatio?: number;       // 语速,默认1.0
  volumeRatio?: number;      // 音量,默认1.0
  pitchRatio?: number;       // 音调,默认1.0
  textType?: string;         // 文本类型
  uid?: string;              // 用户ID
})

onceStream

一次性合成(WebSocket方式),支持实时音频块回调

/**
 * 一次性合成,流式返回
 * @param req 请求参数
 * @param onData 音频数据回调
 */
async onceStream(
  req: {
    text: string;              // 要合成的文本
    voiceType: string;         // 发音人,[列表](https://www.volcengine.com/docs/6561/1257544)
    encoding?: "pcm" | "ogg_opus" | "mp3";  // 音频编码格式
    speedRatio?: number;       // 语速,默认1.0
    volumeRatio?: number;      // 音量,默认1.0
    pitchRatio?: number;       // 音调,默认1.0
    textType?: string;         // 文本类型
    uid?: string;              // 用户ID
  },
  onData?: (data: Buffer, isFinal: boolean) => void  // 音频数据回调
)

stream

双向流式合成,支持实时输入文本并获取合成音频

/**
 * 双向流式合成
 * @param req 请求参数
 * @param onData 音频数据回调
 * @param onEnd 合成结束回调
 */
async stream(
  req: {
    voiceType: string;         // 发音人,[列表](https://www.volcengine.com/docs/6561/1257544)
    encoding?: "pcm" | "ogg_opus" | "mp3";  // 音频编码格式
    uid?: string;              // 用户ID
    audioParams?: {
      format?: "mp3" | "ogg_opus" | "pcm";  // 音频编码格式
      sample_rate?: 8000 | 16000 | 22050 | 24000 | 32000 | 44100 | 48000;  // 采样率
      speech_rate?: number;    // 语速,取值范围[-50,100],100代表2.0倍速,-50代表0.5倍数
      pitch_rate?: number;     // 音调,取值范围[-12,12],12代表高音,-12代表低音
      enable_timestamp?: boolean;  // 是否开启时间戳
    }
  },
  onData?: (data: Buffer) => void,  // 音频数据回调
  onEnd?: (data: Buffer) => void    // 合成结束回调
)

调用示例

@Inject()
pluginService: PluginService;

// 获取插件实例
const instance = await this.pluginService.getInstance('tts');

// 一次性合成(HTTP)
const audioBuffer = await instance.once({
  text: '你好,世界!',
  voiceType: 'zh_female_wanwanxiaohe_moon_bigtts',
  encoding: 'mp3'
});
fs.writeFileSync('test.mp3', audioBuffer);

// 一次性合成(WebSocket)
const audioBuffer = await instance.onceStream({
  text: '你好,世界!',
  voiceType: 'zh_female_wanwanxiaohe_moon_bigtts',
  encoding: 'mp3'
}, (chunk, isFinal) => {
  console.log(`收到音频块:${chunk.length}字节`, isFinal);
});

fs.writeFileSync('test.mp3', audioBuffer);

// 双向流式合成
const client = await instance.stream(
  {
    voiceType: "zh_female_wanwanxiaohe_moon_bigtts",
    encoding: 'mp3',
    audioParams: {
      format: 'mp3',
      sample_rate: 24000,
      speech_rate: 0,  // 正常语速
      pitch_rate: 0    // 正常音调
    }
  },
  (chunk) => {
    // 可以在此处播放声音
    console.log(`收到音频块:${chunk.length}字节`);
  },
  (chunk) => {
    console.log('合成结束');
    fs.writeFileSync('test.mp3', audioBuffer);
  }
);

// 这边可以一边输入一边合成,场景:大模型输出文本,边输出边播放
await client.sendText('第一句话');
await client.sendText('第二句话');

// 结束合成
client.end();

更新日志

  • v1.0.0 (2025-02-05)
    • 初始版本
    • 支持一次性合成(HTTP/WebSocket)
    • 支持双向流式合成
    • 支持多种音频格式和参数调节