给 Qwen-1.5B 装上耳朵和嘴巴:情感语音对话系统搭建实操
结论:不要想着从头训练一个端到端语音大模型,老老实实玩“级联架构”——现成的 ASR + SER + 微调 LLM + 现成的 TTS,胶水代码就是最优解。(本人已泪目测试!1.5B 模型真的有点笨,但搭起来是真香)
之前用 Qwen-1.5B 微调了一个文字对话模型,放在 AI/AQing/ 目录下,有 aqing_6000.json 和 aqing_emotion.jsonl 两份数据,权重在 qwen-1.5b 里。它能打字聊天,但我想让它更像一个“人”:能听见我说话,能感受到我语气里的情绪,回复时还能带着情绪思考,最后用带情感的声音说出来。
于是就有了这次实操。全程基于级联架构,硬件门槛不高,单卡 6GB 显存也能跑(因为 LLM 只有 1.5B,语音模型也都不大)。下面把整个过程和踩坑记录整理出来,零基础也能跟着搭。但是目前只实现了stt和stt->llm的部分
1. 硬件与环境要求
最低配置
- GPU:NVIDIA 显卡,显存 ≥ 6GB(如 RTX 4050 Laptop)——跑 1.5B 的 LLM 和语音模型足够
- 内存:16GB 以上
- 硬盘:至少 30GB 空闲(模型多,ASR/SER/TTS 都要下)
- 系统:Windows / Linux 均可,Mac 也能凑合
推荐配置
- GPU:RTX 3090 / 4090(24GB 显存)——可以同时加载多个模型,流式更顺畅
- 内存:32GB
- 硬盘:NVMe SSD
如果没有 GPU
- 云平台:AutoDL、恒源云、Kaggle(免费)、Google Colab(免费)
- 租一张 RTX 4090,约 ¥2/小时,跑通整个流程没问题
软件环境
- Python 3.10(不要用 3.13,语音库兼容性会让你崩溃)
- CUDA 12.1 / 12.4(取决于显卡驱动)
- PyTorch(必须装 CUDA 版,不要装 CPU 版)
- FunASR、emotion2vec、GPT-SoVITS / CosyVoice、LLaMA-Factory
Mac也可以跑,但 MPS 加速对某些语音模型支持一般,建议还是 N 卡。
2. 总体架构:级联系统是最务实的方案
别想着一步到位搞端到端语音大模型,那个训练成本和数据量个人开发者扛不住。最靠谱的是 “级联架构”,把任务拆给专业模型,你的 Qwen 当大脑。
用户语音输入 ↓[1. ASR 语音识别] → 文本 ↓[2. SER 语音情感识别] → 情绪标签 ↓[3. LLM(你的Qwen微调模型)] → 情绪思考 + 情感回复 ↓[4. TTS 情感语音合成] → 带有情绪的语音输出每个模块都可以独立替换和优化,你的 Qwen 模型完美接入现有技术栈。级联虽然串联模块多,但工程逻辑清晰,调试维护比端到端可控得多。
3. 模型选择与下载
3.1 ASR 语音识别:让她“听到”
- FunASR(阿里开源):中文效果极强,支持标点恢复和流式识别。Paraformer-large 在 AISHELL 测试集字错率仅 1.95%,AISHELL-2 为 2.85%。首选!
- faster-whisper:极速且准确,英文强,中文也不错。
3.2 SER 语音情感识别:让她“感受情绪”
- emotion2vec(阿里达摩院):开源,效果极好,输出愤怒、高兴、悲伤等情绪标签。
- 备选方案:不单独训练 SER,直接让 LLM 从 ASR 文本判断情绪。但语音中的叹气、哼唱、咬牙切齿 ASR 会丢失,所以最佳实践还是 先做 SER 再把情绪标签喂给 LLM。
3.3 TTS 情感语音合成:让她“说出带情绪的话”
- GPT-SoVITS:最火,支持情感参考音频。给几秒到几分钟的目标音色(开心、生气等),模型就能模仿对应情绪。
- CosyVoice(阿里开源):支持指令控制情感和方言,CosyVoice 2 首包延迟低至 150ms,原生流式解码,实时场景首选。
3.4 LLM:你的 Qwen-1.5B 微调模型
就用你 AI/AQing/qwen-1.5b 里的模型,继续用 LoRA 做情感推理微调。
下载方式(国内镜像):
$env:HF_ENDPOINT = "https://hf-mirror.com"pip install huggingface_hubpython -c "from huggingface_hub import snapshot_download; snapshot_download('Qwen/Qwen2.5-1.5B-Instruct', local_dir='./qwen-1.5b')"语音模型去各自 GitHub 下就行,FunASR、emotion2vec、GPT-SoVITS 都有详细说明。国内网速不行就挂代理或者用魔塔。
4. 数据准备(最关键)
模型效果 80% 取决于数据质量。你要让 LLM 学会“对用户语气进行思考”,就得构造带 思维链(CoT) 的训练数据。
格式示例(ShareGPT + 情绪思考)
{ "conversations": [ { "from": "human", "value": "你今天怎么又迟到了!(语音输入识别:你今天怎么又迟到了!,语音情感识别:愤怒)" }, { "from": "gpt", "value": "〖情绪思考〗用户现在的语气非常愤怒,因为我又迟到了,他/她可能感到不被尊重。我需要先道歉,安抚情绪,并给出合理的解释。\n〖回复〗(带着歉意和温柔的语气)对不起,让你久等了,路上遇到一点突发状况,我保证下次一定提前出门,你别生气了好不好?" } ]}推理时可以把 〖情绪思考〗 隐藏,只展示 〖回复〗,或者直接通过 TTS 读出思考结果来指导语调。
数据要求
- 数量:500~5000 条。1.5B 模型能力有限,聚焦情感对话,质量比数量重要。
- 质量:回答自然、多样,不要模板化。
- 多样性:覆盖不同情绪、不同问法、不同长度。
- 格式统一:每条字段一致。
手工写会搞一辈子,建议用大模型生成后人工筛选,效率高。公开数据集(Belle、Firefly)也可以拿来改。
数据注册(LLaMA-Factory)
在 data/dataset_info.json 中注册:
{ "aqing_emotion": { "file_name": "aqing_emotion.jsonl", "formatting": "sharegpt", "columns": { "messages": "conversations" }, "tags": { "role_tag": "from", "content_tag": "value", "user_tag": "human", "assistant_tag": "gpt" } }}5. 训练方式:LoRA 微调
5.1 安装 LLaMA-Factory
pip install llamafactory -i https://mirrors.aliyun.com/pypi/simple5.2 启动 Web UI
llamafactory-cli webui浏览器打开 http://localhost:7860。看到 Running on local URL: http://0.0.0.0:7860 就成功了。
5.3 关键参数配置
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 模型路径 | ./qwen-1.5b | 你下载的模型目录 |
| 微调方法 | lora | 只训练适配器 |
| 量化等级 | none(6GB 显存)或 4-bit | 4-bit 需装 bitsandbytes |
| 对话模板 | qwen | 必须匹配模型 |
| 训练阶段 | Supervised Fine-Tuning | 监督微调 |
| 数据集 | aqing_emotion | 你注册的名称 |
| 学习率 | 3e-5 | 不要太高 |
| 训练轮数 | 3 | 数据少可增加到 5 |
| 批处理大小 | 1 | 显存小就设 1 |
| 梯度累积 | 8 | 补偿 batch size |
| 截断长度 | 1024 | 省显存 |
| 计算类型 | bf16 | 混合精度 |
| LoRA 秩 | 8 | 常用值 |
| LoRA 缩放系数 | 16 | 常用值 |
| LoRA 作用模块 | all | 全部线性层 |
| 输出目录 | trainer_output/aqing_emotion | 自定义 |
好心的作者批注:1.5B 模型真的很小,情绪思考别写太长,不然它学不会。我试过 1800 条数据,RTX 4050 6GB 跑了大概 40 分钟,loss 降到 0.5 左右就差不多了。
5.4 开始训练
点击“开始”,观察 loss 曲线。正常应持续下降,最终稳定在 0.3~0.8 之间。如果不动,就去问问 ds 老师 吧 (doge)。
6. 推理与测试:把模块串起来
6.1 各模块加载
- ASR:FunASR 的
AutoModel,流式识别。 - SER:emotion2vec 模型,输入音频输出情绪标签。
- LLM:加载 base + LoRA adapter。
- TTS:GPT-SoVITS 或 CosyVoice,准备好情感参考音频。
6.2 简单串联代码(伪代码)
# 1. 录音并识别text = asr_model.generate(audio_chunk)# 2. 情感识别emotion = ser_model.predict(audio_chunk)# 3. 拼接输入给 LLMprompt = f"{text}(语音情感识别:{emotion})"response = llm.generate(prompt)# 4. 解析出回复和情绪思考reply, mood = parse_response(response)# 5. TTS 合成tts_model.synthesize(reply, emotion=mood)6.3 合并 LoRA 权重(可选)
如果想导出完整模型:
model = model.merge_and_unload()model.save_pretrained("./merged_model")tokenizer.save_pretrained("./merged_model")7. 实时对话优化:从“轮次”到“流式”
如果你要实时对话,核心是把串联改成 并行流式,目标是全双工——边听边说,随时打断。
7.1 流式 ASR:边说边出字
FunASR 支持逐帧解码,端到端延迟 < 300ms。推荐 320ms(5120 采样点)音频块,延迟和准确率平衡最佳。VAD(语音活动检测)用来精准找说话片段,是实现“打断”的基础。检测到你说话就立即停 TTS 播放,清空合成队列。
7.2 流式 LLM:增量预填充降低首 Token 延迟
关键优化:增量 Prefilling。用户说话时,ASR 中间结果提前发给 LLM 预填充,把提示处理时间“隐藏”在用户说话过程中,首 Token 时间降低 70% 以上。还可以对 Qwen 模型 4-bit 量化,显存和延迟都大降。
7.3 流式 TTS:边说边合成
并行异步 TTS 队列:LLM 生成第一个完整句子就立刻推给 TTS 合成,不等整个回复。CosyVoice 首包延迟可低至 300ms,非常适合实时。
8. 项目结构:职责分离,避免依赖冲突
语音交互是全新模块,和模型权重、训练数据解耦。在 AI/AQing/ 下新建 voice/:
AI/AQing/├── .venv/├── data/├── dataset/├── qwen-1.5b/ # 模型权重(不要动)├── saves/├── article/├── MChat/ # 主程序├── voice/ # 新建:语音交互模块│ ├── asr_worker.py│ ├── vad_worker.py│ ├── tts_worker.py│ ├── audio_utils.py│ └── requirements_voice.txt└── main.py理由:qwen-1.5b 和 saves 专注“大脑”,voice 专注“耳朵和嘴巴”。语音库(funasr、pyaudio、torchaudio)和微调库(transformers、peft、vllm)有时版本冲突,分开管理好排查。
让 MChat 调用 voice,voice 把识别结果发给 AQing 的 API,用队列或异步通信。不要把语音采集代码直接写进 Qwen 模型加载代码里。
9. 常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
cuda available: False | 装了 CPU 版 PyTorch | 重装 CUDA 版:pip install torch --index-url https://download.pytorch.org/whl/cu124 |
CUDA out of memory | 显存不足 | 减小 batch_size、截断长度,或用量化;语音模型分时加载 |
| ASR 识别不准 | 环境噪音、采样率不对 | 加 VAD,重采样到 16k,用 FunASR 流式 |
| 情感识别总是不对 | SER 模型没适配你的场景 | 换 emotion2vec,或微调;也可以让 LLM 从文本辅助判断 |
| TTS 没有情感 | 参考音频不对 | 给 GPT-SoVITS 提供对应情绪的参考音频;CosyVoice 用指令控制 |
| 模型只会重复一句话 | 过拟合 | 减少训练轮数,增加数据多样性 |
| 加载 LoRA 后没变化 | 检查点路径错误 | 选到包含 adapter_model.safetensors 的目录 |
10. 学习资源
- FunASR:https://github.com/modelscope/FunASR
- emotion2vec:https://github.com/ddlBoJack/emotion2vec
- GPT-SoVITS:https://github.com/RVC-Boss/GPT-SoVITS
- CosyVoice:https://github.com/FunAudioLLM/CosyVoice
- LLaMA-Factory:https://github.com/hiyouga/LLaMA-Factory
- Qwen 官方仓库:https://github.com/QwenLM/Qwen2.5
- AutoDL 云平台:https://www.autodl.com
- Kaggle 免费 GPU:https://www.kaggle.com
最后提醒:不要陷入“万事皆需训练”的误区。个人开发者,“大模型 + 提示词 + 现成语音工具”的胶水代码模式性价比最高。ASR、SER、TTS 通常都不需要从头训练,直接调用现成开源 SOTA 模型。先把系统搭起来跑通,再根据实际表现决定优化哪个模块。
ok啊,我 1.5B 模型搭完这一套,反应速度还行,就是有时候情绪思考写得像小学生作文……慢慢调数据吧,太慢了!!(doge)
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 0 天
部分内容可能已过时