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

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

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

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

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

Вопросы:

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

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

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

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

Edit:

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

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

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

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

Ответ 1

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

Если вы перейдете к Python, я запомню следующее:

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Этот Usb DAQ Device поддерживает 14 аналоговых входов SE (Single) с одним USB-портом в 14 бит, 48 KS/s.

И да, по крайней мере Labview имеет версию Linux.

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

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