Skip to content

数字人/语音合成

夜月AI应用平台 的数字人模块提供多引擎TTS(Text-to-Speech)支持,通过WebSocket双向通信协议,实现高质量的语音合成和数字人交互体验。

核心特性

  • 3种TTS引擎:Volcengine、GPT-SoVITS、MiMo
  • WebSocket双向协议:实时语音交互
  • 自定义二进制协议:支持压缩和序列化
  • 语音文件生成:支持多种音频格式
  • 数字人配置管理:灵活的数字人角色配置

TTS引擎

Volcengine (字节跳动)

企业级TTS服务,音质优秀,支持多种音色。

yaml
tts:
  providers:
    volcengine:
      app-id: ${VOLCENGINE_APP_ID}
      access-token: ${VOLCENGINE_ACCESS_TOKEN}
      cluster: volcengine_streaming

特点:

  • 高音质语音合成
  • 多种音色可选
  • 实时流式合成
  • 中文优化

GPT-SoVITS

开源语音克隆方案,支持少样本语音克隆。

yaml
tts:
  providers:
    gpt-sovits:
      base-url: http://localhost:9880
      model-path: /path/to/model

特点:

  • 语音克隆
  • 情感表达
  • 开源免费
  • 本地部署

MiMo

轻量级TTS引擎,适合嵌入式场景。

yaml
tts:
  providers:
    mimo:
      base-url: http://localhost:8080

特点:

  • 轻量级
  • 低延迟
  • 资源占用少

WebSocket协议

协议格式

java
public class TTSMessage {
    private MessageType type;      // 消息类型
    private byte[] data;           // 音频数据
    private Map<String, Object> metadata;  // 元数据
}

public enum MessageType {
    START,      // 开始合成
    AUDIO,      // 音频数据
    END,        // 结束合成
    ERROR,      // 错误
    CONTROL     // 控制消息
}

二进制协议

+--------+--------+--------+--------+
| Type   | Flags  | Length (16bit)   |
+--------+--------+--------+--------+
| Payload (variable length)          |
+------------------------------------+
  • Type: 消息类型 (1 byte)
  • Flags: 标志位 (1 byte)
  • Length: 负载长度 (2 bytes)
  • Payload: 实际数据

使用场景

智能客服

java
// 创建数字人
DigitalHuman human = new DigitalHuman();
human.setName("小助手");
human.setVoice("zh-CN-Neural");
human.setTtsProvider("volcengine");
digitalHumanService.save(human);

// 语音交互
WebSocketSession session = ttsService.connect(human.getId());
session.sendText("你好,有什么可以帮助你的?");
byte[] audio = session.receiveAudio();

语音助手

java
// 配置语音助手
VoiceAssistant assistant = VoiceAssistant.builder()
    .name("小月")
    .voice("zh-CN-Xiaoyan")
    .speed(1.0)
    .pitch(1.0)
    .build();

// 语音合成
byte[] audio = ttsService.synthesize(
    assistant.getVoice(),
    "今天天气真不错"
);

内容朗读

java
// 批量语音合成
List<byte[]> audioSegments = ttsService.synthesizeBatch(
    voice,
    paragraphs
);

// 合并音频
byte[] fullAudio = audioService.merge(audioSegments);

数字人配置

数字人信息

java
@Entity
public class DigitalHuman {
    @Id
    private Long id;
    private String name;           // 名称
    private String avatar;         // 头像
    private String voice;          // 音色
    private String ttsProvider;    // TTS提供商
    private Double speed;          // 语速
    private Double pitch;          // 音调
    private Map<String, Object> config;  // 额外配置
}

数字人配置

java
@Entity
public class HumanConfig {
    @Id
    private Long id;
    private Long humanId;          // 数字人ID
    private String prompt;         // 系统提示词
    private String personality;    // 性格描述
    private List<String> skills;   // 技能列表
    private Map<String, Object> settings;  // 设置
}

代码示例

TTS服务接口

java
public interface TtsService {
    
    // 连接TTS服务
    WebSocketSession connect(String provider);
    
    // 合成语音
    byte[] synthesize(String voice, String text);
    
    // 流式合成
    Flux<byte[]> synthesizeStream(String voice, String text);
    
    // 获取可用音色
    List<Voice> getVoices(String provider);
}

Volcengine实现

java
@Service
public class VolcengineTtsService implements TtsService {
    
    @Override
    public byte[] synthesize(String voice, String text) {
        // 构建请求
        VolcengineTtsRequest request = VolcengineTtsRequest.builder()
            .appId(appId)
            .voice(voice)
            .text(text)
            .build();
        
        // 发送请求
        VolcengineTtsResponse response = client.synthesize(request);
        
        return response.getAudioData();
    }
    
    @Override
    public Flux<byte[]> synthesizeStream(String voice, String text) {
        return Flux.create(sink -> {
            WebSocketSession session = connect("volcengine");
            
            session.sendText(buildStartMessage(voice));
            session.sendText(buildTextMessage(text));
            
            session.receive()
                .filter(msg -> msg.getType() == MessageType.AUDIO)
                .subscribe(
                    msg -> sink.next(msg.getData()),
                    error -> sink.error(error),
                    () -> sink.complete()
                );
        });
    }
}

数字人管理

java
@Service
public class DigitalHumanService {
    
    public DigitalHuman create(String name, String voice, String provider) {
        DigitalHuman human = new DigitalHuman();
        human.setName(name);
        human.setVoice(voice);
        human.setTtsProvider(provider);
        return humanRepository.save(human);
    }
    
    public byte[] speak(Long humanId, String text) {
        DigitalHuman human = humanRepository.findById(humanId);
        TtsService ttsService = ttsProviderFactory.getProvider(
            human.getTtsProvider()
        );
        
        return ttsService.synthesize(human.getVoice(), text);
    }
}

最佳实践

  1. 选择合适的引擎:根据场景需求选择TTS引擎
  2. 优化音质:调整语速、音调等参数
  3. 缓存音频:对常用语音进行缓存
  4. 监控延迟:实时监控TTS延迟
  5. 错误处理:处理网络中断、合成失败等异常

相关链接

Copyright © 2023-2026 nitemoon.cn All Rights Reserved