Мне нужно принимать аудиопотоки от нескольких гарнитур Bluetooth, которые могут сэмплировать со своих микрофонов только низкие частоты 8 кГц или 16 кГц, записывать их в файлы wav, а также смешивать их в реальном времени с воспроизведением музыки с приемлемой частотой дискретизации 44,1 кГц. или 48 кГц и воспроизвести его пользователям через наушники с гарнитурой. В идеале это работало бы на Mac с macOS 10.14 Mojave, но у меня также есть доступ к Raspberry Pi 3 и NUC под управлением Windows или Ubuntu Linux.
Если бы не необходимость повышать дискретизацию микрофонного входа, я бы, вероятно, использовал для этого Jack. Однако Джеку, очевидно, нужно, чтобы все звуковые карты работали на одной и той же частоте, и, похоже, он не предоставляет возможности для ресампинга.
Пока что ближе всего к работающему решению я использовал SoX. Однако это создает ужасную задержку около 1 секунды, и я не смог контролировать ее с помощью параметра --buffer. Кроме того, похоже, что на Mac нет возможности указать аудиовход, что по сути ограничивает меня одной гарнитурой.
rec -V -c 1 -r 48000 -p | play -c 1 -r 48000 -p
Я пытался использовать PulseAudio, используя module-loopback и module-pipe-source в сочетании с module-pipe-stream. Пока я не получаю звука или искаженного звука. Также PulseAudio закрывается примерно через минуту после запуска, независимо от того, что я делаю. Интеграция PulseAudio с macOS CoreAudio кажется довольно хрупкой.
Мне не удалось подключить гарнитуру к Pi. Согласно в этом сообщении микрофонный ввод с гарнитуры с использованием профиля HSP BT очень плохо поддерживается.
Некоторые возможности, которые я рассматривал, но все же могу попробовать:
- Запуск Pulseaudio на Raspberry Pi или внутри контейнера Docker и отправка аудио туда и обратно с Mac через RTP с использованием Roc
- Микшируйте звук с микрофонов на встроенный выход AUX Mac. и сэмплируйте его обратно с входа AUX звуковой карты, подключенной к USB.
- Используйте Windows или Linux вместо Mac.
- Напишите собственный код в реальном времени на Python.
Буду признателен за ваш совет о том, как лучше всего решить эту проблему с передискретизацией и маршрутизацией звука в реальном времени.