Реализация распознавания речи с нескольких микрофонов
Многомикрофонное распознавание используется в переговорных комнатах, телеконференц-системах и промышленных сценариях. Цель — получить чистый сигнал каждого говорящего, используя пространственную обработку массива микрофонов.
Компоненты системы
Полный стек включает:
- Beamforming — направленное усиление сигнала с нужного направления
- Acoustic Echo Cancellation (AEC) — подавление эха от динамиков
- Noise Reduction — шумоподавление
- Speaker Diarization — разделение по говорящим
- STT — финальная транскрибация
Beamforming с PyAudio + SciPy
import numpy as np
from scipy.signal import correlate
class DelayAndSumBeamformer:
def __init__(self, mic_positions: np.ndarray, sample_rate: int = 16000):
self.mic_positions = mic_positions # (n_mics, 3) координаты в метрах
self.sample_rate = sample_rate
self.speed_of_sound = 343.0 # м/с
def compute_delays(self, direction: np.ndarray) -> np.ndarray:
"""Вычисляем задержки для каждого микрофона"""
delays = np.dot(self.mic_positions, direction) / self.speed_of_sound
delays -= delays.min()
return (delays * self.sample_rate).astype(int)
def beamform(self, signals: np.ndarray, direction: np.ndarray) -> np.ndarray:
"""signals: (n_mics, n_samples)"""
delays = self.compute_delays(direction)
output = np.zeros(signals.shape[1])
for i, delay in enumerate(delays):
output += np.roll(signals[i], -delay)
return output / len(delays)
Коммерческие SDK для многомикрофонной обработки
Для production рекомендуется использовать специализированные библиотеки:
- Microsoft Audio Stack (MAS) — встроен в Azure Cognitive Services
- WebRTC Audio Processing Module — open-source, C++ с Python-биндингами
- ReSpeaker SDK — для кольцевых микрофонных массивов (6-mic circular)
- STFT-based MVDR beamformer (librosa + scipy) — research-quality
Микрофонные массивы
| Конфигурация | Направленность | Сценарий |
|---|---|---|
| Linear 4-mic | 1D | Переговорный стол |
| Circular 6-mic (ReSpeaker) | 360° | Круглый стол |
| Planar 8-mic | 2D | Потолочная установка |
Интеграция с диаризацией
После beamforming применяем pyannote.audio для разделения по говорящим:
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token="YOUR_HF_TOKEN"
)
diarization = pipeline("beamformed_output.wav", num_speakers=4)
for turn, _, speaker in diarization.itertracks(yield_label=True):
print(f"{speaker}: {turn.start:.1f}s - {turn.end:.1f}s")
Интеграция с аппаратными решениями
Тестированные устройства:
- ReSpeaker 4/6-mic USB Array — plug-and-play, Ubuntu/Windows
- miniDSP UMA-8 — профессиональный массив, XMOS DSP
- JABRA PanaCast 20 — конференц-сопровождение с SDK
Сроки реализации
- Базовое beamforming + STT: 1 неделя
- С AEC и noise reduction: 2 недели
- Полная система с диаризацией и dereverberation: 3–4 недели







