Python3, слушайте определенный канал массива микрофонов - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь прослушать первый (0) канал массива микрофонов (Respeaker v2.0) с Python 3.7.

В настоящее время я могу прослушивать 6 каналов:

p = pyaudio.PyAudio()

stream = p.open(
            rate=16000,
            format=p.get_format_from_width(2),
            channels=6,
            input=True,
            input_device_index=5)

Но когда я хочу записать в буфер:

for i in range(0, int(RATE / CHUNK_SIZE * RECORD_SECONDS)):
    data = stream.read(CHUNK_SIZE)
    stream.write(data, CHUNK_SIZE)

Как выбрать канал "0"?

С Respeaker V2.0, канал 0содержит обнаруженный голос (а канал 5 содержит вывод для воспроизведения)

Я не вижу никакой возможности сделать это с PyAudio: (

NB: если я записываю поток в WAVфайл и открыть его с помощью Audacity, я могу выбрать первый канал, и он эффективно содержит очищенный голос

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 марта 2019
frames = []

for i in range(0, int(RESPEAKER_RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    a0 = np.fromstring(data,dtype=np.int16)[0::6]
    # if you want to get channel 1 data
    # a1 = np.fromstring(data,dtype=np.int16)[1::6]

    a = a0.tostring()

    frames.append(a)

документ: http://wiki.seeedstudio.com/ReSpeaker_Mic_Array_v2.0/

0 голосов
/ 07 января 2019

работает с двумя каналами как для локальных файлов, так и для потока данных.

Локальный файл.

# audio channel balance local file
import numpy as np
import pyaudio
import wave
import time

wf = wave.open('2chan_audio.wav', 'r')
p = pyaudio.PyAudio()

# two channels
channel_balance = [0.1, 1]

def callback(in_data, frame_count, time_info, status):
    data = wf.readframes(frame_count)
    data_as_np = np.frombuffer(data, dtype=np.int16)
    data_as_np = data_as_np.reshape(frame_count, wf.getnchannels())
    data_as_np = np.int16(data_as_np * channel_balance)
    return data_as_np, pyaudio.paContinue

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True,
                stream_callback=callback)

stream.start_stream()

while stream.is_active():
    time.sleep(0.01)

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

Поток данных.

# audio channel balance stream
WIDTH = 2
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()

channel_balance = [0.1, 1]

def callback(in_data, frame_count, time_info, status):
    data_as_np = np.frombuffer(in_data, dtype=np.int16)
    data_as_np = data_as_np.reshape(frame_count, CHANNELS)
    data_as_np = np.int16(data_as_np * channel_balance)
    return data_as_np, pyaudio.paContinue

stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                stream_callback=callback)

stream.start_stream()

while stream.is_active():
    time.sleep(0.01)

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

Надеюсь, что это работает!

...