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 (推荐)
安装步骤
- 获取源码: LLMSpeaker
cd LLMSpeaker
- 创建虚拟环境并激活:
conda create -n llmspeaker python=3.10.12
conda activate llmspeaker
- 安装项目依赖:
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 = "中文女" # 可选: 中文女, 中文男, 英文女, 英文男等
📈 性能优化
- GPU加速: 确保CUDA环境正确配置以获得最佳性能
- 批处理优化: 合理设置生成长度避免内存溢出
- 音频缓冲: 调整音频缓冲区大小平衡延迟和流畅性
🤝 与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文件。
🙏 致谢
- CosyVoice - 阿里巴巴开源的高性能TTS系统
- Transformers - Hugging Face提供的模型库
- SoundDevice - Python音频播放库
📞 联系方式
如有问题或建议,请通过以下方式联系:
- 公众号:“CrazyNET”
- 邮件: 1145570610@qq.com
源码免费获取
- 公众号回复llmspeaker获取源码
流式LLM到TTS语音合成实现
8089

被折叠的 条评论
为什么被折叠?



