python-sounddevice — Воспроизведение звука с микрофона

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

Я пытался использовать InputStream, но звук просто ужасен, когда я его воспроизвожу, есть идеи, что я делаю неправильно?

10 — мой микрофон, а 13 — мое устройство вывода (динамики).

import sounddevice as sd

device_info = sd.query_devices(10, 'input')
samplerate = int(device_info['default_samplerate'])

sd.default.samplerate = samplerate
sd.default.channels = 2
devices = sd.query_devices()
print(devices)

def callback(indata, frames, time, status):
    #print(indata)
    sd.play(indata, device=13, blocking=True)

with sd.InputStream(device = 10, samplerate=44100, dtype='float32', callback=callback):
    print('#' * 80)
    print('press Return to quit')
    print('#' * 80)
    input()

У меня такое ощущение, что мне нужно добавить его в очередь и воспроизвести из очереди?


person Aran Bins    schedule 09.02.2018    source источник


Ответы (1)


Удобные функции высокого уровня sd.play(), sd.rec() и sd.playrec() просто воспроизводят и/или записывают целые массивы NumPy произвольной (но фиксированной) длины (если они помещаются в память). Они должны быть простыми и удобными, но варианты их использования весьма ограничены.

Если вам нужно больше контроля (например, непрерывная запись, обработка в реальном времени и т. д.), вы можете использовать классы «потока» более низкого уровня (например, sd.Stream, sd.InputStream, sd.RawInputStream) либо с «неблокирующим» интерфейсом обратного вызова, либо с "блокирующие" методы read() и write().

Высокоуровневые функции внутри уже используют классы «поток», поэтому вы не должны их смешивать! Если вы используете sd.play() в функции обратного вызова потока, он создает еще один поток в функции обратного вызова. Это обречено на провал!

Короче говоря, вы должны использовать либо высокоуровневый или низкоуровневый интерфейс, но не оба одновременно.

Если вы хотите немедленно воспроизвести вход микрофона, вы должны использовать sd.Stream (включая вход и выход) с функцией обратного вызова, как показано в документации и в примере приложения wire.py.

person Matthias    schedule 10.02.2018