树莓派3 音频配置及其应用场景(录音、VoIP 电话等)(锁定重发)

从网上看到一本关于树莓派的电子书 Raspberry Pi for Secret Agents,利用树莓派打造“特工装备”。
其中有一章讲到音频设备的配置和几个相关的应用场景(比如录音监听、搭建电话系统等),感觉比较有意思。

一、音频系统简单配置

1. ALSA

ALSA (Advanced Linux Sound Architecture) 是一个承载树莓派上音频系统的底层框架,为树莓派及其外接的播放或录制设备提供内核驱动程序。同时该框架也包含用于制作音频应用的程序代码,和一些方便的命令行实用程序。

在 ALSA 的定义里,系统中的每一个音频设备都称作“声卡”。可以使用如下命令列出所有已连接的音频设备:

$ cat /proc/asound/cards
 0 [ALSA           ]: bcm2835_alsa - bcm2835 ALSA
                      bcm2835 ALSA

可以看到此时系统中只有树莓派默认的声卡 0 bcm2835 ALSA

2. 调节音量大小

可以使用 alsamixer 命令打开 AlsaMixer 实用程序,对音量等声音系统参数进行调节:

alsamixer

界面中 View 选项后面的 PlaybackCaptureAll 分别对应播放录制全部
可以按键盘上的 TAB 键切换到对应的界面。按下 fn+F6S 键切换声卡设备(此时只有一个声卡)

使用 ↑ ↓ 方向键调节音量,设置完成后按 ESC 键退出 AlsaMixer。

3. 切换音频输出

树莓派提供两种音频输出接口:3.5mm 模拟音频接口HDMI
可以通过 $sudo raspi-config 命令(选择 Advanced Options - Audio)配置音频输出方向,使音频输出固定使用 3.5mm 接口或 HDMI:

raspi-config

类似的操作也可以直接通过 amixer 命令完成:
$ amixer cset numid=3 1 :指定音频输出接口为 3.5mm 耳机接口
$ amixer cset numid=3 2 :指定音频输出接口为 HDMI

$ amixer cset numid=3 1
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=1
4. 播放测试

可以使用 $ speaker-test -c2 -t wav 命令测试音频播放是否正常。
如一切顺利,则会依次从左耳耳机(或音箱)听到 Front Left,从右耳耳机听到 Front Right 的女声语音,直到按下 Ctrl + C 终止测试。

二、音频录制设备

1. USB声卡

树莓派提供的音频接口是不支持语音输入的。
使用 alsamixer 命令进入 AlsaMixer 程序,按下 TAB 键切换到 Caputre 界面,可以看到此设备无音频采集控制的提示:

bcm2835 ALSA Capture

为了录制音频,需要使用外接的音频输入设备。可以从网上购买一个便携式的 USB 免驱动声卡。

USB声卡及线控耳机

插入USB声卡后,通过 $ cat /proc/asound/cards 命令查看当前系统检测到的音频设备:

$ cat /proc/asound/cards
 0 [ALSA           ]: bcm2835_alsa - bcm2835 ALSA
                      bcm2835 ALSA
 1 [Device         ]: USB-Audio - USB Audio Device
                      GeneralPlus USB Audio Device at usb-3f980000.usb-1.3, full speed

此时输出信息中多了一个序号为 1 的声卡设备 USB-Audio
可以使用 $ speaker-test -D plughw:1 -c2 -t wav 测试 USB 声卡的音频播放是否正常(注意命令中的 -D plughw:1)。

使用 alsamixer -c1 命令调节新声卡的具体参数。其中 -c1 选项用于指定编号为 1 的声卡设备,即新插入的 USB 声卡。

alsamixer -c1

按下 fn+F4TAB 键将视图切换到 Capture 界面,确保 Mic 上方有出现 CAPTURE 字样(说明已开启录制功能,可以使用空格键切换开关状态):

Capture

2. 麦克风测试

首先安装 SoX 工具及其 mp3 格式支持:$sudo apt-get install sox libsox-fmt-mp3
SoX 是 Linux 系统上一个强大的音频处理工具,详细使用方法可以参考这篇文章:SoX — 音频处理工具里的瑞士军刀

sox 命令的基本格式为 sox <input> <output> 。其中的 <input><output> 既可以是某个具体的音频文件,也可以是某个特定的音频设备
所以可以简单的理解为,sox 工具就是对音频进行“传导”

  • 从文件到设备即为播放 sox music.mp3 <device>
  • 从设备到文件即为录制 sox <device> myrec.wav
  • 从文件到文件即为转码 sox input.wav output.mp3

可以使用 $ sox -t alsa plughw:1 -t alsa plughw:1 命令对麦克风进行测试。
其中 -t alsa plughw:1 表示 ALSA 声卡设备 1(即USB声卡)。
上述命令表示既使用USB声卡(麦克风) 作为音频输入,又用它(耳机)作为音频输出。

如一切正常,此时可以通过耳机听到自己对着麦克风讲话的声音。

3. 切换默认的音频设备

可以通过修改配置文件,将树莓派默认用于播放和录制的音频设备(即树莓派内置声卡),改为当前插入的USB声卡。
编辑 ~/.asoundrc 文件,改为如下内容:

pcm.!default {
    type hw
    card 1
}

ctl.!default {
    type hw
    card 1
}

其实就是将配置文件中的 card 0 改为 card 1

此时可直接使用 $ sox -d -d 命令测试USB声卡上连接的麦克风和耳机,无需再通过 -t alsa plughw:1 选项手动指定USB声卡(-d 选项表示默认音频设备,即已配置成默认的USB声卡)。

4. 录制与播放

默认音频设备切换为USB声卡后,可以使用以下命令录制一段音频并将其保存在 myrec.mp3 文件中:
$ sox -d myrec.mp3$ rec myrec.mp3

播放前面录制的音频文件可使用如下命令:
$ sox myrec.mp3 -d$ play myrec.mp3

未能配置USB声卡为默认音频设备或配置不成功,也可以使用如下命令进行录制与播放:
录制:$ sox -t alsa plughw:1 myrec.mp3
播放:$ sox myrec.mp3 -t alsa plughw:1

录制固定长度的音频片段(如 30 分钟)并保存在指定文件中:
$ sox -t alsa plughw:1 myrec.wav trim 0 00:30:00

持续录制很长时间的音频,保存在几个不同的文件中,每隔一小时保存一次:
$ sox -t alsa plughw:1 myrec.wav trim 0 01:00:00 : newfile : restart

三、远程监听

可以通过树莓派的 SSH 服务,在另一台电脑上远程收听树莓派通过USB声卡收集到的音频数据。
也就是说,用树莓派的麦克风录制周围环境的声音,同时在远程的另一台电脑上实时地(有短暂延迟)收听录制的内容,达到监听的效果。

在电脑端(也需要安装 sox 程序)执行如下命令即可:
$ ssh pi@[IP address] sox -t alsa plughw:1 -t sox - | sox -q -t sox - -d

sox

对于 Windows 系统,除安装 SoX 工具外,还需要先下载完整版 PuTTY 工具,并确保这两个工具的安装路径都已添加至 PATH 环境变量。

则可以使用如下命令通过树莓派进行远程监听:
plink pi@[IP address] -pw [password] sox -t alsa plughw:1 -t sox - | sox -q -t sox - -t waveaudio default

可以使用如下命令,将远程树莓派收集到的音频数据直接保存在本地文件中:
$ ssh pi@[IP address] sox -t alsa plughw:1 -t mp3 - > ~/Desktop/myrec.mp3
plink pi@[IP address] sox -t alsa plughw:1 -t mp3 - > D:\myrec.mp3 (Windows 系统)

使用如下命令,让本地电脑作为音频输入源,将其麦克风收集到的音频数据,通过 SSH 发送到远程树莓派上进行播放。
也就是将自己对着本地电脑讲的话通过树莓派进行远程广播
$ sox -d -t sox - | ssh pi@[IP address] sox -q -t sox - -d
sox -t waveaudio default -t sox - | plink pi@[IP address] -pw [password] sox -q -t sox - -d (Windows 系统)

同样的原理,也可以将本地磁盘上的音频文件直接发送到远程的树莓派上进行播放:
$ cat ~/Desktop/media/audios/Faded.wav | ssh pi@[IP address] sox -t wav - -d
type D:\myrec.mp3 | plink pi@[IP address] -pw [password] sox -t mp3 - -d (Windows 系统)

四、蓝牙耳机

树莓派 3 代 B+ 自带了 WIFI 和蓝牙功能,可以直接通过蓝牙连接音频设备。

1. 使用 hciconfig 命令获取蓝牙模块的相关信息:
$ hciconfig -a
hci0:   Type: Primary  Bus: UART
    BD Address: B8:27:EB:C3:38:31  ACL MTU: 1021:8  SCO MTU: 64:1
    UP RUNNING
    RX bytes:4181 acl:136 sco:0 events:135 errors:0
    TX bytes:5065 acl:128 sco:0 commands:60 errors:0
    Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
    Link policy: RSWITCH SNIFF
    Link mode: SLAVE ACCEPT
    Name: 'raspberrypi'
    Class: 0x480000
    Service Classes: Capturing, Telephony
    Device Class: Miscellaneous,
    HCI Version: 4.2 (0x8)  Revision: 0xfc
    LMP Version: 4.2 (0x8)  Subversion: 0x6119
    Manufacturer: Broadcom Corporation (15)
2. 使用 hcitool scan 命令扫描附近可供连接的蓝牙设备,并记下蓝牙耳机对应的 MAC 地址
$ hcitool scan
Scanning ...
    FC:58:FA:F4:67:33   A2
    50:8F:4C:0D:31:3A   Starky
3. 通过 MAC 地址与蓝牙耳机进行配对

使用 bluetoothctl 命令进入蓝牙控制台,依次通过 power onagent onscan onpairtrustconnect 等命令连接蓝牙设备。

注意此处连接蓝牙使用的是蓝牙设备的 MAC 地址

$ bluetoothctl
[NEW] Controller B8:27:EB:C3:38:31 raspberrypi [default]
[NEW] Device 50:8F:4C:0D:31:3A Starky
...
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# scan on
Discovery started
[bluetooth]# pair FC:58:FA:F4:67:33
Attempting to pair with FC:58:FA:F4:67:33
Pairing successful
[bluetooth]# trust FC:58:FA:F4:67:33
[CHG] Device FC:58:FA:F4:67:33 Trusted: yes
Changing FC:58:FA:F4:67:33 trust succeeded
[bluetooth]# connect FC:58:FA:F4:67:33
Attempting to connect to FC:58:FA:F4:67:33
[CHG] Device FC:58:FA:F4:67:33 Connected: yes
Connection successful
[A2]#

退出蓝牙控制台,使用 hcitool con 命令查看当前已连接的蓝牙设备,确认连接成功:

$ hcitool con
Connections:
    > ACL FC:58:FA:F4:67:33 handle 11 state 1 lm SLAVE AUTH ENCRYPT
4. 将音频输出设备切换为蓝牙耳机

首先安装 PulseAudio 软件包:
$ sudo apt-get install pulseaudio pulseaudio-module-bluetooth

启动 PulseAudio 守护进程:
$ pulseaudio --start

列出 PulseAudio 检测到的音频设备名称:

$ pacmd list-sinks short | grep -e 'name:'

    name: <alsa_output.platform-soc_audio.analog-mono>
    name: <bluez_sink.FC_58_FA_F4_67_33.headset_head_unit>

使用 pactl 命令将蓝牙耳机作为默认的音频设备:
$ pactl set-default-sink bluez_sink.FC_58_FA_F4_67_33.headset_head_unit

此时,即可直接使用 play 命令通过蓝牙耳机播放音频文件:

image.png

如果需要将音频输出切换回系统默认,运行如下命令即可:
$ pactl set-default-sink alsa_output.platform-soc_audio.analog-mono

或者自己对当前的音频配置有点混乱了。。。可以使用如下命令重置:
$ sudo /etc/init.d/alsa-utils reset

5. 注意事项

经过测试,发现蓝牙耳机连接后音质相差太大,播放速度明显放缓,未确定是哪里的问题。

同时我的蓝牙耳机开启后会自动连接至树莓派,如无法自动连接或者连接以后并没有被 PulseAudio 检测到,可以先使用 bluetoothctl 命令进入蓝牙控制台:
依次输入 power offpower on 命令重启蓝牙,使用 connect <MAC address> 命令重新连接蓝牙耳机(无需再配对和信任,直接连接)。

蓝牙耳机为默认音频设备后,之前配置 USB 声卡为默认的操作不再生效(除非断开蓝牙或关闭蓝牙耳机)。
可以在播放或录制时通过 -t alsa plughw:1 选项手动指定 USB 声卡。
$ sox -t alsa plughw:1 -d :使用 USB 声卡作为音频输入源,再将采集到的音频输出到默认设备(蓝牙耳机)

这一章的蓝牙介绍只供参考,推荐使用 USB 声卡进行音频的录制和播放。

五、配置 VoIP 服务器

VoIP 即 Voice over Internet Protocol ,就是将声音信号经过压缩与封包之后,以数据封包的形式在IP网络间进行传输。通俗地说也就是互联网电话或IP电话。

这里使用 Linux 平台上的 SIP Witch 软件作为 VoIP 系统的服务端。

1. 安装 SIP Witch

$ sudo apt-get install sipwitch

2. 编辑配置文件

/etc/default/sipwtich :找到 PLUGINS 选项,删除该行前面的注释

/etc/sipwitch.conf :编辑文件内容,在 <provision> 标签下添加用户注册信息:

<user id="phone1">
  <extension>201</extension>
  <secret>SecretSauce201</secret>
  <display>Agent 201</display>
</user>
<user id="phone2">
  <extension>202</extension>
  <secret>SecretSauce202</secret>
  <display>Agent 202</display>
</user>

其中的 id 表示注册用户登录时需要输入的用户名,<secret> 表示登录时使用的密码。

找到 <stack> 标签,并在其后添加如下一行配置,用于指定 VoIP 服务器的IP地址:
<localnames>[Your Pi's IP address]</localnames>

编辑完成后,重启 sipwitch 服务:
$ sudo systemctl restart sipwitch

3. 客户端配置

Windows 系统“软电话”可使用 MicroSIP 软件,Android 客户端可使用 CSipSimple,Mac 客户端有 Telephone

使用 /etc/sipwitch.conf 文件中定义的用户ID、密码以及服务器地址完成用户注册,各客户端之间即可直接拨打语音电话。

MicroSIP

参考资料

Raspberry Pi for Secret Agents - Third Edition

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 更新续篇>>会聊天的树莓派视频遥控小车 + iOS / Android / web应用 本文介绍了一种树莓派遥控小...
    三少ZZzzz阅读 12,738评论 10 42
  • SoX(即 Sound eXchange)是一个跨平台(Windows,Linux,MacOS 等)的命令行实用程...
    rollingstarky阅读 36,038评论 0 22
  • 树莓派(Raspberry Pi,RasPi/RPi)是由英国的慈善组织“Raspberry Pi 基金会”开发,...
    vctea阅读 4,199评论 0 19
  • 一.声音参数基本概念: 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语。 样本长度(sa...
    cs1001阅读 2,722评论 0 2
  • 同一件事情,听到的和说的不一样。 同一件事情,所听和所说的总不在一频道上。 听 一件事情的发生,总有原因,源头。 ...
    华华雯雯阅读 207评论 0 0