当前位置: 首页 > news >正文

复刻 Python 实现的小智语音客户端项目py-xiaozhi日记

https://www.bilibili.com/video/BV17HaKzLEi3/

运行视频。

围绕 Sherpa-ONNX 关键词唤醒环境配置 的排查过程。


学习日记 —— Sherpa-ONNX 关键词唤醒调试记录

📅 日期

2025-09-02


📝 学习内容

  1. MOSS & 相关背景

    • 初步了解了第一代 MOSS 项目的开发历程,知道「虾哥」在其中的关键贡献(主要是开源生态和技术实现层面的支持)。

  2. 模型加载问题

    • 报错:

      InitDecoder:181 'vocab_size' does not exist in the metadata
      
    • 原因:ONNX 模型缺少 vocab_size 元数据。

    • 学到:有些 Sherpa-ONNX 模型需要带完整的元数据,如果下载的模型不包含,就会初始化失败。

  3. 路径问题 (PowerShell)

    • 多次遇到 cd: 找不到路径 的错误。

    • 原因:路径里有空格或特殊符号,或者路径根本不存在。

    • 解决方法:在 PowerShell 中使用引号 "..." 并确认文件夹实际存在。

  4. KeywordSpotter 初始化错误

    • 报错:

      ValueError: invalid stof argument
      
    • 原因:配置里有字段(如 sample_rate、mel_bins 等)本应是数字,但传入了字符串或空值。

    • 学到:

      • Sherpa-ONNX 的 KeywordSpotter 对配置严格要求,所有数值参数必须是整数/浮点数。

      • 在调用前打印配置内容,可以快速定位错误字段。

  5. 如何在 Windows/PyCharm 执行 Linux 命令

    • 方法:

      • 在 Windows PowerShell 或 CMD 中可以运行部分命令。

      • 需要 Linux 工具时,可以安装 WSL (Windows Subsystem for Linux),或者在 Python 中用 subprocess 调用。


🔍 调试方法总结

  • 先跑命令行 Demo → 确认模型和参数是否正确。

  • 再看 Python 封装 → 打印传入的配置,确保和 Demo 参数一致。

  • 逐步排查 → 先确认路径存在,再确认数值参数类型正确。


🤔 我的收获

  • 现在我能更快定位 ONNX 模型初始化类报错的原因。

  • 熟悉了在 Windows 下如何用 PowerShell/WSL 来跑 Linux 风格命令。

  • 意识到 配置验证 很重要,尤其是类型(string vs int/float)的问题。


好的 👍 我帮你把这几天的问答整理成一个 学习日记,内容既保留技术细节,又有记录感。下面是初稿:


学习日记

学习主题

语音助手 GUI 界面开发与资源优化

学习过程与收获

1. 理解现有 GUI 代码结构

  • 学习了 GuiDisplay 类的作用:通过 PyQt5 构建图形化界面,负责显示情绪表情、用户输入和系统对话。

  • 发现情绪表情的切换是通过 update_emotion() 方法实现的,原理是加载对应的图片资源。

  • 一开始代码写的是 .png 格式,但实际 assets/ 文件夹里存放的是 .gif 文件,这说明项目经历过资源更新。

2. 图片与动画显示方式

  • PNG:只能显示静态图片,如果想动起来,需要外部逻辑不断切换图片帧。

  • GIF:自带多帧,可以通过 QMovie 在 PyQt5 中直接播放,避免外部频繁刷新。

  • 收获:明白了 GUI 表情动画有两种实现方式——逐帧刷新(PNG)和自带帧动画(GIF)。

3. Jarvis 风格动画尝试

  • 用 Python 的 matplotlib.animation 生成了一个科幻感的能量环动画,并保存为 GIF。

  • 这样可以替换现有的表情 GIF,实现类似《钢铁侠》里的 Jarvis 风格界面效果。

4. 二次元表情扩展

  • 在原本的 emoji 表情基础上,尝试生成了一套二次元风格的女性表情包(不同情绪:生气、开心、震惊等)。

  • 这为后续在助手中切换不同“形象”提供了素材支持。

遇到的问题

  • 一开始搞不清楚为什么代码里写 .png,但文件夹里全是 .gif,后来确认是历史遗留问题。

  • 动画效果实现方式存在差异,需要决定是否统一为 GIF。

下一步计划

  • 修改 update_emotion() 方法,兼容 PNG 和 GIF 两种格式。

  • 整理一套高质量的 Jarvis 动画资源,替换现有的 emoji。

  • 考虑让助手在不同场景下自动切换“二次元形象”或“科幻形象”,增强交互体验。


http://www.dtcms.com/a/364042.html

相关文章:

  • AI助力开发:JetBrains官方DeepSeek插件Continue一站式上手!
  • 为什么研发文档的变更缺乏审批和追溯
  • 2025 大学生职业准备清单:从数据到财会,这些核心证书值得考
  • 毕业项目推荐:70-基于yolov8/yolov5/yolo11的苹果成熟度检测识别系统(Python+卷积神经网络)
  • Spring 循环依赖问题
  • 【代码随想录day 22】 力扣 40.组合总和II
  • 威科夫与强化学习状态
  • Spring Security 如何使用@PreAuthorize注解
  • srm信息系统数字化采购(程序代码部署程序包源码Java)
  • 实验3-传输层协议分析
  • [Java]PTA:jmu-Java-01入门-取数字浮点数
  • CentOS7安装Nginx服务——为你的网站配置https协议和自定义服务端口
  • js 获取字符串第一个字符
  • 《Visual Abstraction: A Plug-and-Play Approach for Text-Visual Retrieval》
  • 从 “容器保姆” 到 “云原生王者”:K8s 全方位指南
  • UCIE Specification详解(十三)
  • EPLAN 分散式端子:提升原理图设计效率的实用功能
  • 【C++】深入解析C++嵌套依赖类型与typename关键字
  • Jenkins Pipeline 语法
  • 【机器人概念设计软件操作手册】建筑与环境建模
  • 【服务器部署】CentOS 7/8 离线部署 Harbor v2.10.3 超详细攻略
  • docker desktop拉取镜像失败解决方案
  • ArkUI核心功能组件使用
  • pycharm无法添加本地conda解释器/命令行激活conda时出现很多无关内容
  • 【python】python进阶——pip命令
  • 单调栈与单调队列
  • 《从零搭建二叉树体系:从节点定义到子树判断的实战指南(含源码可直接运行)》
  • 利用Base64传输二进制文件并执行的方法(适合没有ssh ftp等传输工具的嵌入式离线场景)
  • TDK InvenSense CH201距离传感器
  • Photoshop用户必看:让你的PSD像JPG一样可预览