Вход от 20+ микрофонов

Меня попросили (если это возможно) написать программу, контролирующую вход как минимум 20 микрофонов на одном компьютере.

В настоящее время я создаю прототип на Python (2.6) в системе Ubuntu с использованием Alsa. Мои попытки до сих пор вызвали довольно много вопросов ...

Ubuntu - это требование, Alsa - нет, а python - идеальный вариант.

Что касается оборудования, можно предложить несколько звуковых карт. Другой - это серия USB-концентраторов и адаптеров для микрофонов (например, эти) (в этом случае все устройства будут идентичны и подключены к одной шине USB)

Вопросы:

Как я могу одновременно записывать несколько микрофонов с одной звуковой карты? (например, использование линейного входа, а также микрофона, бонус для тех, кто знает, как я могу использовать более двух входов!)

В настройке USB, как я могу определить, в какое положение звуковая карта (адаптер USB) подключена к концентратору USB (или цепочке концентраторов USB).

Если решением является прямой доступ к микрофонам через USB, зависит ли положение устройства на шине USB только от того, к какому порту концентратора USB они подключены, или оно может меняться между включением и выключением компьютера?

Наконец, при использовании необработанного доступа, как мне лучше всего получить данные (нет текущего опыта работы с pyUSB) и какое преобразование (если оно есть) требуется от raw -> audio?

Изменить:

По монитору меня попросили записывать ввод на диск (в идеале выше установленного порога, для которого кодек speex выглядит идеально), контролировать уровни громкости, обеспечивать графическую обратную связь и настраивать как минимум один выход, который циклически проходит через все активные микрофоны.

Python не является долгосрочным требованием, это просто самый простой способ, который я нашел до сих пор, чтобы получить данные PCM со звуковой карты (однако, только микрофон)

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

Где я могу найти дополнительную информацию о реализации драйвера USB-аудио класса?


person Paul O'Reilly    schedule 23.06.2010    source источник
comment
Python не является долгосрочным требованием, это просто самый простой способ, который я нашел до сих пор, для получения данных PCM со звуковой карты Действительно? Используя что?   -  person endolith    schedule 23.07.2010


Ответы (8)


Определение «монитора» здесь очень большая переменная. Монитор может означать «запись на диск», «обнаружение уровней громкости выше определенного порога» или «выполнение анализа более высокого уровня в частотной области (т.е. обычная обработка сигналов)». Эти три имеют очень разные последствия для использования ЦП и возможностей Python. Python может не подходить лучше всего в зависимости от того, что вы хотите делать.

Если вы выберете Python, отмечу следующее:

  • Поддержка звука в Python очень слабая
  • Привязки python ALSA (pyalsa) предназначены для управления секвенсором, микшером и оборудованием, а не для чтения образцов PCM (хотя привязки могут быть полезны для управления устройствами)
  • У Python есть проблемы в определенных многопоточных условиях (см. GIL - Global Interpreter Lock), которых можно полностью избежать, имея отдельные процессы Python, но это также нежелательно во всех случаях (я предполагаю, что вы работаете на многоядерная / процессорная система и вы хотите разделить нагрузку на мониторинг 20 аудиовходов между процессорами).
  • Операции с интенсивным использованием ЦП и памяти, которые можно было бы ожидать при анализе звука, не являются сильной стороной Python. При этом данные PCM могут быть распакованы с помощью struct.unpack (), а анализ сигналов может быть выполнен с помощью подпрограмм, имеющихся в NumPy и SciPy.

Каждый линейный вход и микрофон должны быть стереоскопическими, обеспечивая по два микрофонных входа каждый, то есть четыре микрофона на звуковую карту. Если предположить, что всего 20 входов, это означает пять аудиоадаптеров USB. Кстати, чтобы использовать линейный вход, вам понадобится какой-то микрофонный предусилитель, который может быть дороже, чем вам хотелось бы. В этом случае вам понадобится 10 аудиоадаптеров USB на 20 входов.

Я бы предупредил, что большинство концентраторов начального уровня, вероятно, не смогут обрабатывать трафик для 5-10 аудиоадаптеров. В этом отношении я был бы уверен, что у вас есть концентратор USB 2.0 Highspeed (даже если фактические аудиоустройства являются полноскоростными USB 1.1 или медленнее), чтобы быть уверенным, что у вас достаточно пропускной способности восходящего потока. Если у вас есть опция, нетрудно получить адаптерные карты PCI USB с 4 или 5 внешними портами USB. Кстати, USB-устройство, которое вы показываете, имеет только стереовыход и микрофонный вход (без линейного входа).

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

Что касается логического и физического сопоставления звуковых карт USB, набор правил udev позволит вам предоставить полезную и последовательную схему именования устройств на основе иерархии USB или, если хотите, серийных номеров (если они есть на устройствах) или других атрибуты. В любом случае вы должны иметь возможность использовать правила udev для стабилизации сопоставления аудиоустройств по их идентичности или их физическому расположению (по вашему выбору).

Я ничего не знаю о pyUSB, но вижу, что он поддерживает изохронный режим передачи. На первый взгляд, pyUSB обеспечит очень точное управление, но я подозреваю, что вы будете кодировать гораздо больше, чем намеревались (вам в основном нужно реализовать лучшие части драйвера USB-аудио класса на Python).

Надеюсь, это поможет!

person Aaron    schedule 23.06.2010
comment
Это очень полезно. Большое спасибо! Удев для меня новичок и выглядит идеальным решением. На всякий случай отправляюсь исследовать создание аудиодрайвера USB ... - person Paul O'Reilly; 23.06.2010

Что касается оборудования, можно предложить несколько звуковых карт. Другой - это серия USB-концентраторов и микрофонных адаптеров (например, этих).

Это также несколько звуковых карт: каждая из них представляет интерфейс USB Audio Device Class с независимой синхронизацией, что может вызвать проблемы, если вы попытаетесь их синхронизировать.

Я никогда не пытался запустить что-то вроде 20 из них одновременно, но, как мне кажется, это будет крайне ненадежно. Это дешевый потребительский комплект, который не предназначен для такого использования; хотя вы бы не стали беспокоиться об ограничении пропускной способности USB 2.0, я думаю, они перестанут работать надежно задолго до этого. За то, что стоит конкретная модель, с которой вы связались, имеет очень плохие отзывы.

Если есть возможность, подумайте о звуковых картах более высокого уровня с несколькими входами. Например, Delta-1010LT имеет разумную цену и очевидно поддерживается ALSA. . Есть еще немало возможностей 8 + -входов с внешними боксами (USB, Firewire, всякое RME); ESI делает стойку на 16 входов, но ситуация с драйверами для ALSA выглядит сомнительной.

С одним синхронизированным устройством, с которого вы можете получить несколько каналов аудиовхода за один раз, будет намного проще справиться, чем с множеством отдельных звуковых карт. Вероятно, вы все равно не захотите возиться с образцами непосредственно в Python, но вы можете подключить к Python набор инструментов для обработки / анализа более высокого уровня с помощью чего-то вроде PySndObj.

person bobince    schedule 23.06.2010

Я лично предлагаю вам какое-то оборудование, такое как цифровой микшерный пульт, который в первую очередь будет поддерживать все эти входы. Я действительно сомневаюсь, что иначе вы легко сможете заставить работать несколько микрофонов. И перед тем, как вы начнете писать какой-либо код для записи всех этих входных данных, логичным первым шагом является проверка того, может ли / как ПК даже справиться с таким сценарием.

И я бы также не стал рекомендовать здесь Python. С одной стороны, это звучит как случай, когда производительность может быть критичной, с другой - на * nix я бы не хотел делать что-либо низкоуровневое, кроме C / C ++ (в Windows я бы, вероятно, сказал C ++ или C #).

person Mr. Boy    schedule 23.06.2010

Аудио через USB - это нормально, если вы не против задержки, но я серьезно сомневаюсь, что он может работать с 20 каналами, особенно на 20 устройствах.

Получите несколько больших интерфейсов Firewire (8 каналов +), возможно, от Presonus. Найдите что-нибудь, поддерживаемое звуковой системой Linux, вы же не хотите иметь дело с какой-либо шиной самостоятельно. По возможности используйте приложение DAW для получения звука. Если требуется обработка, вероятно, проще написать плагин, чем начинать с нуля. Я не знаю хорошей библиотеки для многодорожечной записи на Python.

person Tobias    schedule 23.06.2010

Просто совет: думайте о своих 20 звуковых входах как об аналоговых входах и записывайте их с помощью аналого-цифровых преобразователей, таких как, например, карты National Instruments.

Я даже слышал о профессиональных звуковых картах с использованием оборудования NatInst. И (по крайней мере, для Windows, я не знаю для Linux) поддержка программного обеспечения отличная.

Это USB DAQ-устройство поддерживает 14 SE ( Несимметричный) Аналоговые входы только с одним портом USB на 14 бит, 48 кГц / с.

И да, по крайней мере, у Labview есть версия для Linux.

person Franklin Albricias    schedule 23.06.2010

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

Многие из самых дешевых USB-устройств не имеют уникального серийного номера, а некоторые даже довольно дорогие (например, Zoom 4595 Aircard). Если это так, то хорошего пути нет ... тот, кому удастся пробиться вперед в очереди, будет / dev / n0, следующий / dev / n1 и так далее.

Но если у них есть уникальные серийные номера, вы можете написать правила udev, в которых определенным серийным номером должен быть / dev / n4. Правила Udev не для слабых, мне потребовались недели, чтобы овладеть ими, но они могут сделать эти вещи возможными.

person John O    schedule 20.08.2010

Сегодня существует программное обеспечение, которое может делать это бесплатно или дешево. Проблема заключается в получении входных данных.

Если это для бизнеса, и его бизнес полагается на это, я предлагаю решение Logic Express / Logic Pro или Pro Tools. Потратьте пару долларов, и пусть все заработает.

Бесплатное программное обеспечение, которое будет хорошо работать, - это Audacity (все платформы), Garageband (Mac), Ardor (Linux, Mac) и т. Д.

Теперь, чтобы получить двадцать монофонических аудиовходов в системе, вам следует подумать о том, чтобы получить что-то с двадцатью входами (или более), а не запускать все 20 микрофонов на микшерный пульт и записывать микширование одного канала.

person speeds images    schedule 20.08.2010

Интересно рассказать, чем вы закончили. Мне интересно, может ли с этой работой что-то простое, например захват 20 arecord процессов и один aplay процесс.

Например, вы запускаете 20 захватывающих arecord процессов и передаете их стандартный вывод в tee, который, в свою очередь, записывает в файл и в канал. Запустите также 20 cat процессов для прокачки труб до /dev/null. Вам необходимо отслеживать PID всех этих процессов. Если вы хотите контролировать некоторые входные данные, просто завершите соответствующий процесс cat и начните подавать aplay из канала (возможно, снова используя процесс cat).

Теперь вам понадобится только интерфейс для управления всеми этими процессами. Теперь вы, возможно, захотите, чтобы ваша программа визуально отображала график каждого входа, чтобы обеспечить обзор активных каналов. Но в основном это также может быть достигнуто простой программой, выполняющей эту работу, подпитываемой tee процессами, которые у вас уже есть.

кстати, используя tee, вы можете напрямую передавать необработанные данные в кодировщик speex для сохранения на диске непосредственно в окончательном формате. При использовании сырых данных для мониторинга.

person akostadinov    schedule 05.09.2013