流式LLM到TTS语音合成如何实现?

流式LLM到TTS语音合成实现
部署运行你感兴趣的模型镜像

LLMSpeaker: 流式LLM到TTS语音合成(自定义Sentence分割逻辑)

LLMSpeaker是一个集成大语言模型(LLM)和语音合成(TTS)技术的流式语音生成系统。它能够实时将LLM生成的文本转换为语音输出,实现类似ChatTTS的流式语音对话体验。

本项目完全开源免费,供大家学习参考,需要的小伙伴关注公众号“CrazyNET”后,回复“llmspeaker”自取

运行截图

在这里插入图片描述

🌟 项目特色

  • 流式处理: 实现LLM文本生成与TTS语音合成的无缝流式处理
  • 实时语音输出: 文本生成的同时进行语音播放,降低整体响应延迟
  • 智能句子分割: 自动识别句子边界,实现更自然的语音输出节奏
  • 高性能TTS引擎: 基于CosyVoice的高质量语音合成
  • 灵活配置: 支持多种LLM模型和TTS音色选择

🏗️ 项目架构

LLMSpeaker/
├── main.py                 # 主程序入口
├── model_classes/          # 核心模型类
│   ├── llm_stream.py       # LLM流式处理类
│   └── tts_engine.py       # TTS引擎类
├── models/                 # 模型文件目录
│   ├── LLM/                # 大语言模型
│   └── TTS/                # 语音合成模型
├── cosyvoice/              # CosyVoice TTS系统子模块
├── logs/                   # 日志文件目录
│   └── run.log             # 运行日志
├── configs/                # 配置文件目录
│   └── cfg.ini             # 系统配置文件
├── any_utils/              # 任意工具函数目录
│   └── inireader.py        # 项目配置文件读取工具
├── require_dependence/     # 项目依赖目录Whl包
└── requirements.txt        # 项目依赖

🚀 快速开始

环境要求

  • Python 3.10.12
  • CUDA 12.4 (用于GPU加速)
  • Ubuntu-24.04.3 LTS (Noble Numbat) (推荐Linux)
  • CPU架构 x86_64 (推荐)

安装步骤

  1. 获取源码: LLMSpeaker
cd LLMSpeaker
  1. 创建虚拟环境并激活:
conda create -n llmspeaker python=3.10.12
conda activate llmspeaker
  1. 安装项目依赖:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r req.info

模型准备

LLM模型

将您的大语言模型放置在 models/LLM/ 目录下,支持的模型包括:

  • Qwen系列 (推荐Qwen3-1.7B)
  • Llama系列
  • 其他HuggingFace兼容模型
TTS模型

下载CosyVoice预训练模型:

# 使用ModelScope下载
modelscope download --model iic/CosyVoice-300M --local_dir ./models/TTS/CosyVoice-300M

或者使用git下载:

git clone https://www.modelscope.cn/iic/CosyVoice-300M.git models/TTS/CosyVoice-300M

运行示例

python main.py

在程序运行后,您可以输入问题与AI进行交互,输入"exit"退出程序。

🧠 核心组件

LLM流式处理 (StreamingLLMWithTTS)

核心(TextIteratorStreamer)
def generate_stream(self, prompt):
    """流式生成文本"""
    messages = [{"role": "user", "content": prompt}]
    text = self.tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        enable_thinking=self.enable_thinking,
        add_generation_prompt=True
    )
    print(f"device: {self.model.device}")
    inputs = self.tokenizer([text], return_tensors="pt").to(self.model.device)
    
    streamer = TextIteratorStreamer(
        self.tokenizer,
        skip_prompt=self.skip_prompt,
        skip_special_tokens=self.skip_special_tokens
    )
    print(f"input ids: {inputs['input_ids']}")
    generation_kwargs = dict(
        inputs,
        streamer=streamer,
        max_new_tokens=self.max_length,
        do_sample=self.do_sample,
        temperature=self.temperature,
        top_p=self.top_p,
        top_k=self.top_k
    )
    
    thread = Thread(target=self.model.generate, kwargs=generation_kwargs)
    thread.start()
    
    return streamer

该类负责:

  • 加载和运行大语言模型
  • 流式生成文本内容
  • 智能句子分割以优化TTS输出

主要方法:

  • generate_stream(): 流式生成文本
  • sentence_splitter(): 智能句子分割
  • llm_to_tts_pipeline(): LLM到TTS的完整管道

TTS引擎 (CosyVoiceEngine)

核心(synthesize)
def synthesize(self, text):
    self.output_stream.start()
    print(f"text: {text}")
    """生成并播放语音"""
    for audio_chunk in self.model.inference_sft(text, self.speaker, speed=self.speed):
        audio_tensor_2_numpy = audio_chunk["tts_speech"].numpy()
        audio_tensor_2_numpy = np.squeeze(audio_tensor_2_numpy)
        audio_data = self.resample_audio(audio_tensor_2_numpy, self.tts_sample_rate, self.output_dev_sample_rate)
        # 播放音频
        self.output_stream.write(audio_data)
    self.output_stream.stop()

该类基于CosyVoice实现:

  • 高质量语音合成
  • 音频重采样处理
  • 实时音频播放

主要方法:

  • synthesize(): 文本到语音合成
  • resample_audio(): 音频重采样

⚙️ 配置说明

项目配置

; LLM模型配置
[LLM]
; LLM模型路径
llm_model_path="./models/LLM/Qwen3-1.7B/"
; 部署后端
llm_backend="cuda"
; 数据类型 ["float16", "float32"]
llm_dtype="float16"
; 是否跳过提示词
skip_prompt=True
; 是否跳过特殊token
skip_special_tokens=True
; 是否开启思考模式
enable_thinking=False
; 最大生成长度
max_length=1024
; 是否采样, 当 do_sample=False时, 模型采用确定性解码策略, 会使用argmax。当 do_sample=True时,模型会启用随机采样策略。temperature、top_p、top_k这些参数仅在 do_sample=True时生效
do_sample=True
; 温度参数, 用于控制生成文本的随机性, 较高的温度会增加随机性(模型输出随机性更强、更具创造性), 较低的温度会减少随机性(模型输出更加确定和保守)
temperature=0.7
; 根据当前上下文概率分布的实际情况动态调整候选集大小
top_p=0.8
; 值越大,候选 token 越多,生成多样性越强,但引入低质量 token 的风险也增加。值越小,生成内容越保守、确定性越强。如果 k=1,则退化为贪婪搜索。
top_k=50

; TTS模型配置
[TTS]
; TTS模型路径
tts_model_path="./models/TTS/CosyVoice-300M/"
; 说话人, 可选: ["中文女", "中文男", "日语男", "粤语女", "英文女", "英文男", "韩语女"]
speaker="中文女"
; 数据类型 ["float16", "float32"]
tts_dtype="float16"
; 语速
speed=1.2
; 模型采样率
tts_sample_rate=22050

; 设备参数
[AUDIO]
; 输出采样率
output_sample_rate=48000
; 音频设备ID
output_dev_id=9
; 输出通道数
output_channels=1

音频设置

# 配置音频输出设备
import sounddevice as sd

# 查看可用设备
print(sd.query_devices())

# 选择合适的输出设备
output_stream = sd.OutputStream(samplerate=48000, device=设备ID, channels=1, dtype=np.float32)

模型参数

# LLM参数配置
llm = StreamingLLMWithTTS(
    model_path="your-llm-path",
    streamer=streamer,
    max_new_tokens=max_length,
    do_sample=True,
    temperature=0.7,
    top_p=0.8,
    top_k=50
)

# TTS参数配置
tts = CosyVoiceEngine(
    output_stream,
    model_path="your-tts-path",
    speaker="中文女"  # 可选音色
)

🛠️ 高级用法

自定义句子分割逻辑

# 在llm_stream.py中修改sentence_splitter方法
def sentence_splitter(self, text_stream):
    """自定义句子分割逻辑"""
    buffer = ""
    # 可以根据需要修改正则表达式
    sentence_end_pattern = re.compile(r'[。!?\.!?;;\n]')
    # ... 其他逻辑

多语言支持

CosyVoice支持多种语言:

  • 中文
  • 英文
  • 日文
  • 韩文
  • 粤语

音色选择

# 在tts_engine.py中修改speaker参数
self.speaker = "中文女"  # 可选: 中文女, 中文男, 英文女, 英文男等

📈 性能优化

  1. GPU加速: 确保CUDA环境正确配置以获得最佳性能
  2. 批处理优化: 合理设置生成长度避免内存溢出
  3. 音频缓冲: 调整音频缓冲区大小平衡延迟和流畅性

🤝 与CosyVoice的关系

本项目基于阿里巴巴开源的CosyVoice项目进行二次开发,增加了与大语言模型的流式集成能力。CosyVoice提供了以下特性:

  • 多语言支持(中文、英文、日文、韩文、粤语及方言)
  • 零样本语音克隆
  • 情感控制和细粒度语音调节
  • 低延迟流式推理

CosyVoice子模块包含以下重要组件:

  • CLI接口 (cosyvoice/cli/)
  • 数据集处理 (cosyvoice/dataset/)
  • 模型实现 (cosyvoice/flow/, cosyvoice/hifigan/, cosyvoice/llm/)
  • 文本前端处理 (cosyvoice/tokenizer/)
  • 工具函数 (cosyvoice/utils/)
  • Web界面 (webui.py)
  • 部署相关 (runtime/, docker/)

📄 许可证

本项目基于MIT许可证发布,详见LICENSE文件。

CosyVoice基于Apache 2.0许可证,详见CosyVoice/LICENSE文件。

🙏 致谢

📞 联系方式

如有问题或建议,请通过以下方式联系:

源码免费获取

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值