<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Mengdie&apos;s World</title><description>A blog</description><link>http://mblog.linghantech.top/</link><language>zh_CN</language><item><title>给 Qwen-1.5B 装上耳朵和嘴巴：情感语音对话系统搭建实操</title><link>http://mblog.linghantech.top/posts/%E7%BB%99qwen-15b%E8%A3%85%E4%B8%8A%E8%80%B3%E6%9C%B5%E5%92%8C%E5%98%B4%E5%B7%B4%E6%83%85%E6%84%9F%E8%AF%AD%E9%9F%B3%E5%AF%B9%E8%AF%9D%E7%B3%BB%E7%BB%9F%E6%90%AD%E5%BB%BA%E5%AE%9E%E6%93%8D/</link><guid isPermaLink="true">http://mblog.linghantech.top/posts/%E7%BB%99qwen-15b%E8%A3%85%E4%B8%8A%E8%80%B3%E6%9C%B5%E5%92%8C%E5%98%B4%E5%B7%B4%E6%83%85%E6%84%9F%E8%AF%AD%E9%9F%B3%E5%AF%B9%E8%AF%9D%E7%B3%BB%E7%BB%9F%E6%90%AD%E5%BB%BA%E5%AE%9E%E6%93%8D/</guid><description>记录第一次给微调好的 Qwen-1.5B 模型接入 ASR、SER、TTS，搭建能听、能感受、能带情绪说话的情感语音对话系统。个人开发者踩坑向，级联架构真香。</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;给 Qwen-1.5B 装上耳朵和嘴巴：情感语音对话系统搭建实操&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;结论：&lt;strong&gt;不要想着从头训练一个端到端语音大模型，老老实实玩“级联架构”——现成的 ASR + SER + 微调 LLM + 现成的 TTS，胶水代码就是最优解。&lt;/strong&gt;（==本人已泪目测试！1.5B 模型真的有点笨，但搭起来是真香==）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之前用 Qwen-1.5B 微调了一个文字对话模型，放在 &lt;code&gt;AI/AQing/&lt;/code&gt; 目录下，有 &lt;code&gt;aqing_6000.json&lt;/code&gt; 和 &lt;code&gt;aqing_emotion.jsonl&lt;/code&gt; 两份数据，权重在 &lt;code&gt;qwen-1.5b&lt;/code&gt; 里。它能打字聊天，但我想让它更像一个“人”：能听见我说话，能感受到我语气里的情绪，回复时还能带着情绪思考，最后用带情感的声音说出来。&lt;/p&gt;
&lt;p&gt;于是就有了这次实操。全程基于级联架构，硬件门槛不高，单卡 6GB 显存也能跑（因为 LLM 只有 1.5B，语音模型也都不大）。下面把整个过程和踩坑记录整理出来，零基础也能跟着搭。但是目前只实现了==stt==和==stt-&amp;gt;llm==的部分&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 硬件与环境要求&lt;/h2&gt;
&lt;h3&gt;最低配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：NVIDIA 显卡，显存 ≥ 6GB（如 RTX 4050 Laptop）——跑 1.5B 的 LLM 和语音模型足够&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：16GB 以上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬盘&lt;/strong&gt;：至少 30GB 空闲（模型多，ASR/SER/TTS 都要下）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统&lt;/strong&gt;：Windows / Linux 均可，Mac 也能凑合&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;推荐配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：RTX 3090 / 4090（24GB 显存）——可以同时加载多个模型，流式更顺畅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：32GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬盘&lt;/strong&gt;：NVMe SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;如果没有 GPU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;云平台：AutoDL、恒源云、Kaggle（免费）、Google Colab（免费）&lt;/li&gt;
&lt;li&gt;租一张 RTX 4090，约 ¥2/小时，跑通整个流程没问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;软件环境&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 3.10&lt;/strong&gt;（==不要用 3.13，语音库兼容性会让你崩溃==）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CUDA 12.1 / 12.4&lt;/strong&gt;（取决于显卡驱动）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;（必须装 CUDA 版，不要装 CPU 版）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FunASR&lt;/strong&gt;、&lt;strong&gt;emotion2vec&lt;/strong&gt;、&lt;strong&gt;GPT-SoVITS / CosyVoice&lt;/strong&gt;、&lt;strong&gt;LLaMA-Factory&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;==Mac==也可以跑，但 MPS 加速对某些语音模型支持一般，建议还是 N 卡。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;2. 总体架构：级联系统是最务实的方案&lt;/h2&gt;
&lt;p&gt;别想着一步到位搞端到端语音大模型，那个训练成本和数据量个人开发者扛不住。最靠谱的是 &lt;strong&gt;“级联架构”&lt;/strong&gt;，把任务拆给专业模型，你的 Qwen 当大脑。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用户语音输入
    ↓
[1. ASR 语音识别] → 文本
    ↓
[2. SER 语音情感识别] → 情绪标签
    ↓
[3. LLM（你的Qwen微调模型）] → 情绪思考 + 情感回复
    ↓
[4. TTS 情感语音合成] → 带有情绪的语音输出
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每个模块都可以独立替换和优化，你的 Qwen 模型完美接入现有技术栈。级联虽然串联模块多，但工程逻辑清晰，调试维护比端到端可控得多。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 模型选择与下载&lt;/h2&gt;
&lt;h3&gt;3.1 ASR 语音识别：让她“听到”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FunASR&lt;/strong&gt;（阿里开源）：中文效果极强，支持标点恢复和流式识别。Paraformer-large 在 AISHELL 测试集字错率仅 1.95%，AISHELL-2 为 2.85%。==首选！==&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;faster-whisper&lt;/strong&gt;：极速且准确，英文强，中文也不错。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 SER 语音情感识别：让她“感受情绪”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;emotion2vec&lt;/strong&gt;（阿里达摩院）：开源，效果极好，输出愤怒、高兴、悲伤等情绪标签。&lt;/li&gt;
&lt;li&gt;备选方案：不单独训练 SER，直接让 LLM 从 ASR 文本判断情绪。但语音中的叹气、哼唱、咬牙切齿 ASR 会丢失，所以最佳实践还是 &lt;strong&gt;先做 SER 再把情绪标签喂给 LLM&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 TTS 情感语音合成：让她“说出带情绪的话”&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-SoVITS&lt;/strong&gt;：最火，支持情感参考音频。给几秒到几分钟的目标音色（开心、生气等），模型就能模仿对应情绪。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CosyVoice&lt;/strong&gt;（阿里开源）：支持指令控制情感和方言，CosyVoice 2 首包延迟低至 150ms，原生流式解码，==实时场景首选==。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.4 LLM：你的 Qwen-1.5B 微调模型&lt;/h3&gt;
&lt;p&gt;就用你 &lt;code&gt;AI/AQing/qwen-1.5b&lt;/code&gt; 里的模型，继续用 LoRA 做情感推理微调。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载方式&lt;/strong&gt;（国内镜像）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$env:HF_ENDPOINT = &quot;https://hf-mirror.com&quot;
pip install huggingface_hub
python -c &quot;from huggingface_hub import snapshot_download; snapshot_download(&apos;Qwen/Qwen2.5-1.5B-Instruct&apos;, local_dir=&apos;./qwen-1.5b&apos;)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;语音模型去各自 GitHub 下就行，FunASR、emotion2vec、GPT-SoVITS 都有详细说明。==国内网速不行就挂代理或者用魔塔==。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 数据准备（最关键）&lt;/h2&gt;
&lt;p&gt;模型效果 ==&lt;strong&gt;80%&lt;/strong&gt;== 取决于数据质量。你要让 LLM 学会“对用户语气进行思考”，就得构造带 &lt;strong&gt;思维链（CoT）&lt;/strong&gt; 的训练数据。&lt;/p&gt;
&lt;h3&gt;格式示例（ShareGPT + 情绪思考）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;conversations&quot;: [
    {
      &quot;from&quot;: &quot;human&quot;,
      &quot;value&quot;: &quot;你今天怎么又迟到了！（语音输入识别：你今天怎么又迟到了！，语音情感识别：愤怒）&quot;
    },
    {
      &quot;from&quot;: &quot;gpt&quot;,
      &quot;value&quot;: &quot;〖情绪思考〗用户现在的语气非常愤怒，因为我又迟到了，他/她可能感到不被尊重。我需要先道歉，安抚情绪，并给出合理的解释。\n〖回复〗（带着歉意和温柔的语气）对不起，让你久等了，路上遇到一点突发状况，我保证下次一定提前出门，你别生气了好不好？&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推理时可以把 &lt;code&gt;〖情绪思考〗&lt;/code&gt; 隐藏，只展示 &lt;code&gt;〖回复〗&lt;/code&gt;，或者直接通过 TTS 读出思考结果来指导语调。&lt;/p&gt;
&lt;h3&gt;数据要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数量&lt;/strong&gt;：500～5000 条。1.5B 模型能力有限，聚焦情感对话，质量比数量重要。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量&lt;/strong&gt;：回答自然、多样，不要模板化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多样性&lt;/strong&gt;：覆盖不同情绪、不同问法、不同长度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式统一&lt;/strong&gt;：每条字段一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;手工写会搞一辈子，&lt;strong&gt;建议用大模型生成后人工筛选&lt;/strong&gt;，效率高。公开数据集（Belle、Firefly）也可以拿来改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;数据注册（LLaMA-Factory）&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;data/dataset_info.json&lt;/code&gt; 中注册：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;aqing_emotion&quot;: {
    &quot;file_name&quot;: &quot;aqing_emotion.jsonl&quot;,
    &quot;formatting&quot;: &quot;sharegpt&quot;,
    &quot;columns&quot;: { &quot;messages&quot;: &quot;conversations&quot; },
    &quot;tags&quot;: {
      &quot;role_tag&quot;: &quot;from&quot;,
      &quot;content_tag&quot;: &quot;value&quot;,
      &quot;user_tag&quot;: &quot;human&quot;,
      &quot;assistant_tag&quot;: &quot;gpt&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;5. 训练方式：LoRA 微调&lt;/h2&gt;
&lt;h3&gt;5.1 安装 LLaMA-Factory&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pip install llamafactory -i https://mirrors.aliyun.com/pypi/simple
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 启动 Web UI&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;llamafactory-cli webui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器打开 &lt;code&gt;http://localhost:7860&lt;/code&gt;。看到 &lt;code&gt;Running on local URL: http://0.0.0.0:7860&lt;/code&gt; 就成功了。&lt;/p&gt;
&lt;h3&gt;5.3 关键参数配置&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;推荐值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模型路径&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./qwen-1.5b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你下载的模型目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;微调方法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lora&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只训练适配器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量化等级&lt;/td&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;（6GB 显存）或 &lt;code&gt;4-bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4-bit 需装 bitsandbytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对话模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;必须匹配模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练阶段&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Supervised Fine-Tuning&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;监督微调&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据集&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aqing_emotion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你注册的名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习率&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3e-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不要太高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练轮数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据少可增加到 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;批处理大小&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显存小就设 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;梯度累积&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;补偿 batch size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;截断长度&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;省显存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计算类型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bf16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;混合精度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA 秩&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常用值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA 缩放系数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常用值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA 作用模块&lt;/td&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全部线性层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trainer_output/aqing_emotion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;好心的作者批注&lt;/strong&gt;：==1.5B 模型真的很小，情绪思考别写太长，不然它学不会。我试过 1800 条数据，RTX 4050 6GB 跑了大概 40 分钟，loss 降到 0.5 左右就差不多了。==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5.4 开始训练&lt;/h3&gt;
&lt;p&gt;点击“开始”，观察 loss 曲线。正常应持续下降，最终稳定在 ==0.3～0.8== 之间。如果不动，就去问问 &lt;strong&gt;ds 老师&lt;/strong&gt; 吧 (doge)。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. 推理与测试：把模块串起来&lt;/h2&gt;
&lt;h3&gt;6.1 各模块加载&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ASR&lt;/strong&gt;：FunASR 的 &lt;code&gt;AutoModel&lt;/code&gt;，流式识别。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SER&lt;/strong&gt;：emotion2vec 模型，输入音频输出情绪标签。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM&lt;/strong&gt;：加载 base + LoRA adapter。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTS&lt;/strong&gt;：GPT-SoVITS 或 CosyVoice，准备好情感参考音频。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6.2 简单串联代码（伪代码）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1. 录音并识别
text = asr_model.generate(audio_chunk)
# 2. 情感识别
emotion = ser_model.predict(audio_chunk)
# 3. 拼接输入给 LLM
prompt = f&quot;{text}（语音情感识别：{emotion}）&quot;
response = llm.generate(prompt)
# 4. 解析出回复和情绪思考
reply, mood = parse_response(response)
# 5. TTS 合成
tts_model.synthesize(reply, emotion=mood)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 合并 LoRA 权重（可选）&lt;/h3&gt;
&lt;p&gt;如果想导出完整模型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;model = model.merge_and_unload()
model.save_pretrained(&quot;./merged_model&quot;)
tokenizer.save_pretrained(&quot;./merged_model&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;7. 实时对话优化：从“轮次”到“流式”&lt;/h2&gt;
&lt;p&gt;如果你要&lt;strong&gt;实时对话&lt;/strong&gt;，核心是把串联改成 &lt;strong&gt;并行流式&lt;/strong&gt;，目标是全双工——边听边说，随时打断。&lt;/p&gt;
&lt;h3&gt;7.1 流式 ASR：边说边出字&lt;/h3&gt;
&lt;p&gt;FunASR 支持逐帧解码，端到端延迟 &amp;lt; 300ms。推荐 320ms（5120 采样点）音频块，延迟和准确率平衡最佳。VAD（语音活动检测）用来精准找说话片段，是实现“打断”的基础。检测到你说话就立即停 TTS 播放，清空合成队列。&lt;/p&gt;
&lt;h3&gt;7.2 流式 LLM：增量预填充降低首 Token 延迟&lt;/h3&gt;
&lt;p&gt;关键优化：&lt;strong&gt;增量 Prefilling&lt;/strong&gt;。用户说话时，ASR 中间结果提前发给 LLM 预填充，把提示处理时间“隐藏”在用户说话过程中，首 Token 时间降低 70% 以上。还可以对 Qwen 模型 4-bit 量化，显存和延迟都大降。&lt;/p&gt;
&lt;h3&gt;7.3 流式 TTS：边说边合成&lt;/h3&gt;
&lt;p&gt;并行异步 TTS 队列：LLM 生成第一个完整句子就立刻推给 TTS 合成，不等整个回复。CosyVoice 首包延迟可低至 300ms，非常适合实时。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 项目结构：职责分离，避免依赖冲突&lt;/h2&gt;
&lt;p&gt;语音交互是全新模块，和模型权重、训练数据解耦。在 &lt;code&gt;AI/AQing/&lt;/code&gt; 下新建 &lt;code&gt;voice/&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理由：&lt;code&gt;qwen-1.5b&lt;/code&gt; 和 &lt;code&gt;saves&lt;/code&gt; 专注“大脑”，&lt;code&gt;voice&lt;/code&gt; 专注“耳朵和嘴巴”。语音库（funasr、pyaudio、torchaudio）和微调库（transformers、peft、vllm）有时版本冲突，分开管理好排查。&lt;/p&gt;
&lt;p&gt;让 MChat 调用 voice，voice 把识别结果发给 AQing 的 API，用队列或异步通信。==不要把语音采集代码直接写进 Qwen 模型加载代码里==。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;9. 常见问题&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cuda available: False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;装了 CPU 版 PyTorch&lt;/td&gt;
&lt;td&gt;重装 CUDA 版：&lt;code&gt;pip install torch --index-url https://download.pytorch.org/whl/cu124&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CUDA out of memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显存不足&lt;/td&gt;
&lt;td&gt;减小 batch_size、截断长度，或用量化；语音模型分时加载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASR 识别不准&lt;/td&gt;
&lt;td&gt;环境噪音、采样率不对&lt;/td&gt;
&lt;td&gt;加 VAD，重采样到 16k，用 FunASR 流式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;情感识别总是不对&lt;/td&gt;
&lt;td&gt;SER 模型没适配你的场景&lt;/td&gt;
&lt;td&gt;换 emotion2vec，或微调；也可以让 LLM 从文本辅助判断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TTS 没有情感&lt;/td&gt;
&lt;td&gt;参考音频不对&lt;/td&gt;
&lt;td&gt;给 GPT-SoVITS 提供对应情绪的参考音频；CosyVoice 用指令控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型只会重复一句话&lt;/td&gt;
&lt;td&gt;过拟合&lt;/td&gt;
&lt;td&gt;减少训练轮数，增加数据多样性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加载 LoRA 后没变化&lt;/td&gt;
&lt;td&gt;检查点路径错误&lt;/td&gt;
&lt;td&gt;选到包含 &lt;code&gt;adapter_model.safetensors&lt;/code&gt; 的目录&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;10. 学习资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FunASR&lt;/strong&gt;：https://github.com/modelscope/FunASR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;emotion2vec&lt;/strong&gt;：https://github.com/ddlBoJack/emotion2vec&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-SoVITS&lt;/strong&gt;：https://github.com/RVC-Boss/GPT-SoVITS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CosyVoice&lt;/strong&gt;：https://github.com/FunAudioLLM/CosyVoice&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLaMA-Factory&lt;/strong&gt;：https://github.com/hiyouga/LLaMA-Factory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 官方仓库&lt;/strong&gt;：https://github.com/QwenLM/Qwen2.5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoDL 云平台&lt;/strong&gt;：https://www.autodl.com&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaggle 免费 GPU&lt;/strong&gt;：https://www.kaggle.com&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;最后提醒：&lt;strong&gt;不要陷入“万事皆需训练”的误区&lt;/strong&gt;。个人开发者，“大模型 + 提示词 + 现成语音工具”的胶水代码模式性价比最高。ASR、SER、TTS 通常都不需要从头训练，直接调用现成开源 SOTA 模型。先把系统搭起来跑通，再根据实际表现决定优化哪个模块。&lt;/p&gt;
&lt;p&gt;ok啊，我 1.5B 模型搭完这一套，反应速度还行，就是有时候情绪思考写得像小学生作文……慢慢调数据吧，太慢了！！(doge)&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>基于qwen0.5b参数的训练</title><link>http://mblog.linghantech.top/posts/%E5%9F%BA%E4%BA%8Eqwen05b%E5%8F%82%E6%95%B0%E7%9A%84%E8%AE%AD%E7%BB%83/</link><guid isPermaLink="true">http://mblog.linghantech.top/posts/%E5%9F%BA%E4%BA%8Eqwen05b%E5%8F%82%E6%95%B0%E7%9A%84%E8%AE%AD%E7%BB%83/</guid><description>基于qwen0.5b参数的训练，从0 到 1 的ai训练过程，要什么自己训(doge</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AI 模型训练入门指南（个人开发者版）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;结论：&lt;strong&gt;个人开发者不建议从零预训练大模型，而是基于开源小模型做微调（LoRA/QLoRA）&lt;/strong&gt;。(==本人已泪目测试！心碎一地==)
本文以 &lt;strong&gt;Qwen2.5-0.5B + LLaMA-Factory&lt;/strong&gt; 为例，硬件门槛低，单卡 ==6GB== 显存即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;1. 硬件与环境要求&lt;/h2&gt;
&lt;h3&gt;最低配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：NVIDIA 显卡，显存 ≥ 6GB（如 RTX 4050 Laptop）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：16GB 以上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬盘&lt;/strong&gt;：至少 20GB 空闲&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统&lt;/strong&gt;：Windows / Linux 均可&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;推荐配置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：RTX 3090 / 4090（24GB 显存）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：32GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬盘&lt;/strong&gt;：NVMe SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;如果没有 GPU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用云平台：AutoDL、恒源云、Kaggle（免费）、Google Colab（免费）&lt;/li&gt;
&lt;li&gt;租一张 RTX 4090，约 ¥2/小时&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;软件环境&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 3.10&lt;/strong&gt;（不要用 3.13，兼容性差）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CUDA 12.1 / 12.4&lt;/strong&gt;（取决于显卡驱动）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;（必须装 CUDA 版，不要装 CPU 版）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLaMA-Factory&lt;/strong&gt;（微调框架，支持 Web UI）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;==Mac==也可以训练哦!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;3. 模型选择&lt;/h2&gt;
&lt;p&gt;个人开发者推荐以下小模型：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;th&gt;推荐场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen2.5-0.5B-Instruct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.5B&lt;/td&gt;
&lt;td&gt;中文强，生态好，LoRA 友好&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;首选&lt;/strong&gt;，聊天/情感/助手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen2.5-1.5B-Instruct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.5B&lt;/td&gt;
&lt;td&gt;能力更强，显存要求稍高&lt;/td&gt;
&lt;td&gt;需要更好效果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RWKV7-G1 0.1B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.1B&lt;/td&gt;
&lt;td&gt;纯 RNN，推理极快，多语言&lt;/td&gt;
&lt;td&gt;边缘设备，嵌入式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MiniMind2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.1B&lt;/td&gt;
&lt;td&gt;教学用，可从头训练&lt;/td&gt;
&lt;td&gt;学习训练流程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hunyuan-0.5B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.5B&lt;/td&gt;
&lt;td&gt;腾讯出品，中英双语强悍&lt;/td&gt;
&lt;td&gt;双语场景&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;下载方式&lt;/strong&gt;（使用国内镜像）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$env:HF_ENDPOINT = &quot;https://hf-mirror.com&quot;
pip install huggingface_hub
python -c &quot;from huggingface_hub import snapshot_download; snapshot_download(&apos;Qwen/Qwen2.5-0.5B-Instruct&apos;, local_dir=&apos;./qwen-0.5b&apos;)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这里用的是 &lt;strong&gt;Hugging Face Hub&lt;/strong&gt;下载的==Qwen2.5-0.5B-Instruct== 模型。
需要别的模型可以去自行下载更换。
国内网速不行，可以使用==代理==或者==魔塔==哦&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;4. 数据准备（最关键）&lt;/h2&gt;
&lt;p&gt;模型效果 ==&lt;strong&gt;80%&lt;/strong&gt;== 取决于数据质量。数据格式通常用 &lt;strong&gt;ShareGPT&lt;/strong&gt; 或 &lt;strong&gt;Alpaca&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;格式示例（ShareGPT）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{&quot;conversations&quot;: [
  {&quot;from&quot;: &quot;human&quot;, &quot;value&quot;: &quot;你是谁？&quot;},
  {&quot;from&quot;: &quot;gpt&quot;, &quot;value&quot;: &quot;我是你的AI助手，很高兴为你服务。&quot;}
]}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;数据要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数量&lt;/strong&gt;：500～5000 条。太少学不会，太多训练慢且容易过拟合。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量&lt;/strong&gt;：回答要自然、多样，不要模板化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多样性&lt;/strong&gt;：覆盖不同问法、不同情绪、不同长度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式统一&lt;/strong&gt;：每条数据字段一致，不要混用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据来源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自己手工编写（==质量==最高）&lt;/li&gt;
&lt;li&gt;用大模型生成后人工筛选（==效率==高）&lt;/li&gt;
&lt;li&gt;公开数据集（如 ==Belle、Firefly==）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;手工的话可以搞一辈子了，&lt;strong&gt;建议用第二个办法&lt;/strong&gt;，这样可以快速生成数千条数据&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;数据注册（LLaMA-Factory）&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;data/dataset_info.json&lt;/code&gt; 中注册：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;my_dataset&quot;: {
    &quot;file_name&quot;: &quot;my_data.jsonl&quot;,
    &quot;formatting&quot;: &quot;sharegpt&quot;,
    &quot;columns&quot;: { &quot;messages&quot;: &quot;conversations&quot; },
    &quot;tags&quot;: {
      &quot;role_tag&quot;: &quot;from&quot;,
      &quot;content_tag&quot;: &quot;value&quot;,
      &quot;user_tag&quot;: &quot;human&quot;,
      &quot;assistant_tag&quot;: &quot;gpt&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;好心的作者批注&lt;/strong&gt;：==LLaMA-Factory==需要安装哦，pip安装就行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;5. 训练方式：LoRA 微调&lt;/h2&gt;
&lt;h3&gt;5.1 安装 LLaMA-Factory&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pip install llamafactory -i https://mirrors.aliyun.com/pypi/simple
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5.2 启动 Web UI&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;llamafactory-cli webui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器打开 &lt;code&gt;http://localhost:7860&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;默认是这个地址，注意一下控制台就行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Running on local URL: http://0.0.0.0:7860 
To create a public link, set `share=True` in `launch()`.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到这个就说明启动成功了&lt;/p&gt;
&lt;h3&gt;5.3 关键参数配置&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;这里是关于webui的一部分配置内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;推荐值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模型路径&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./qwen-0.5b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你下载的模型目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;微调方法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lora&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只训练适配器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量化等级&lt;/td&gt;
&lt;td&gt;&lt;code&gt;none&lt;/code&gt;（6GB 显存）或 &lt;code&gt;4-bit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4-bit 需装 bitsandbytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对话模板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;qwen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;必须匹配模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练阶段&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Supervised Fine-Tuning&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;监督微调&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据集&lt;/td&gt;
&lt;td&gt;&lt;code&gt;my_dataset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你注册的名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习率&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3e-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不要太高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练轮数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据少可增加到 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;批处理大小&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显存小就设 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;梯度累积&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;补偿 batch size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;截断长度&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1024&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;省显存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计算类型&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bf16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;混合精度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA 秩&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常用值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA 缩放系数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;常用值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoRA 作用模块&lt;/td&gt;
&lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全部线性层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trainer_output/my_model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里晒一下我的配置图片
&lt;img src=&quot;./img/image-1.png&quot; alt=&quot;alt text&quot; /&gt;
&lt;img src=&quot;./img/image-2.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;5.4 开始训练&lt;/h3&gt;
&lt;p&gt;点击“==&lt;strong&gt;开始&lt;/strong&gt;==”，观察 loss 曲线。正常应持续下降，最终稳定在 ==0.3～0.8== 之间。
如果没有就可以去问问&lt;strong&gt;ds老师&lt;/strong&gt;了(doge&lt;/p&gt;
&lt;h3&gt;5.5 训练时间参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Qwen2.5-0.5B，1500 条数据，3 轮，RTX 4050 6GB：约 1.5～3 小时&lt;/li&gt;
&lt;li&gt;如果太慢，减少数据量或降低截断长度&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;6. 推理与测试&lt;/h2&gt;
&lt;h3&gt;6.1 在 Web UI 的 Chat 页测试&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;模型路径：&lt;code&gt;./qwen-0.5b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查点路径：选择训练输出目录（包含 &lt;code&gt;adapter_model.safetensors&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;点击“加载模型”&lt;/li&gt;
&lt;li&gt;直接输入问题测试&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.2 用 Python 代码推理&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;此代码由ds老师独家赞助写出，本编不保证可用..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

base = &quot;./qwen-0.5b&quot;
lora = &quot;./trainer_output/my_model&quot;

tokenizer = AutoTokenizer.from_pretrained(base, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(base, torch_dtype=&quot;auto&quot;, device_map=&quot;auto&quot;)
model = PeftModel.from_pretrained(model, lora)
model.eval()

messages = [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好&quot;}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors=&quot;pt&quot;).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=256)
print(tokenizer.decode(outputs[0][inputs[&quot;input_ids&quot;].shape[1]:], skip_special_tokens=True))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6.3 合并 LoRA 权重（可选）&lt;/h3&gt;
&lt;p&gt;如果想导出为一个完整模型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;model = model.merge_and_unload()
model.save_pretrained(&quot;./merged_model&quot;)
tokenizer.save_pretrained(&quot;./merged_model&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;7. 常见问题&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cuda available: False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;装了 CPU 版 PyTorch&lt;/td&gt;
&lt;td&gt;重装 CUDA 版：&lt;code&gt;pip install torch --index-url https://download.pytorch.org/whl/cu124&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CUDA out of memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;显存不足&lt;/td&gt;
&lt;td&gt;减小 batch_size、截断长度，或用量化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型不按预期输出&lt;/td&gt;
&lt;td&gt;数据量少/质量差&lt;/td&gt;
&lt;td&gt;增加数据，提高多样性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出格式混乱&lt;/td&gt;
&lt;td&gt;训练数据格式不统一&lt;/td&gt;
&lt;td&gt;统一数据格式，重新训练&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型只会重复一句话&lt;/td&gt;
&lt;td&gt;过拟合&lt;/td&gt;
&lt;td&gt;减少训练轮数，增加数据多样性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加载 LoRA 后没变化&lt;/td&gt;
&lt;td&gt;检查点路径错误&lt;/td&gt;
&lt;td&gt;选到包含 &lt;code&gt;adapter_model.safetensors&lt;/code&gt; 的目录&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;8. 学习资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LLaMA-Factory 官方文档&lt;/strong&gt;：https://github.com/hiyouga/LLaMA-Factory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face 课程&lt;/strong&gt;：https://huggingface.co/learn&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen 官方仓库&lt;/strong&gt;：https://github.com/QwenLM/Qwen2.5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AutoDL 云平台&lt;/strong&gt;：https://www.autodl.com&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaggle 免费 GPU&lt;/strong&gt;：https://www.kaggle.com&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;如果需要针对特定场景（如情感对话、客服、角色扮演）定制训练方案，可以进一步调整数据格式和训练参数。
ok啊，我1800条数据也是训练的40分钟了..太慢了！！&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>记录第一次使用opencv调用摄像头</title><link>http://mblog.linghantech.top/posts/%E8%AE%B0%E5%BD%95%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8opencv%E8%B0%83%E7%94%A8%E6%91%84%E5%83%8F%E5%A4%B4/</link><guid isPermaLink="true">http://mblog.linghantech.top/posts/%E8%AE%B0%E5%BD%95%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8opencv%E8%B0%83%E7%94%A8%E6%91%84%E5%83%8F%E5%A4%B4/</guid><description>记录第一次使用opencv调用摄像头</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;第一次使用 OpenCV 调用摄像头实操记录&lt;/h1&gt;
&lt;p&gt;本文记录本人首次使用 Python + OpenCV 实现电脑本地摄像头调用、实时画面展示、画面捕获、窗口退出的完整实操过程。全文包含环境安装、完整可运行代码、逐行代码详解以及实操踩坑解决方案，逻辑清晰、零基础友好，适合新手入门 OpenCV 视觉开发。&lt;/p&gt;
&lt;h2&gt;一、环境准备&lt;/h2&gt;
&lt;p&gt;本次开发基于 Python 环境，核心依赖 OpenCV 视觉库，全程采用 pip 官方镜像安装，安装速度快、报错率低。&lt;/p&gt;
&lt;h3&gt;1. 检查 Python 环境&lt;/h3&gt;
&lt;p&gt;打开终端/CMD，输入以下命令，校验 Python 是否正常安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若输出版本号（Python 3.7 及以上均可），说明环境正常；若无响应，需先下载安装并配置 Python 环境。&lt;/p&gt;
&lt;h3&gt;2. 安装 OpenCV 库&lt;/h3&gt;
&lt;p&gt;终端执行以下命令安装 OpenCV 核心库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install opencv-python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后，可通过以下命令验证安装是否成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip show opencv-python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;终端显示库版本、安装路径等信息，即代表安装成功。&lt;/p&gt;
&lt;h2&gt;二、完整摄像头调用代码&lt;/h2&gt;
&lt;p&gt;以下为可直接运行的完整源码，适配 Windows/Mac 系统，实现三大核心功能：摄像头实时画面展示、S 键手动截图、ESC 键退出程序，代码简洁无冗余。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 导入opencv核心库
import cv2

# 1. 初始化摄像头
# 参数0代表电脑默认内置摄像头，外接摄像头可尝试1、2、3依次测试
cap = cv2.VideoCapture(0)

# 判断摄像头是否成功打开
if not cap.isOpened():
    print(&quot;摄像头打开失败，请检查摄像头设备或权限！&quot;)
else:
    print(&quot;摄像头打开成功，按S键截图，按ESC键退出&quot;)

# 2. 循环读取摄像头实时画面
while True:
    # ret: 布尔值，是否读取到画面；frame: 每一帧画面的图像矩阵数据
    ret, frame = cap.read()

    # 读取画面失败则退出循环
    if not ret:
        print(&quot;读取画面失败，退出程序&quot;)
        break

    # 展示实时画面，窗口名称为 Camera Live
    cv2.imshow(&quot;Camera Live&quot;, frame)

    # 监听键盘按键（延迟1ms刷新画面）
    key = cv2.waitKey(1) &amp;amp; 0xFF

    # 按ESC键（键值27）退出程序
    if key == 27:
        break
    # 按S键保存当前画面截图
    elif key == ord(&apos;s&apos;):
        # 截图保存至项目根目录
        cv2.imwrite(&quot;camera_screenshot.png&quot;, frame)
        print(&quot;截图成功！已保存为 camera_screenshot.png&quot;)

# 3. 释放硬件资源、关闭所有窗口
cap.release()
cv2.destroyAllWindows()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三、代码逐行详解&lt;/h2&gt;
&lt;h3&gt;1. 库导入与摄像头初始化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import cv2&lt;/code&gt;：导入 OpenCV 核心视觉库，是所有图像、摄像头操作的基础前提。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cv2.VideoCapture(0)&lt;/code&gt;：初始化摄像头对象，参数为摄像头设备索引。&lt;code&gt;0&lt;/code&gt; 为电脑默认内置摄像头，若连接外接 USB 摄像头，可修改参数为 &lt;code&gt;1&lt;/code&gt;、&lt;code&gt;2&lt;/code&gt; 依次测试适配。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 摄像头状态判断&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cap.isOpened()&lt;/code&gt;：检测摄像头设备是否正常开启，返回布尔值 &lt;code&gt;True/False&lt;/code&gt;。可有效规避摄像头未连接、被其他软件占用、系统权限不足等问题导致的程序报错，提升代码稳定性。&lt;/p&gt;
&lt;h3&gt;3. 实时画面读取循环&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cap.read()&lt;/code&gt;：逐帧读取摄像头实时画面，返回两个核心参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ret&lt;/code&gt;：布尔值，&lt;code&gt;True&lt;/code&gt; 代表成功读取画面，&lt;code&gt;False&lt;/code&gt; 代表读取失败（摄像头断开、设备异常、被占用）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;frame&lt;/code&gt;：numpy 数组格式的图像数据，也就是摄像头捕捉到的每一帧画面，是后续展示、截图的核心数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 画面显示与按键监听&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cv2.imshow(&quot;窗口名&quot;, 画面数据)&lt;/code&gt;：创建可视化窗口，实时渲染展示摄像头画面。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cv2.waitKey(1)&lt;/code&gt;：等待键盘输入，参数 &lt;code&gt;1&lt;/code&gt; 代表延迟 1 毫秒，保障画面持续刷新、实现实时预览效果。&lt;/li&gt;
&lt;li&gt;按键逻辑：通过匹配键盘键值，自定义功能——ESC 键（&lt;code&gt;27&lt;/code&gt;）退出程序、S 键手动截图保存。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 资源释放（关键步骤）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cap.release()&lt;/code&gt;：释放摄像头硬件资源，避免摄像头被程序持续占用，导致微信、浏览器、其他软件无法调用摄像头。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cv2.destroyAllWindows()&lt;/code&gt;：关闭所有 OpenCV 创建的图像窗口，彻底终止程序进程，避免后台残留。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;四、运行效果说明&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;代码运行后，自动弹出名为 &lt;code&gt;Camera Live&lt;/code&gt; 的窗口，实时展示摄像头动态画面；&lt;/li&gt;
&lt;li&gt;按下键盘 &lt;code&gt;S&lt;/code&gt; 键，控制台输出截图成功提示，项目根目录自动生成 &lt;code&gt;camera_screenshot.png&lt;/code&gt; 截图文件；&lt;/li&gt;
&lt;li&gt;按下键盘 &lt;code&gt;ESC&lt;/code&gt; 键，画面窗口关闭，摄像头资源释放，程序正常终止。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;五、常见问题与解决方案&lt;/h2&gt;
&lt;h3&gt;1. 摄像头打开失败&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;常见原因：摄像头被微信、浏览器、直播软件等占用；摄像头设备索引错误；系统未开启摄像头权限。&lt;/li&gt;
&lt;li&gt;解决方案：关闭所有占用摄像头的软件；将 &lt;code&gt;VideoCapture()&lt;/code&gt; 参数修改为 &lt;code&gt;1/2&lt;/code&gt; 重新测试；在电脑系统设置中开启应用摄像头访问权限。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 画面黑屏、无实时画面&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;常见原因：摄像头硬件故障、电脑驱动异常、设备索引不匹配、帧读取逻辑异常。&lt;/li&gt;
&lt;li&gt;解决方案：重启电脑、更新摄像头驱动；核对并切换摄像头设备索引（&lt;code&gt;0/1/2&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 程序退出后摄像头仍被占用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;原因：程序异常终止，未执行资源释放代码；进程后台残留。&lt;/li&gt;
&lt;li&gt;解决方案：确保代码末尾执行 &lt;code&gt;cap.release()&lt;/code&gt; 和 &lt;code&gt;cv2.destroyAllWindows()&lt;/code&gt;；强制终止后台 Python 进程后重启终端重新运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;六、实操总结&lt;/h2&gt;
&lt;p&gt;本次实操完成了 OpenCV 最基础的摄像头调用功能，熟练掌握了视觉开发的核心基础流程：&lt;/p&gt;
&lt;p&gt;导入依赖库 → 初始化摄像头设备 → 循环读取画面帧 → 实时展示画面 → 监听自定义操作 → 释放硬件资源。&lt;/p&gt;
&lt;p&gt;该功能是后续人脸识别、目标检测、视频录制、画面滤镜、图像抓拍等 OpenCV 视觉项目的核心基础，可在此代码框架上持续拓展更多实用功能。&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;因为原版文章没了，所以先让ai补了一篇，私密马赛&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>