2668 字
13 分钟
给 Qwen-1.5B 装上耳朵和嘴巴:情感语音对话系统搭建实操

给 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 做情感推理微调。

下载方式(国内镜像):

Terminal window
$env:HF_ENDPOINT = "https://hf-mirror.com"
pip install huggingface_hub
python -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#

Terminal window
pip install llamafactory -i https://mirrors.aliyun.com/pypi/simple

5.2 启动 Web UI#

Terminal window
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-bit4-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. 拼接输入给 LLM
prompt = 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. 学习资源#


最后提醒:不要陷入“万事皆需训练”的误区。个人开发者,“大模型 + 提示词 + 现成语音工具”的胶水代码模式性价比最高。ASR、SER、TTS 通常都不需要从头训练,直接调用现成开源 SOTA 模型。先把系统搭起来跑通,再根据实际表现决定优化哪个模块。

ok啊,我 1.5B 模型搭完这一套,反应速度还行,就是有时候情绪思考写得像小学生作文……慢慢调数据吧,太慢了!!(doge)

给 Qwen-1.5B 装上耳朵和嘴巴:情感语音对话系统搭建实操
http://mblog.linghantech.top/posts/给qwen-15b装上耳朵和嘴巴情感语音对话系统搭建实操/
作者
Mengdie
发布于
2026-10-07
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类