1529 字
8 分钟
树莓派上的麦阵列定位
最近又弄了个麦阵列玩定位……
1 安装ReSpeaker驱动
参考:ReSpeaker 6-Mic Circular Array kit for Raspberry Pi
手册上说换个源会快,那就换吧:
sudo vim /etc/apt/sources.list手册上让用清华的镜像站:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contribdeb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib安装麦阵列驱动:
mkdir seeedproxychains4 git clone https://github.com/respeaker/seeed-voicecard.gitcd seeed-voicecardsudo proxychains4 ./install.shsudo reboot -h now需要注意的是,在安装前不要运行sudo rpi-update升级固件,否则会因为固件版本问题导致无法安装。
2 录音及播放测试
查看声卡输入设备arecord -L,返回:
null Discard all samples (playback) or generate zero samples (capture)defaultac108dmixerac101sysdefault:CARD=seeed8micvoicec seeed-8mic-voicecard, Default Audio Devicedmix:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Direct sample mixing devicedsnoop:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Direct sample snooping devicehw:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Direct hardware device without any conversionsplughw:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Hardware device with all software conversions检查声卡输出设备aplay -L,返回:
null Discard all samples (playback) or generate zero samples (capture)defaultac108dmixerac101sysdefault:CARD=ALSA bcm2835 ALSA, bcm2835 ALSA Default Audio Devicedmix:CARD=ALSA,DEV=0 bcm2835 ALSA, bcm2835 ALSA Direct sample mixing devicedmix:CARD=ALSA,DEV=1 bcm2835 ALSA, bcm2835 IEC958/HDMI Direct sample mixing devicedsnoop:CARD=ALSA,DEV=0 bcm2835 ALSA, bcm2835 ALSA Direct sample snooping devicedsnoop:CARD=ALSA,DEV=1 bcm2835 ALSA, bcm2835 IEC958/HDMI Direct sample snooping devicehw:CARD=ALSA,DEV=0 bcm2835 ALSA, bcm2835 ALSA Direct hardware device without any conversionshw:CARD=ALSA,DEV=1 bcm2835 ALSA, bcm2835 IEC958/HDMI Direct hardware device without any conversionsplughw:CARD=ALSA,DEV=0 bcm2835 ALSA, bcm2835 ALSA Hardware device with all software conversionsplughw:CARD=ALSA,DEV=1 bcm2835 ALSA, bcm2835 IEC958/HDMI Hardware device with all software conversionssysdefault:CARD=seeed8micvoicec seeed-8mic-voicecard, Default Audio Devicedmix:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Direct sample mixing devicedsnoop:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Direct sample snooping devicehw:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Direct hardware device without any conversionsplughw:CARD=seeed8micvoicec,DEV=0 seeed-8mic-voicecard, Hardware device with all software conversions按照手册录制、播放音频文件,一切OK,还能边录边播~
#It will capture sound on AC108 and save as a.wavarecord -Dac108 -f S32_LE -r 16000 -c 8 a.wav#Take care of that the captured mic audio is on the first 6 channels
#It will play sound file a.wav on AC101aplay -D ac101 a.wav#Do not use -D plughw:1,0 directly except your wave file is single channel only.
#Doing capture && playback the same timearecord -D hw:1,0 -f S32_LE -r 16000 -c 8 to_be_record.wav &#mono_to_play.wav is a mono channel wave file to playaplay -D plughw:1,0 -r 16000 to_be_record.wav按照手册安装audacity,图形界面音频编辑软件,可以说是非常舒适了~
sudo apt-get install -y audacity3 DOA定位测试
参考:ReSpeaker 6 Mic Array for Raspberry Pi
下载ODAS源码并编译:
sudo proxychains4 apt install -y libfftw3-dev libconfig-dev libasound2-dev cmakeproxychains4 git clone https://github.com/introlab/odas.gitmkdir odas/buildcd odas/buildcmake ..make安装完成后,编写麦阵列配置文件respeaker-6mic-odas.cfg:
# Configuration file for ReSpeaker 6 Mic Array# Circular shape, R = 0.0463m
version = "2.1";
# Rawraw:{ fS = 16000; hopSize = 128; nBits = 32; nChannels = 8;
# Input with raw signal from microphones interface: { type = "soundcard"; card = 1; device = 0; }}
# Mappingmapping:{ map: (1, 2, 3, 4, 5, 6);}
# Generalgeneral:{ epsilon = 1E-20; size: { hopSize = 128; frameSize = 256; }; samplerate: { mu = 16000; sigma2 = 0.01; }; speedofsound: { mu = 343.0; sigma2 = 25.0; }; mics = ( # Microphone 1 { mu = ( -0.0232, +0.0401, +0.0000 ); sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 ); direction = ( +0.000, +0.000, +1.000 ); angle = ( 80.0, 90.0 ); }, # Microphone 6 { mu = ( +0.0232, +0.0401, +0.0000 ); sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 ); direction = ( +0.000, +0.000, +1.000 ); angle = ( 80.0, 90.0 ); }, # Microphone 5 { mu = ( +0.0463, +0.0000, +0.0000 ); sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 ); direction = ( +0.000, +0.000, +1.000 ); angle = ( 80.0, 90.0 ); }, # Microphone 4 { mu = ( +0.0232, -0.0401, +0.0000 ); sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 ); direction = ( +0.000, +0.000, +1.000 ); angle = ( 80.0, 90.0 ); }, # Microphone 3 { mu = ( -0.0232, -0.0401, +0.0000 ); sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 ); direction = ( +0.000, +0.000, +1.000 ); angle = ( 80.0, 90.0 ); }, # Microphone 2 { mu = ( -0.0463, +0.0000, +0.0000 ); sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 ); direction = ( +0.000, +0.000, +1.000 ); angle = ( 80.0, 90.0 ); } );
# Spatial filters to include only a range of direction if required # (may be useful to remove false detections from the floor, or # limit the space search to a restricted region) spatialfilters = ( { direction = ( +0.000, +0.000, +1.000 ); angle = (80.0, 90.0); } ); nThetas = 181; gainMin = 0.25;}
# Stationnary noise estimationsne:{ b = 3; alphaS = 0.1; L = 150; delta = 3.0; alphaD = 0.1;}
# Sound Source Localizationssl:{ nPots = 4; nMatches = 10; probMin = 0.5; nRefinedLevels = 1; interpRate = 4;
# Number of scans: level is the resolution of the sphere # and delta is the size of the maximum sliding window # (delta = -1 means the size is automatically computed) scans = ( { level = 2; delta = -1; }, { level = 4; delta = -1; } );
# Output to export potential sources potential: { format = "json"; interface: { type = "socket"; ip = "192.168.1.100"; port = 9001; }; #format = "undefined"; #interface: { # type = "blackhole"; #} };}
# Sound Source Trackingsst:{ # Mode is either "kalman" or "particle" mode = "kalman";
# Add is either "static" or "dynamic" add = "dynamic";
# Parameters used by both the Kalman and particle filter active = ( { weight = 1.0; mu = 0.3; sigma2 = 0.0025 } );
inactive = ( { weight = 1.0; mu = 0.15; sigma2 = 0.0025 } );
sigmaR2_prob = 0.0025; sigmaR2_active = 0.0225; sigmaR2_target = 0.0025; Pfalse = 0.1; Pnew = 0.1; Ptrack = 0.8;
theta_new = 0.9; N_prob = 5; theta_prob = 0.8; N_inactive = ( 150, 200, 250, 250 ); theta_inactive = 0.9;
# Parameters used by the Kalman filter only kalman: { sigmaQ = 0.001; };
# Parameters used by the particle filter only particle: { nParticles = 1000; st_alpha = 2.0; st_beta = 0.04; st_ratio = 0.5; ve_alpha = 0.05; ve_beta = 0.2; ve_ratio = 0.3; ac_alpha = 0.5; ac_beta = 0.2; ac_ratio = 0.2; Nmin = 0.7; };
target: ();
# Output to export tracked sources tracked: { format = "json"; interface: { type = "socket"; ip = "192.168.1.100"; port = 9000; }; #format = "undefined"; #interface: { # type = "blackhole"; #} };}
sss:{ # Mode is either "dds", "dgss" or "dmvdr" mode_sep = "dds"; mode_pf = "ms";
gain_sep = 1.0; gain_pf = 10.0;
dds: {
};
dgss: { mu = 0.01; lambda = 0.5; };
dmvdr: {
};
ms: { alphaPmin = 0.07; eta = 0.5; alphaZ = 0.8; thetaWin = 0.3; alphaWin = 0.3; maxAbsenceProb = 0.9; Gmin = 0.01; winSizeLocal = 3; winSizeGlobal = 23; winSizeFrame = 256; };
ss: { Gmin = 0.01; Gmid = 0.9; Gslope = 10.0; };
separated: { fS = 44100; hopSize = 512; nBits = 16;
interface: { type = "file"; path = "separated.raw"; }; };
postfiltered: { fS = 44100; hopSize = 512; nBits = 16;
interface: { type = "file"; path = "postfiltered.raw"; }; };}
classify:{ frameSize = 1024; winSize = 3; tauMin = 32; tauMax = 200; deltaTauMax = 7; alpha = 0.3; gamma = 0.05; phiMin = 0.15; r0 = 0.2;
category: { format = "undefined";
interface: { type = "blackhole"; } }}波达方向定位服务odaslives位于odas/bin/目录下,使用配置文件启动定位服务:
ln -s ~/odas/3rd-lib/odas/bin/odaslive ~/.local/bin/odasliveodaslive -c ~/respeaker-6mic-odas.cfg在电脑上下载ODAS Studio源码并编译:
sudo npm install npm@latest -gwget https://github.com/introlab/odas_web/archive/v0.2-alpha.zipunzip -a v0.2-alpha.zipgit clone https://github.com/introlab/odas_web.gitcd odas_web-0.2-alphanpm install在电脑上安装npm,并从源码编译odas web v0.2-alpha:
sudo npm install npm@latest -gcd odas_webnpm install或者使用已编译好的程序:
proxychains4 wget https://github.com/introlab/odas_web/releases/download/v0.1-alpha/MacOS_x64.tar.gz