语音代理(如Alexa)通常配备多种语音合成器,这些合成器在表现力、个性、语言和说话风格等方面各不相同。支撑这些应用的机器学习模型可能具有完全不同的架构,将这些架构集成到单一语音服务中是一个耗时且具有挑战性的过程。
为简化这一流程,某中心的文本转语音团队开发了通用模型集成框架,能够快速且可扩展地定制生产级语音模型。
模型多样性
最先进的语音模型通常使用两个大型神经网络从文本输入合成语音:
- 声学模型:接收文本输入并生成梅尔频谱图(表示语音随时间变化的音高和能量等声学参数的图像)
- 声码器:将梅尔频谱图转换为最终语音波形
虽然已发布支持多种说话风格的通用声码器架构,但仍需不同声学模型架构来实现语音多样性。
主流声学模型架构依赖注意力机制,该机制学习输入文本中哪些元素与当前输出频谱图的"帧"最相关。这种架构虽能生成自然语音,但容易出现模糊、吞词或重复等错误。
更新颖的架构通过显式建模文本块时长并并行生成语音帧来解决这些问题。这种"上采样"方式根据外部时长模型重复文本编码向量,比依赖前序帧输入更高效稳定。
集成挑战
将声学模型投入生产需要组件处理文本输入并返回梅尔频谱图。主要挑战包括:
- 语音通常分块生成而非一次性合成,需最小化延迟
- 需适配不同硬件加速器(如AWS Inferentia需要固定张量尺寸)
- 需动态拆分长语句为适合模型输入的块
- 需处理适当填充
- 需明确划分模型功能与集成层功能
集成组件
集成层将模型封装为两类组件:
- SequenceBlock:转换输入张量(可串联)
- StreamableBlock:按需生成数据(如语音帧)
通过这两类抽象可灵活构建声学模型变体。典型架构包含:
- 两个编码器(SequenceBlock):将文本嵌入转换为一维表示张量
- 上采样器(StreamableBlock):根据编码结果生成中间序列
- 解码器(StreamableBlock):生成梅尔频谱图帧
整个模型封装在StreamablePipeline中,包含一个SequenceBlock和一个StreamableBlock。
集成层实现
声学模型以"插件"形式提供,包含:
- 导出的神经网络(编码器、解码器等符号和参数集)
- 配置数据(通过"stack"属性定义组件连接方式)
JSON格式的配置支持快速修改,例如:
- 替换组件名称即可切换专用硬件加速器
- 轻松添加诊断或数字信号处理组件
- 新组件只需扩展两种基础抽象之一
该框架已成功用于生产环境,支持集成最新无注意力TTS架构与传统模型。