在我的史诗系列的第3部分“Building a Raspberry Pi-powered Barkometer”, I covered how to capture audio using the arecord command and how I’d discovered that I got better sound out of an old USB webcam than the fancy-schmancy (but very cheap) USB sound card I started out with. I wound up in Part 3 collecting 60-second sound files in WAV format in a subdirectory on the Raspberry Pi, each named for the sample’s start time (e.g.2016-09-07-04-42-27.wav.
)。
我们需要从RPI中获取这些文件,以便我们分析它们。从理论上讲,这可以在董事会上完成,但现在我们将把它们与另一台机器进行FTP进行分析。所以,要把录音到某个地方,我们可以切片和骰子,我们将使用ncftpput.
,包含FTP实用程序ncftp.
包。安装ncftp.
我们将在RPI命令行上运行以下命令(一如既往地,安装新包时,您应该运行sudo apt-get更新
第一):
sudo apt-get安装ncftp
我们的录音在于$ home / bark
因此,我们现在可以使用以下命令行将它们与另一台计算机FTP到另一台计算机:
ncftpput -u admin \ -p password \ -dd \ -v \ ftpserver \ / bark \ $ home / bark /*.*
让我们打破这个(见手册页为了ncftpput.
命令行选项):
-u管理员
和-p密码
是目标FTP服务器的登录凭据-DD
成功上传后导致本地文件删除。-v.
禁止上传进度计的显示FtPServer.
是目标FTP服务器的IP地址或名称/吠
是存储文件的远程目录$ home / bark /*.*
是要fTPED的文件的规范
现在我们需要做的是自动化这样,以便每次录制完成时,它会向FTP服务器运送。这是我们可以使用真正酷命令的地方,Inotifywait.
,监视文件和目录的更改。Inotifywait.
用途inotify.
,“一个Linux内核子系统,它可以扩展文件系统以注意文件系统的更改,并将这些更改报告对应用程序”(维基百科)。此工具位于包中Inotify-Tools.
因此安装了哪个:
sudo apt-get install inotify-tools
借Inotifywait.
安装了,我们可以设置这样的bash脚本:
arecord -d plughw:1,0-q -buffer-time = 5000000 -f dat -c 1-t wav --max-file-time 60 - 使用-strftime $ home / bark /%y-%m-%d-%h-%m%秒.wav&
虽然是真的
做
newfile =`inotifywait -q --format%f-p close_write $ home / bark`
ncftpput -u admin -p password -dd ftpserver / bark $ home / bark / $ newfile
完成
我讨论了从一个记录
在前一篇文章和&
在命令结尾告诉Bash将其运行为后台任务。该虽然......完成
创建一个无限的循环和开头的线新文件
如下清除:
newfile =
设置临时环境变量`
此反馈在将其传递到命令之前,将所有内容达到整个重叠的所有反击,在这种情况下,设置值新文件
。没有这个,新文件
将占据“Inotifywait”的价值而不是产出Inotifywait.
Inotifywait.
块,直到发生特定的文件系统事件-q.
防止程序从打印我们不需要的基本状态消息-buffer-time.=
5000000
分配5秒的缓冲区(见下文)- 格式%F.
指定在发生文件系统事件时,输出Inotifywait.
将是受影响的文件的名称-e close_write.
这指定了等待的事件,关闭文件$ home / bark
是要监控的子目录
所以,当文件创建的文件时一个记录
,关闭了$ home / bark
子目录,Inotifywait.
停止阻止并打印关闭文件的名称,然后将存储在环境变量中新文件
脚本将恢复。命令ncftpput.
然后将执行并传输已发现的文件名Inotifywait.
到FTP服务器和Voila!任务完成!
在Raspberry PI上运行上面的Bash脚本生成如下所示的输出:
pi @ rpi-01:〜$ sh barkometer.sh
/ home/pi/bark/2016-10-01-13-18-57.wav:5.49 MB 5.28 MB / s
/ home/pi/bark/2016-10-01-13-19-57.wav:5.49 MB 5.19 MB / s
现在,您可能已经注意到参数中的参数一个记录
在上面的脚本中,我添加了我在我讨论的命令行中的东西第3部分。我添加了什么-buffer-time.
=
5000000
因为用我的原来一个记录
命令行您偶尔会看到像这样的溢出所报告的:
pi @ rpi-01:〜$ sh barkometer.sh
/ home/pi/bark/2016-10-01-13-18-57.wav:5.49 MB 5.28 MB / s
/ home/pi/bark/2016-10-01-13-19-57.wav:5.49 MB 5.19 MB / s
/ home/pi/bark/2016-10-01-13-19-57.wav:5.49 MB 5.19 MB / s
超支!!!(至少191.372毫秒)
/home/pi/bark/2016-10-01-13-20-57.wav:5.49 MB 5.77 MB / s
/ home/pi/bark/2016-10-01-13-21-57.wav:5.49 MB 5.72 MB / s
/ home/pi/bark/2016-10-01-13-22-57.wav:5.49 MB 5.79 MB / s
超支!!!(长38.328毫秒)
这些错误显然是由不可用的资源引起的,但正是导致它们令人恼火的神秘。我认为可能是由于SD卡的I / O限制,但是当我尝试使用时/ tmp.
子目录(基于RAM的)存储该音频文件我仍然得到相同的结果;如果您对此问题有任何了解,请告诉我。我发现的解决方案是添加5秒缓冲区(该值在microSeconds中的命令行中指定),其以使用稍微RAM的成本来解决问题。
我们在此分期付款中的最终任务是在RPI启动时设置脚本运行。有多种方法来实现这一目标,但我们将使用其中一个最简单的,编辑用户自动启动文件:
Nano〜/ .config / lxsession / lxde-pi / autostart
除非您进行了更改,否则Raspbian的默认桌面是LXDE,返回的文件的内容将如下所示
@lxpanel - 新闻lexde-pi
@pcmanfm --desktop --profile lxde-pi
@xscreensaver -No-Splash
@ point-rpi
我们需要在文件末尾添加一行:
@bash / home/pi/barkometer.sh.
这将调用Bash的新实例,并使其执行脚本。因为这在用户的上下文中,这意味着用户必须登录所以自动登录是一个好主意。一个重要问题是,在Raspbian完成启动所有子系统之前,无法发生用户登录,以便我们可以确定,除非有问题,否则我们需要的服务如无线连接。
Now there’s lots more we can do to make the script robust such aschecking if the FTP server is accessible and taking action of some kind if it's not, logging the output of the commands we run and transferring the log to our TFP server, tidying up any WAV or log files left over from a restart, and so on but, for now, we’ve achieved our primary goal; recording the ambient audio environment and saving it to a remote server for analysis.
在本系列的下一部分中,我们将开始讨论如何分析录音。