树莓派还能这么玩之做一个语音音箱

关注树莓派很久了,只是没有很感兴趣的应用场景,就没有买来玩。几个月前偶然得到一个小度音箱,发现了新大陆,各种语音控制功能,便捷性不言而喻,还买了一些外部设备可以通过小度控制,发现有红外遥控器可以控制家里的大部分红外家电,奈何码库不是很全,有些设备还是不能控制的,而且不支持定制功能。恰好在知乎看到了一些 geek 视频,想着自己也做一个,可以支持红外数据的定制,做到自由遥控。于是乎说干就干,从一个什么硬件都不懂的小白一步步的了解了点硬件知识,软件部分相对好实现一些。主要计划的功能是通过语音来控制红外家电、温湿度监控以及智能提醒等功能,先完成主体框架然后再不断开发插件形式来增强可玩性。

计划主要分为两个子系统

  1. 软件子系统,主要实现语音到文字和文字到语音的转换,逻辑功能的处理等。
  2. 硬件子系统提供收音、音箱、温湿度传感器、红外收发、系统供电等能力的支持。

总体功能点进度如下

  • ok 显示,信息简单展示界面,计划采用 OLED12832 屏。
  • ok 收音,收集外接语音信息。
  • ok 音响,输出系统响应结果。
  • 温度和湿度,收集设备所在环境的温度和湿度。
    [En]

    temperature and humidity, collecting the temperature and humidity of the environment in which the equipment is located.*

  • ok 风扇,硬件系统散热。
  • ok 红外收/发,红外设备系统的录入和红外信号的发射,用于控制红外家电。
  • 电源模块,用于为音频和覆盆子馅饼硬件供电。
    [En]

    Power supply module to power audio and raspberry pie hardware.*

  • ok pcb 电路版设计,传感器集成。
  • 3d 打印外壳,最后根据硬件的排列情况定制一个简洁的外壳。
  • ok 语音汉字互转,计划采用讯飞 API 接口实现,后面尝试做简单的语音识别模型。
  • ok 逻辑控制和输出输入设备控制模块,基于硬件传感器数据的采集和信息的归纳整理能力。

硬件部分

一直以来都是做的软件,这次从 0 到 1 一点点学的硬件,到 PCB 打样,焊板。也没研究什么设计规范,按照能用的级别做的。

实验数据收集

树莓派4 GPIO 引脚

关于树莓派 IO 接口部分参考了:
树莓派IO接口你了解吗?看完这篇就够了

一、电源输出引脚

3v3、5v代表:3.3伏特和5伏特,是输出供电的正极,也就是我们常说的Vcc

GND代表接地和输出供电的负极

特别注意:每个引脚最大输出电流为16毫安(mA),且同一时刻所有引脚的总输出电流不超过51毫安

二、GPIO

GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。GPIO口的使用非常广泛。掌握了GPIO,差不多相当于掌握了操作硬件的能力。树莓派有26个GPIO接口,其中有一部分是复用接口。

  1. 引脚3、5为IC总线复用接口
  2. 引脚7为(GCLK)全局时钟引脚复用接口
  3. 引脚19、21、23为SPI总线复用接口
  4. 引脚8、10为串口复用接口,TX发送,RX接收
  5. 引脚12、32、33、35为PWM复用接口

三、IC总线

IC是内部整合电路的称呼,是一种串行通讯总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边装置而发展。IC的正确读法为”Inter-Integrated Circuit” 。

  • SDA:数据线
  • SCL:时钟线

四、SPI总线

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议。

  • MISO:数据输入
  • MOSI:数据输出
  • SCLK:时钟信号
  • SS:使能信号

五、UART总线

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
可以理解为计算机的串口。RS232、TTL。

  • RX是接收
  • TX是发送

六、PWM脉冲宽度调制

脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

AD 教程

AD 使用与硬件电路图画图和PCB图设计使用的。主要是看了B站的一个入门视频教程,然后再不断搜搜改改来实现的。

B 站上的一小时速成教程:
Altium Designer一小时快速入门

其它参考资料:

详解如何用AD 生成Gerber文件

如何制作一张印刷电路板(PCB)的3D渲染效果图?

单位转换

  • 1.0mil = 0.025mm
  • 1.2mil = 0.030mm
  • 1.25mil = 0.032mm

DHT11 温湿度传感器

下面是温湿度传感器的基本电路图,这里本来是3pin方案到树莓派的,板子上也画好了,只不过在焊接的时候没有处理好,现在系统始终无法正确读数,只是在测试期间能正常读。

树莓派直接读取 DHT11 温湿度的方法

OLED 12832

这里使用了 Adafruit_Python_SSD1306 库来驱动液晶屏显示。
在树莓派上使用 SSD1306 OLED 屏幕

IR 收发

红外发射图,这里只画了两个,实际我是配置了4个红外发射二极管,限流电阻调整成 100R。

红外接收图像,主要是在引脚的情况下,这里直接使用了已经简单封装的传感器。

[En]

Infrared receiving image, mainly in the case of pins, here the sensor which has been simply packaged is directly used.

IR的收发是主要调试的功能:

红外录入功能使用: 安装 Linux 下的红外控制库:

sudo apt-get update
  sudo apt-get install lirc

更新 /boot/config.txt 文件来开启红外收发接口:

Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=18,gpio_in_pull=up

更新 /etc/lirc/lirc_options.conf 文件来控制当前是接收模式还是发射模式,修改完重启服务生效:

device=/dev/lirc0

测试红外信号是否能正常接收:

[En]

Test whether the infrared signal can be received normally:

mode2 -d /dev/lirc0

space 16777215
pulse 8999
space 4457
pulse 680
space 1627
......

可以通过 lirc 录制简单的红外设备生成遥控文件,如果空调这种比较复杂的不太好弄。

检查按钮名称,其中一个红外线代码绑定到一个按钮,你需要找到一些你记录的键并写下来。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Check the button name, where an infrared code is bound to a button, you need to find some of the keys you recorded and write it down.</font>*</details>
irrecord -l
打开录音命令,这个录音过程比较复杂,需要判断周围的噪音,然后随机按下按钮,最后是录音按钮,我的一些红外线设备按键都录不下来,只有台灯录过了,有点奇怪。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Turn on the recording command, this recording process is more complicated, you need to judge the ambient noise, and then press the button randomly, and finally the recording button, and some of my infrared device keys can not be recorded, it is a bit strange that only the desk lamp has recorded it.</font>*</details>
irrecord ~/lircd.conf
如果有问题可以录制 raw code
irrecord -f ~/lircd.conf

录制的文件内容是这样的。如果没有内容,则不会录制。

[En]

The content of the recorded file is like this. If there is no content, it is not recorded.

begin remote
  name myir
  flags RAW_CODES|CONST_LENGTH
  eps 30
  aeps 100
  gap 108055
      begin raw_codes
          name KEY_1
            9062 4462 621 531 627 532
              626 531 626 532 629 531
              601 556 627 531 628 530
              628 1610 629 1611 603 1636
              603 1636 629 1612 629 1609
              631 1609 630 1610 627 1612
              630 530 629 1608 629 532
              626 534 625 532 628 1609
              629 532 628 529 630 1609
              629 530 626 1612 629 1610
              629 1610 629 540 633 1596
              629
          name KEY_2
            9067 4455 632 528 630 528
              633 524 631 529 630 529
              630 528 630 530 630 528

最后要把录制的文件内容复制到对应目录,重启,让 lirc 服务能加载上:

sudo cp ~/xx.lircd.conf /etc/lirc/lircd.d/xx.lircd.conf

实际上发送按键需要执行的命令包含你复制的文件名(device-name)以及按键名(KEY_1):

 irsend SEND_ONCE  KEY_1

红外输入输出参考

使用LIRC为Raspberry PI(RPi)设置IR远程控制 树莓派 ——红外遥控篇lirc【内核4.19.x】

人类身份验证 – SegmentFault 树莓派:红外遥控测试

树莓派3B——-使用lirc配置遥控器 – Huang路飞 – 博客园

树莓派4B 4.19.X内核,红外接收与发送(附python发送红外)教程

发现,作为一名新秀,参考了很多文章,这里在录制的时候也踩了很多洞。

[En]

Found that, as a rookie, referred to a lot of articles, here in the recording time also stepped on a lot of holes.

软件部分

软件简单地分为前台功能和后台功能,前台功能主要面向用户,后台功能主要用于相关功能的配置。代码不会先运行。

[En]

The software is simply divided into the foreground function and the background function, the foreground function is mainly for the user, and the background function is mainly for the configuration of related functions. The code will not go first.

前台功能分为三个模块,输入模块、逻辑处理模块和输出模块。

[En]

The foreground function is divided into three modules, the input module, the logic processing module and the output module.

其中热词唤醒方案使用的 snowboy ,语音文字互转采用的讯飞免费接口,后面可以考虑实现一些简单的部分。

根据这一方案,只要不断配置和扩展功能,主要处理流程不会有太大变化。

[En]

According to this scheme, as long as the functions are constantly configured and expanded, the main processing flow will not change much.

语音部分参考

树莓派使用 snowboy 配置语音唤醒

离线语音Snowboy热词唤醒+ 树莓派语音交互实现开关灯

Python人工智能之路 – 第三篇 : PyAudio 实现录音 自动化交互实现问答

语音听写(流式版)WebAPI 文档 | 讯飞开放平台文档中心

语音合成(流式版)WebAPI 文档 | 讯飞开放平台文档中心

讯飞开放平台语音识别音频文件格式说明 | 讯飞开放平台文档中心

软件部分将在优化后发布。

[En]

The software part will be released after optimization.

总结

目前,第一阶段已经实现了核心功能,可以语音控制普通红外家电,需要两周(晚上)。这只能在当前的时间和精力内实现。毕竟,工作和生活仍然占据了大部分时间。它的使用过程比较简单,启动后就可以插上电源,但语音和音箱部分并没有轻松整合到整个项目中。在下一阶段,我们计划对电路进行优化,以支持更多的传感器,然后集成麦克风和扬声器,然后制作一个外壳。

[En]

At present, the first phase has achieved the core function, which can control ordinary infrared household appliances by voice, which takes two weeks (night). This can only be achieved in the current time and energy. after all, work and life still occupy most of the time. The process of using it is relatively simple, it can be plugged in since it is started, but the voice and speaker parts have not been easily integrated into the whole project. In the next phase, we plan to optimize the circuit to support more sensors, then integrate the Mike and speaker, and then make a shell.

整个项目从计划到实施还是学到了一些,主要是硬件方面上的了解,电路原理图、PCB画图打样、硬件电路 IO 接口标准等,软件部分并没有太多的实践,准备放到三期做软件层面的优化,把外部 API 调用改成自己训练的语音模型。

欢迎私信交流~

最后,推荐树莓馅饼:

[En]

Finally, the recommendation for raspberry pie:

嘉立创定制PCB打样 批量生产 激光钢网 SMT打样贴片加工 源头厂家

Original: https://blog.csdn.net/noogel/article/details/122921687
Author: 知一杂谈
Title: 树莓派还能这么玩之做一个语音音箱

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/512442/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球