Skip to main content

ReSpeaker 6-Mic Circular Array Kit for Raspberry Pi

输入图片描述

Seeed 的 ReSpeaker 6-Mic Circular Array Kit 是一个扩展板,也称为 HAT,专为 Raspberry Pi 设计。它是一个圆形麦克风阵列套件,配备六个麦克风,专为 AI 和语音应用设计。这意味着您可以使用 Raspberry Pi 构建更强大、更灵活的语音产品,并集成 Amazon Alexa 语音服务、Google Assistant 等。

ReSpeaker 6-Mic Circular Array Kit for Raspberry Pi 由两个板组成,一个是语音配件 HAT,另一个是六麦克风圆形阵列。

ReSpeaker 6-Mic Circular Array Kit for Raspberry Pi 在 Raspbian 系统中支持 8 个输入和 8 个输出通道。前 6 个输入通道用于麦克风录音,其余 2 个输入通道是回放的回声通道。前 2 个输出通道用于播放,其余 6 个输出通道为虚拟通道。

特性

  • 2 个 ADC 芯片和 1 个 DAC 芯片
  • 8 个输入和 8 个输出通道
  • 六麦克风阵列
  • 支持 Grove
  • 兼容 Raspberry Pi(支持 Raspberry Pi Zero 和 Zero W、Raspberry Pi B+、Raspberry Pi 2 B、Raspberry Pi 3 B、Raspberry Pi 3 B+、Raspberry Pi 3 A+ 和 Raspberry Pi 4)
  • 耳机和扬声器语音输出

规格

  • 2 x X-Power AC108 ADC
  • 6 x 高性能麦克风
  • 1 x X-Power AC101 DAC
  • 语音输出:
    • 3.5mm 耳机音频插孔
    • 扬声器插孔
  • 兼容 Raspberry Pi 40 针引脚
  • 麦克风:MSM321A3729H9CP
  • 灵敏度:-22 dBFS(全向)
  • 信噪比:59 dB
  • 最大采样率:48Khz

应用场景

  • 智能音箱
  • 智能语音助手系统
  • 语音录音设备
  • 语音会议系统
  • 会议通信设备
  • 语音交互机器人
  • 汽车语音助手
  • 其他需要语音指令的场景

硬件概览

系统图

接口

note

连接后,请务必使用万用表确定电路的导通情况是否与上图所示一致。

装配图

入门指南

硬件

准备工作

ReSpeaker 6-Mic Circular Array x1

Raspberry Pi 3B 或 3B+ x1

Micro-USB 数据线 x1

PC x1

耳机或扬声器 x1

:::提示 实际上,ReSpeaker 6-Mic Circular Array 支持 Raspberry Pi Zero、Raspberry Pi 1 B+、Raspberry Pi 2 B、Raspberry Pi 3 B、Raspberry Pi 3 Model B+、Raspberry Pi 3 A+ 和 Raspberry Pi 4。在本教程中,我们使用的是 Raspberry Pi 3。 :::

连接步骤

步骤 1. 使用排线将 ReSpeaker Voice Accessory HATReSpeaker 6-Mic Circular Array 连接。

步骤 2.ReSpeaker Voice Accessory HAT 插入 Raspberry Pi 的 40 Pin GPIO 接口。

步骤 3.耳机 插入 3.5mm 耳机音频接口 或将 扬声器 插入 JST 2.0 扬声器接口

步骤 4. 使用 Micro-USB 数据线将 Raspberry PiPC 连接。

图片

软件

准备工作

方案 A

PUTTY

您需要使用 Putty 或其他 ssh 工具连接到您的 Raspberry Pi。在开始之前,请确保:

  1. 打开 Raspberry Pi 的 ssh 功能以允许 Putty 连接。如果您不知道如何打开 ssh,请搜索 如何设置 Raspberry Pi 的 ssh

  2. 确保您的 Raspberry Pi 和 PC 在同一个 WiFi 网络中。如果您不知道如何配置 WiFi,请搜索 如何设置 Raspberry Pi 的 WiFi

  3. 获取 Raspberry Pi 的 IP 地址。如果您不知道如何获取 IP 地址,请参考 Raspberry Pi 官方文档

  4. 使用 IP 地址通过 Putty 的 ssh 服务连接 Raspberry Pi 和您的 PC。

图片

然后输入主机名和密码。默认 ID 是 pi,密码是 raspberry

login as: pi
[email protected]'s password:raspberry

现在您已登录,可以在 Putty 中输入命令并操作您的 Raspberry Pi。

VNC Viewer

为了让此套件与 Alexa 或 DuerOS 一起工作,您需要打开一个网站以获取授权。因此,您需要使用 VNC Viewer 登录您的 Amazon 或百度账户。因此,请确保您已打开 Raspberry Pi 的 VNC 服务。

或者,您可以考虑方案 B。

方案 B

如果您觉得上述步骤太麻烦,您可以直接使用 HDMI 显示器,并将 USB 键盘和 USB 鼠标插入 Raspberry Pi,这种方法简单易行。

步骤 1. 安装 seeed-voicecard

获取 seeed voice card 源代码,并安装所有 Linux 内核驱动。

sudo apt-get update
sudo apt-get upgrade
git clone https://github.com/respeaker/seeed-voicecard.git
cd seeed-voicecard
sudo ./install.sh
sudo reboot

步骤 2. 检查声卡

输入以下命令检查录音设备。

pi@raspberrypi:~ $ arecord -L

输出应类似于:

pi@raspberrypi:~ $ arecord -L
null
Discard all samples (playback) or generate zero samples (capture)
default
ac108
dmixer
ac101
sysdefault:CARD=seeed8micvoicec
seeed-8mic-voicecard,
Default Audio Device
dmix:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Direct sample mixing device
dsnoop:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Direct sample snooping device
hw:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Direct hardware device without any conversions
plughw:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Hardware device with all software conversions

使用以下命令检查播放设备。

pi@raspberrypi:~ $ aplay -L

输出应类似于:

pi@raspberrypi:~ $ aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
default
ac108
dmixer
ac101
sysdefault:CARD=ALSA
bcm2835 ALSA, bcm2835 ALSA
Default Audio Device
dmix:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Direct sample mixing device
dmix:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Direct sample mixing device
dsnoop:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Direct sample snooping device
dsnoop:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Direct sample snooping device
hw:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Direct hardware device without any conversions
hw:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Direct hardware device without any conversions
plughw:CARD=ALSA,DEV=0
bcm2835 ALSA, bcm2835 ALSA
Hardware device with all software conversions
plughw:CARD=ALSA,DEV=1
bcm2835 ALSA, bcm2835 IEC958/HDMI
Hardware device with all software conversions
sysdefault:CARD=seeed8micvoicec
seeed-8mic-voicecard,
Default Audio Device
dmix:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Direct sample mixing device
dsnoop:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Direct sample snooping device
hw:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Direct hardware device without any conversions
plughw:CARD=seeed8micvoicec,DEV=0
seeed-8mic-voicecard,
Hardware device with all software conversions

步骤 3. 录音和播放

您可以先录音后播放,也可以同时录音和播放。

# 使用 AC108 录制声音并保存为 a.wav
arecord -Dac108 -f S32_LE -r 16000 -c 8 a.wav
# 注意录制的麦克风音频在前 6 个通道

# 使用 AC101 播放声音文件 a.wav
aplay -D ac101 a.wav
# 除非您的音频文件是单声道,否则不要直接使用 -D plughw:1,0。

# 同时进行录音和播放
arecord -D hw:1,0 -f S32_LE -r 16000 -c 8 to_be_record.wav &
# mono_to_play.wav 是一个单声道音频文件,用于播放
aplay -D plughw:1,0 -r 16000 mono_to_play.wav

note

开发者在使用 6-Mic Circular Array Kit(或 4-Mics Linear Array Kit)同时进行捕获和播放时的限制:

-1. 必须先启动捕获,否则捕获通道可能会出现混乱。

-2. 播放输出通道必须填充 8 个相同的通道数据或 4 个相同的立体声通道数据,否则扬声器或耳机可能不会输出任何声音。

-3. 如果您希望同时播放和录音,播放的音乐文件必须是单声道,否则无法使用该命令进行播放。

您也可以使用 Audacity 进行播放和录音。

tip

您应该通过 VNC 打开 Audacity,或者直接使用显示器打开它。

sudo apt update
sudo apt install audacity
audacity // 运行 Audacity

使用 LED 播放

6-Mic Circular Array 上有 12 个 GRB LED,您可以自行配置这些 LED,现在让我们看看如何点亮它们。

git clone --depth 1 https://github.com/respeaker/pixel_ring.git
cd pixel_ring
pip install -U -e .
python examples/respeaker_4mic_array.py

您将看到 LED 点亮并运行。您可以参考 python examples/respeaker_4mic_array.py 文件来制作自己的效果。

实时声音源定位和跟踪

ODAS 是 Open embeddeD Audition System 的缩写。这是一个专门用于声音源定位、跟踪、分离和后过滤的库。让我们来体验一下它的功能。

  • 第一步:获取 ODAS 并构建它。
sudo apt-get install libfftw3-dev libconfig-dev libasound2-dev libgconf-2-4
sudo apt-get install cmake
git clone https://github.com/introlab/odas.git
mkdir odas/build
cd odas/build
cmake ..
make
  • 第二步:获取 ODAS Studio 并打开它。

  • 第三步:odascore 位于 odas/bin/odaslive配置文件位于 这里

提取语音

我们使用 PyAudio Python 库 来提取语音。

  • 第一步:运行以下脚本以获取 6 Mic Pi Hat 的设备索引号:
sudo pip install pyaudio
cd ~
nano get_index.py
  • 第二步:复制以下代码并粘贴到 get_index.py 中。
import pyaudio

p = pyaudio.PyAudio()
info = p.get_host_api_info_by_index(0)
numdevices = info.get('deviceCount')

for i in range(0, numdevices):
if (p.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels')) > 0:
print "Input Device id ", i, " - ", p.get_device_info_by_host_api_device_index(0, i).get('name')
  • 第三步:按 Ctrl + X 退出并按 Y 保存。

  • 第四步:运行 sudo python get_index.py,您将看到如下设备 ID:

Input Device id  2  -  seeed-8mic-voicecard: - (hw:1,0)
  • 第五步:将 RESPEAKER_INDEX = 2 更改为设备索引号。运行 Python 脚本 record.py 以录制语音。
import pyaudio
import wave

RESPEAKER_RATE = 16000
RESPEAKER_CHANNELS = 8
RESPEAKER_WIDTH = 2
# 运行 getDeviceInfo.py 获取索引
RESPEAKER_INDEX = 2 # 参考输入设备 ID
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(
rate=RESPEAKER_RATE,
format=p.get_format_from_width(RESPEAKER_WIDTH),
channels=RESPEAKER_CHANNELS,
input=True,
input_device_index=RESPEAKER_INDEX,)

print("* recording")

frames = []

for i in range(0, int(RESPEAKER_RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(RESPEAKER_CHANNELS)
wf.setsampwidth(p.get_sample_size(p.get_format_from_width(RESPEAKER_WIDTH)))
wf.setframerate(RESPEAKER_RATE)
wf.writeframes(b''.join(frames))
wf.close()
  • 第六步:如果您希望从 8 个通道中提取通道 0 的数据,请参考以下代码。对于其他通道 X,请将 [0::8] 更改为 [X::8]
import pyaudio
import wave
import numpy as np

RESPEAKER_RATE = 16000
RESPEAKER_CHANNELS = 8
RESPEAKER_WIDTH = 2
# 运行 getDeviceInfo.py 获取索引
RESPEAKER_INDEX = 2 # 参考输入设备 ID
CHUNK = 1024
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(
rate=RESPEAKER_RATE,
format=p.get_format_from_width(RESPEAKER_WIDTH),
channels=RESPEAKER_CHANNELS,
input=True,
input_device_index=RESPEAKER_INDEX,)

print("* recording")

frames = []

for i in range(0, int(RESPEAKER_RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
# 从 8 个通道中提取通道 0 的数据,如果您希望提取通道 1,请更改为 [1::8]
a = np.fromstring(data,dtype=np.int16)[0::8]
frames.append(a.tostring())

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(1)
wf.setsampwidth(p.get_sample_size(p.get_format_from_width(RESPEAKER_WIDTH)))
wf.setframerate(RESPEAKER_RATE)
wf.writeframes(b''.join(frames))
wf.close()

DOA

带关键词的 DOA

需求

  • pyaudio
  • numpy
  • snowboy

安装

安装 pyaudio、numpy 和 snowboy,建议使用 virtualenv 创建虚拟 Python 环境。

sudo apt install python-pyaudio python-numpy python-virtualenv
sudo apt-get install swig python-dev libatlas-base-dev build-essential make
git clone --depth 1 https://github.com/Kitt-AI/snowboy.git
cd snowboy
virtualenv --system-site-packages env
source env/bin/activate
python setup.py build
python setup.py bdist_wheel
pip install dist/snowboy*.whl
git clone https://github.com/voice-engine/voice-engine.git
cd voice-engine
python setup.py bdist_wheel
pip install dist/*.whl

让我们说“snowboy”

  • 第一步:运行 kws_doa.py
cd ~/voice-engine/examples/respeaker_6mic_array_for_pi/
python kws_doa.py

以下是 kws_doa.py 的代码:

"""
搜索关键词 "snowboy"。
找到关键词后,估算到达方向 (DOA)。

硬件:ReSpeaker 6 Mic Array for Raspberry Pi
"""

import sys
import time
from voice_engine.source import Source
from voice_engine.channel_picker import ChannelPicker
from voice_engine.kws import KWS
from voice_engine.doa_respeaker_6mic_array import DOA


def main():
src = Source(rate=16000, channels=8)
ch0 = ChannelPicker(channels=src.channels, pick=0)
kws = KWS(model='snowboy', sensitivity=0.6, verbose=True)
doa = DOA(rate=16000)

src.link(ch0)
ch0.link(kws)
src.link(doa)

def on_detected(keyword):
print('检测到 {},方向为 {}'.format(keyword, doa.get_direction()))

kws.set_callback(on_detected)

src.recursive_start()
while True:
try:
time.sleep(1)
except KeyboardInterrupt:
break

src.recursive_stop()

# 等待一秒以允许其他线程退出
time.sleep(1)


if __name__ == '__main__':
main()
  • 第二步:说“snowboy”,以下是 DOA 的输出结果。
(env) pi@raspberrypi:~/voice-engine/examples/respeaker_6mic_array_for_pi $ python kws_doa.py 
['arecord', '-t', 'raw', '-f', 'S16_LE', '-c', '8', '-r', '16000', '-D', 'default', '-q']
0000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222222222222222222222/usr/local/lib/python2.7/dist-packages/voice_engine-0.1.3-py2.7.egg/voice_engine/gcc_phat.py:22: RuntimeWarning: invalid value encountered in divide
cc = np.fft.irfft(R / np.abs(R), n=(interp * n))
检测到 1,方向为 283.32811392
3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222222222222222222222检测到 1,方向为 210.0
30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222222222222222222222检测到 1,方向为 62.5448292531
30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222222222222222222222222检测到 1,方向为 62.5448292531
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222222222222222222检测到 1,方向为 223.32811392
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022222222222222222222222222222222222222222222222222检测到 1,方向为 223.32811392
30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000222222222222222222222222222222222222222检测到 1,方向为 283.32811392
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222222222222222222222检测到 1,方向为 237.455170747

按钮

如果您想检查您的 ReSpeaker 6-Mic 是否正确安装在树莓派上,使用按钮是一个不错的选择。我们可以使用以下代码进行检查。


import RPi.GPIO as GPIO
import time

BUTTON = 26

GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON, GPIO.IN)

while True:
state = GPIO.input(BUTTON)
if state:
print("off")
else:
print("on")
time.sleep(1)

常见问题解答

问题1:麦克风阵列中只有6个麦克风,为什么会有8个通道?

回答1:该阵列中有2个 AC108 芯片,每个 AC108 芯片有4个通道输出。因此总共会有8个通道,其中6个用于麦克风,另外2个是回放通道。

问题2:树莓派可以检测到 ReSpeaker 2-Mics HAT,但无法检测到 ReSpeaker 6-Mics Circular Array?

回答2:请点击树莓派 -> Preferences -> Raspberry Pi Configuration,然后选择 Interfaces 标签页,确保 1-Wire 已禁用。

资源

技术支持与产品讨论

感谢您选择我们的产品!我们致力于为您提供各种支持,确保您使用我们的产品时体验顺畅。我们提供多个沟通渠道,以满足不同的偏好和需求。

Loading Comments...