ChatterPi 是一个将 Raspberry Pi 变成音频伺服控制器的软件包。换句话说,Pi 根据音频输入的音量输出命令来控制伺服。输入可以是存储的音频文件(单声道或立体声.wav 格式)或来自外部源,例如麦克风或线路电平输入。用途之一是驱动电子动画道具,例如头骨或会说话的鸟。
[这篇文章已经更新以反映最新版本中添加的新功能。]
仍然产生良好影响的常见道具是会说话的物体,无论是头骨还是动物。一些成本较低的商业道具使用马达和弹簧。另一种方法是预先编程一个完整的序列来匹配人声,但这非常耗时,如果你想改变人声,或者只是稍微编辑一下,你需要重新编程整个序列。出于这个原因,使用音频伺服控制器来驱动控制颚的伺服电机是一种非常流行的方法。有几种变体。最早使用硬件之一来检测音频何时超过阈值,然后开始将下颌移动到完全打开的位置,当音频低于阈值时,它将开始关闭下颌。“可怕的特里”西蒙斯可能是第一个开发电子硬件板的人为此,Cowlacious Designs继续改进和销售商业版本,增加了许多附加功能,例如内置音频播放器、各种触发选项以及控制 LED 作为眼睛的能力。
后来,一个名叫 Mike(无亲属关系)的人将 Arduino 与硬件音量级板结合起来生产了Jawduino 。这从只有 2 个级别变为 4 个级别。原始项目只是接收音频并控制伺服,但其他项目添加了扩展以播放存储的 mp3 文件和/或随机移动其他伺服(例如,http://batbuddy.org/资源/Halloweenstuff/TalkingSkull.php )。
几年前,来自 Haunt Hackers 的 Steve Bjork 将专用硬件与螺旋桨微控制器相结合,将级别数增加到近 256 个,并滤除不会导致口语声音出现下巴移动的低频和高频。结果是Wee Little Talker 。该商业板还具有板载 mp3 播放器,可以从外部触发,控制 LED“眼睛”,并增加了包括语音反馈菜单系统在内的多种功能。
我突然想到,凭借当前的单板计算机功能和强大的软件库,应该可以将所有这些中的大部分最佳功能整合到一个在 Raspberry Pi 上运行的基于软件的单一系统中。结果是 ChatterPi。ChatterPi 是使用 Python 语言从头开始开发的,但功能和特性的想法是从以前的音频伺服控制器项目中自由借鉴的。
ChatterPI 的设计非常强大和灵活,无需用户修改任何代码(尽管高级用户当然也可以这样做)。手册的“操作”小节中描述了所有功能和选项。
该视频展示了 ChatterPi 的运行情况,同时使用了已保存的.wav 文件和麦克风输入。ChatterPi 正在控制下巴的运动。其他头骨运动被预先编程为在Pololu Maestro 伺服控制器上运行的脚本。
本节介绍如何设置和安装使用 ChatterPi 和使用它的硬件和软件。
硬件
ChatterPi 是在 Pi 3 A+ 和 Pi Zero W 上开发和测试的。鉴于它适用于 Pi Zero,它应该适用于任何 Pi。[2020 年 7 月 13 日更新:原始代码在音量提取代码中有一个缓慢的部分,导致它无法在 Pi Zero 上运行。这已在最新版本中修复。]
除了 Raspberry Pi,您还需要一个 USB 声卡。出于几个原因需要这样做。首先,如果您打算使用外部声源,则需要一种将音频输入 Pi 的方法。其次,除了不能产生很好的声音外,音频输出连接器可能与驱动伺服所需的脉冲宽度调制 (PWM) 代码共享时序,从而产生冲突。使用便宜的 USB 声卡可以解决这两个问题。我用过 Adafruit 的一款,售价不到 5 美元,效果很好(见https://www.adafruit.com/product/1475)。您需要将 TRS(标准立体声)插头或适配器插入声卡上的耳机和麦克风插孔。该卡不适用于 TRRS(组合麦克风/立体声耳机插头。如果您想使用麦克风或其他外部声源,则只需要一个。否则,您可以使用保存在 Raspberry Pi 上的 audio.wav 文件。您但是,仍然需要 USB 声卡进行音频输出。
这就是音频伺服控制器所需要的一切。当然,如果你想用一个来触发你的道具,你需要一个电源和一个你想要控制的伺服器,例如一个配备伺服器的说话头骨和一个被动红外传感器 (PIR)。我使用 Parallax 的这个(https://www.parallax.com/product/555-28027 )进行开发,因为我已经有一个备用的。如果您不想使用外部传感器,还可以将 ChatterPi 设置为触发重复计时器或仅打开并运行。
图 1 显示了用于测试操作的测试台设置。红色 LED 连接到“TRIGGER_OUT”引脚以进行测试。可以移动它或将另一个 LED 和电阻器连接到“EYES_PIN”以测试该功能。触发控制器时,TRIGGER_OUT 引脚变为高电平 0.5 秒。这可用于触发另一个道具或控制器。只要音频播放,EYES_PIN 就会保持高电平。
默认 PIN 选择(可在 config.ini 文件中更改)为:
图 2 是我的测试设置的照片。面包板上的接线位置略有不同,因为我用它来测试各种项目以及 3 线伺服控制器线,但原理图连接是相同的。
软件概述
操作或使用 ChatterPi 不需要了解或理解软件代码。ChatterPi 包由八个 Python 3 模块和一个配置文件组成,如图 3 所示。
配置文件 config.ini 包含所有用户可选择的参数,包括哪些引脚用于哪些功能、音频源是麦克风输入还是存储的 .wav 文件、应使用哪种伺服控制模式以及伺服阈值水平。config.py 程序只是读取这些值并在运行时使它们在内存中可用。
main.py 程序本质上只是在启动时加载配置参数并调用 control.py。control.py 中的函数没有折叠到 main.py 中,以避免子模块必须导入主程序,这可能会出现问题。
大多数处理发生在 control.py 和 audio.py 模块中。control.py 程序使用 config.ini 文件中指定的方法处理大部分触发(定时器、外部触发(如 PIR)或在启动时立即使用 config.ini 文件中指定的方法。它使用 GPIO Zero 和 PiGPIO 库来监控触发传感器并将输出发送到输出触发器和 LED 引脚。PiGPIO 用作 GPIO 零下面的 GPIO 层,因为它使用 DMA 控制来控制用于控制伺服的脉冲宽度调制 (PWM) 控制。其他一些库,包括GPIO Zero 使用的默认一个,使用软件 PWM,这对于控制 LED 亮度等任务来说是足够的,但对于伺服控制来说不够精确。
除非触发模式为 START,否则文件将进入无限循环,等待计时器到期(TIMER 模式)或生成外部触发(PIR 模式)。等待功能满足要求,在开发过程中,中断驱动的方法干扰了音频输出,可能是由于时序冲突。在 TIMER 模式下,在音频文件完成播放(如果源是 FILES)或在可配置的预设时间(如果源是 MICROPHONE)之后重新启动定时器。
触发时,会调用一个事件处理程序,根据设置,触发 TRIGGER_OUT 以触发另一个道具或设备并打开 LED 眼睛或其他低功耗设备。然后,如果音频源是 FILES,它将调用 track.py,它将选择下一个要播放的 .wav 文件并调用 audio.py,传递要播放的 .wav 文件的名称。如果音频源是 MICROPHONE,则调用 audio.py 时不传递文件名。当对 audio.py 的调用返回时,事件处理程序关闭 LED 眼睛并返回。
音频播放、音频分析和伺服控制都由 audio.py 模块执行。它定义了一个类,AUDIO。当调用 audio.play 函数时,它会检查音频源是 MICROPHONE 还是 FILES 并适当地打开 PyAudio 流。流调用在单独的线程中运行(这由 PyAudio 自动处理)。对于输入流的每个块,都会调用一个回调函数。这个回调函数是分析音频流音量的地方。计算每个块的平均音量,并根据该平均音量和用户在配置文件中指定的阈值水平命令伺服器到适当的位置。波形库用于从存储中读取波形文件,结构库用于帮助解构波形数据以计算音量,并帮助分别分析立体声文件的左右声道。级别数、具体阈值以及在计算音量之前是否应用带通滤波器取决于用户在配置文件中设置的 STYLE 设置。除了官方文档,我还找到了一个幻灯片演示,Jean Cruypenynck 的 PyAudio简介非常有帮助。
如果 STYLE 设置为 2,则调用 bandpassFilter.py 来处理数字音频流并返回应用了带通滤波器的修改后的流。该程序非常简短。它使用 scipy 信号处理库中的两个函数来过滤掉低于 500 Hz 和超过 2500 Hz 的音频输入。没有为 STYLE 0 或 STYLE 1 应用带通滤波器。
当 AMBIENT 设置为 ON 时,audio.py 中的环境播放函数还必须监视触发事件(计时器或传感器),因为它需要在发生此类事件时中断自身并将控制权传递回 control.py。
config.ini 文件可以直接编辑,也可以通过名为 controlPanel.py 的 GUI 程序进行编辑。如果在执行过程中更改了伺服或控制器参数子集,则更改将在下次触发声轨时反映出来。其他更改在 ChatterPi 停止然后重新启动后才会生效。
maxVol.py 是一个可以从控制面板启动的实用程序。它读取和分析人声或环境子目录中的每个波形文件,并将它们写回,并将音量增加到可能的最大值,而不会出现削波或失真。
软件安装和设置
有关完整说明,请参阅GitHub 上的用户手册。
此版本 0.9 包括当前为 ChatterPi 计划的所有功能。也就是说,以后可能会添加两个附加功能(或者如果有人愿意将它们添加到这个开源项目中:
该代码是开源的并发布在 GitHub ( https://github.com/ViennaMike/ChatterPi)上,我欢迎任何想要添加这些高级功能的人。
要报告错误、提出建议或提出问题,请转到项目的 GitHub 存储库 ( https://github.com/ViennaMike/ChatterPi)并打开一个问题。为此,首先单击问题选项卡,然后使用绿色的“新问题”按钮。最好先浏览或搜索其他报告的问题,看看是否有人已经报告了相同的问题或提出了相同的问题。然后,您可以向现有问题添加评论或建议,而不是打开一个新的、重复的问题。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !