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

AIoT应用开发:给板子装上‘嘴巴‘,实现音频播放

最近新入手了一台 arm 开发板,希望打造一款有温度、有情怀的陪伴式 AI 对话机器人。

大体实现思路如下:

前几篇,在板子上把LLM 大脑耳朵装上了:

  • 如何在手机端部署大模型?
  • 手机端跑大模型:Ollma/llama.cpp/vLLM 实测对比
  • AIoT应用开发:给板子装上’耳朵’,实现实时音频录制

对应到设备上:

  • 耳朵 == 麦克风(上篇搞定);
  • 嘴巴 == 扬声器(本篇开搞);

今日分享,带大家实操:如何在开发板上接入扬声器,实现音频播放。

有小伙伴问:没有 arm 开发板怎么办?准备一台 Android 手机就行。

友情提醒:本文实操,请确保已在手机端准备好 Linux 环境,具体参考教程:如何在手机端部署大模型?

1. 两种思路

开发板上预装了 Android 13系统和 AidLux 开发工具,拥有丝滑的 Linux 环境。

如何接入扬声器,实现音频输出呢?

我尝试了两种方案:

  1. 耳机:找了一个 3.5mm 接头的耳机,插入音频输出接口,不过,在终端中执行 aplay -l,无法识别到音频设备。折腾了半天最终放弃!

  1. 蓝牙音箱:成功接入!下文我们一起来聊聊:我是如何接入蓝牙音箱,并实现音频播放的。

2. 接入蓝牙音箱

首先是在 Linux 环境中配置蓝牙:bluetoothctl 打开蓝牙,显示 No default controller available,表明系统没有检测到任何蓝牙适配器。

无奈之下,把开发板接入显示器,进入 Android 界面看看吧。人肉打开蓝牙,依然无法搜索到周围蓝牙设备。。。

蓝牙信号接收不了?

后来经一大佬提示:外界蓝牙和 WIFI 信号都走同一个天线。

那就把天线接上试试吧!

果然,WIFI 信号直接拉满,蓝牙设备也接进来了~

3. 实现音频播放

3.1 尝试1:Linux 端

蓝牙音箱是接入进来了,不过终端还是发现不了。

aidlux@aidlux:~$ aplay -l
aplay: device_list:276: no soundcards found...

运行以下命令检查音频设备的权限:

aidlux@aidlux:~/projects/aibot$ ls -l /dev/snd
total 0
drwxr-xr-x. 2 root   root       60 Sep 17 16:27 by-id
drwxr-xr-x. 2 root   root       60 Sep 17 16:27 by-path
crw-rw----. 1 system  1005 116, 61 Jan  1  1970 comprC1D11
crw-rw----. 1 system  1005 116, 62 Jan  1  1970 comprC1D24

发现音频设备的权限又被默认设置为了 1005 用户组,再改一次吧:

sudo chgrp audio /dev/snd/*

再次执行 aplay -l,还是没发现新设备:

aidlux@aidlux:~/projects/aibot$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: lahainayupikidp [lahaina-yupikidp-snd-card], device 0: MultiMedia1 (*) []Subdevices: 1/1Subdevice #0: subdevice #0

看来,这条路是走不通了,赶紧换!

3.2 尝试2:Android 端

参考文档:https://docs.aidlux.com/api/#/?id=%E7%A1%AC%E4%BB%B6

原来 AidLux 中提供了对 Android 端的系统访问,其中有一项媒体播放

目测应该是下面这两个包提供的支持。

pip list | grep aid   
aidlux-aistack-base     1.1.0
pyaidlite               2.0.9

根据文档,媒体播放模块可实现如下几个功能:

  • 音频播放:入参分别是文件URL,tag,是否立即播放。
res = droid.mediaPlay('/sdcard/audios/20240914_204515.wav', 'default', True)
print(res)
# 输出结果
Result(id=0, result=True, error=None)

注意:音频文件需放在 Android 目录 /sdcard 下,否则播放不了哦。

  • 检查是否正常播放:
res = droid.mediaIsPlaying('default')
print(res)
# 输出结果
Result(id=0, result=True, error=None)
  • 查看播放列表:
res = droid.mediaPlayList()
print(res)
# 输出结果
Result(id=0, result=['default'], error=None)
  • 查看播放信息:
res = droid.mediaPlayInfo('default')
print(res)
# 输出结果
Result(id=0, result={'loaded': True, 'duration': 2880, 'looping': False, 'isplaying': False, 'tag': '20240914_204515', 'position': 2880, 'url': '/sdcard/audios/20240914_204515.wav'}, error=None)
  • 停止播放:从缓存中清除
res = droid.mediaPlayClose('default')
print(res)
# 输出结果
Result(id=0, result=True, error=None)

基于以上接口,音频播放终于成功搞定!

大家有更好的想法,欢迎交流。

写在最后

至此,我们已经给开发板装上了:大脑 + 耳朵 + 嘴巴,下篇我们将这三者串联起来,实现 AI 机器人的雏形,敬请期待!

如果对你有帮助,欢迎点赞收藏备用。


为方便大家交流,新建了一个 AI 交流群,欢迎对AIoTAI工具AI自媒体等感兴趣的小伙伴加入。

最近打造的微信机器人小爱(AI)也在群里,公众号后台「联系我」,拉你进群。


http://www.mrgr.cn/news/30018.html

相关文章:

  • 基于ZYNQ7035的PS-linux实现FTP服务器移植
  • 随笔20241113 数据分组与期次累加计算功能实现
  • 编程初学者的第一个 Rust 系统
  • C++ 语言实现读写.csv文件.xls文件
  • 【leetcode练习·二叉树】用「分解问题」思维解题 I
  • Caused by: org.apache.flink.api.common.io.ParseException: Row too short:
  • 英语六级-学习
  • 【数据结构】排序算法---快速排序
  • python中测试框架
  • Linux相关概念和重要知识点(3)(yum、gcc和g++、动静态库)
  • 10款超好用的文档加密软件|企业常用的文档加密软件排行榜
  • sensitive-word 敏感词 v0.20.0 数字全部匹配,而不是部分匹配
  • 【吊打面试官系列-MySQL面试题】主键和候选键有什么区别?
  • GraphRAG与VectorRAG我都选:HybridRAG
  • git 生成和查看密钥
  • 基于等保2.0标准——区块链安全扩展要求探讨
  • Selenium异常处理:捕获并处理自动化测试中的常见异常
  • Django 5 学习笔记 2024版
  • Python日志模块全面指南:如何高效记录与管理日志
  • 【最佳实践】优雅地处理 Java 中的空指针
  • 阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4
  • 【Finetune】(二)、transformers之Prompt-Tuning微调
  • 配网缺陷检测无人机航拍图像数据集(不规范绑扎,螺栓销钉缺失)数据集总共3000张左右,标注为voc格式
  • QT开发:深入详解QtCore模块事件处理,一文学懂QT 事件循环与处理机制
  • Mysql系列-索引优化
  • 鸿萌数据恢复服务: 修复 Windows, Mac, 手机中 “SD 卡无法读取”错误