LoginSignup
4
4

More than 3 years have passed since last update.

ReSpeakerで発話者の音声方向測位

Last updated at Posted at 2020-08-12

音源定位とは

音源定位とは、音がどこから聞こえているか、というもので、立体音響やバイノーラルなどを想像して下さい。立体音響は音源定位を行うことで、楽器が後ろから聞こえるように感じたりします。

今回はReSpeaker Mic Array v2.0を使用します。

image.png

使い方や、その他オプションも基本全てここに書かれていますが、簡単にまとめておきます。

音源定位の実装

環境

ubuntu 18.04
python3


環境構築


sudo apt-get update
sudo pip install pyusb click
git clone https://github.com/respeaker/usb_4_mic_array.git
cd usb_4_mic_array
sudo python dfu.py --download 6_channels_firmware.bin

usb_4_mic_arrayフォルダが作成されたと思います。
この下に以下のコードを作成し実行します。

DOA.py
from tuning import Tuning
import usb.core
import usb.util
import time

dev = usb.core.find(idVendor=0x2886, idProduct=0x0018)

if dev:
    Mic_tuning = Tuning(dev)
    print(Mic_tuning.direction)
    while True:
        try:
            print(Mic_tuning.direction)
            time.sleep(1)
        except KeyboardInterrupt:
            break

出力結果↓

~/usb_4_mic_array$ python3 DOA.py 
122
121
120
122

エラーが出る場合

このコードを実行したとき、
ImportError: No module named usb.core
とでたら


sudo apt-get install python-usb python3-usb

を実行します。

また、permission deniedとでたら、udevでデバイスのアクセス権を与えてあげます。

sudo touch /etc/udev/rules.d/10-any_name_is_ok.rules
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2886", ATTR{idProduct}=="0018", MODE="0666", GROUP="plugdev"' | sudo tee 10-any_name_is_ok.rules
sudo gpasswd -a ユーザー名 plugdev
sudo chmod a+r /etc/udev/rules.d/10-any_name_is_ok.rules
sudo udevadm control --reload-rules
udevadm trigger

この後、再起動すると反映されます。


人の声のみに反応させる

ReSpeakerにはたくさんのオプションが存在します。
オプションのパラメータ一覧(よくある質問のQ1)

例として、SPEECHDETECTEDを使い、人の声のみの音源定位を実装します。
0 = false (no speech detected)
1 = true (speech detected)
なので、以下のようにDOA.pyを改変します。

voise_angle.py
from tuning import Tuning
import usb.core
import usb.util
import time

dev = usb.core.find(idVendor=0x2886, idProduct=0x0018)

if dev:
    Mic_tuning = Tuning(dev)
    while True:
        try:
            if Mic_tuning.read('SPEECHDETECTED') == 1:
                 print(Mic_tuning.direction)
                 time.sleep(1)
        except KeyboardInterrupt:
            break

これで、たとえば手を鳴らしても角度を出力しないようにできます。


注意

これらのコードは、usb_4_mic_array/Tuning.pyを使っているので、このフォルダ以外で実行するにはTuning.pyをフォルダに置くか、コードの中にTuning.pyの関数等を記載する必要があります。

どのフォルダでも使えるように書き換えた例を乗せておきます。

get_angle.py
from time import sleep

import usb
import usb.core
import usb.util
import struct

dev = usb.core.find(idVendor=0x2886,idProduct=0x0018)
TIMEOUT = 100000

# PARAMETERS for sound localization
PARAMETERS = {
    'DOAANGLE': (21, 0, 'int', 359, 0, 'ro', 'DOA angle. Current value. Orientation depends on build configuration.'),
    'SPEECHDETECTED': (19, 22, 'int', 1, 0, 'ro', 'Speech detection status.', '0 = false (no speech detected)',
                       '1 = true (speech detected)'),
    }

def read(param_name):
    try:
        data = PARAMETERS[param_name]
    except KeyError:
        return

    id = data[0]

    cmd = 0x80 | data[1]
    if data[2] == 'int':
        cmd |= 0x40

    length = 8

    response = dev.ctrl_transfer(
        usb.util.CTRL_IN | usb.util.CTRL_TYPE_VENDOR | usb.util.CTRL_RECIPIENT_DEVICE,
        0, cmd, id, length, TIMEOUT)

    response = struct.unpack(b'ii', response.tostring())

    if data[2] == 'int':
        result = response[0]
    else:
        result = response[0] * (2. ** response[1])

    return result

# Find angular
if dev:

    while True:
        if read('SPEECHDETECTED') == 1:
            print(read('DOAANGLE'))
            sleep(1)

これでどのフォルダ下でも音源定位が出来ると思います。


おまけ:LED制御

好きな場所で以下を実行します(homeでもusb_4_mic_array内でも)

git clone https://github.com/respeaker/pixel_ring.git
cd pixel_ring
sudo python setup.py install
sudo python examples/usb_mic_array.py

これを実行すると、
wakeupの光り方を3秒
thinkの光り方を3秒
speak光り方を6秒
off光り方を3秒
をします。
その他の光り方は、pixel_ring/pixel_ring/usb_pixel_ring_v2.py を参照して下さい。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4