ビームフォーミング聴覚拡張デバイスを作りたい #1 — 冒険のはじまり

Featured image of post ビームフォーミング聴覚拡張デバイスを作りたい #1 — 冒険のはじまり
目次

こんにちは、たひです。

最近、個人プロジェクトでウェアラブル聴覚拡張システムを作っています。カフェやパーティのような騒がしい環境で「話している人の声だけ」をクリアに聞き取るためのデバイスです。

本記事はそのシリーズ第1回として、プロジェクト全体像を紹介します。このあとの連載では中核ハードウェアであるマルチチャンネルUSBマイクの設計を、回路選定からドライバ実装まで順を追って書いていく予定です。

なぜ作ろうと思ったか

複数人で会話するとき、特に騒がしい場所だと「目の前の人の声」が周囲のノイズに紛れて聞き取れないことがあります。特に同時に複数人が話す状況では、人間の聴覚でも対象話者を選別するのは負荷が大きい作業です。

最初は「ノイズキャンセリングイヤホンで何とかなるのでは?」と思っていたのですが、

  • ノイキャンは「全方向のノイズを下げる」ものなので、話者の声も同時に減衰してしまう
  • 騒がしい場所では結局聞こえない
  • 補聴器系のデバイスは高価で、しかも「話者選別」までは踏み込んでいない

ということに気付き、

マイクアレイで指向性を絞り、その方向だけを強調すればいけるのでは?

という発想で自作することにしました。

何を作っているのか

ざっくり言うと、

  • 複数のマイクを配置したセンサユニットを頭部(メガネ側)に
  • 顔検出と音源方向推定でいま誰が話しているかを特定
  • ビームフォーミングでその方向に指向性を絞り、他をカット
  • ニューラルノイズリダクションでさらにノイズを除去
  • 仕上がった音声をイヤホンに送って耳に届ける

という処理パイプラインです。

構成は「センサユニット — 処理ユニット — イヤホン」の3ブロックで、センサ側にカメラと多chマイクを載せ、USB-C 1本で処理ユニット(小型SBC)に流し込み、最後はBluetoothでイヤホンに飛ばします。

実際の信号フローはこんな感じです。

システムアーキテクチャ

左側のLuckFox HATが「マルチチャンネルUSBマイク」にあたる部分で、MEMSマイク → CODEC → USBガジェットというハードスタックになっています。本シリーズではこの左側のブロックを掘り下げていきます。

なぜ「マルチチャンネルUSBマイク」を自作するのか

このシステムの肝はマイクアレイです。ビームフォーミング(音の指向性制御)には少なくとも4ch、できれば6ch以上のマイクが必要で、しかも各マイク間の位置関係が既知かつ正確に固定されている必要があります。

「だったら市販のマイクアレイを使えばいいのでは?」と最初は考えました。Seeed StudioのreSpeakerなどは有名どころです。

ただ実際に検証してみると、

  • 形状の自由度が低い — メガネフレームに沿った配置は不可能
  • ホストインターフェースが固定 — 自分の処理パイプラインに繋ぎにくい
  • マイクの素性 — SNR、AOP、位相マッチングが選定基準と合わない

といった理由で、結局カスタム設計が必要になりました。

要件をまとめると、

項目要件
有効周波数下限1kHz以下(母音の F0 を含む)
空間エイリアシング上限4kHz以上(子音帯域をカバー)
DoA推定精度5°以下(話者分離に必要)
チャンネル数6〜8ch
総重量マイク+基板で5g以下
消費電力50mW以下(USBバスパワー動作)
ホストI/FUSB Audio Class 2.0(ドライバレス)

これを満たす専用のマルチチャンネルUSBマイクを、ハードウェアからファームウェアまで作っているのがこのプロジェクトです。

ハードウェア構成

USBマイク部分のスタックは次のようになっています。

役割部品備考
マイク(音響センサ)Infineon IM72D128VV01 ×6PDM出力、SNR 71.5dB(A)、AOP 128dB SPL
CODECTexas Instruments TLV320ADC5140PDM 6ch 入力 → I2S TDM 8ch 出力
ブリッジSoCLuckFox Pico Ultra (Rockchip RV1106G3)Cortex-A7 + Linux、USB OTG
ホストI/FUSB-C / f_uac2ガジェットUAC2.0 Class、ドライバレスで認識

PDMマイク → ADC5140でTDMにまとめ → RV1106で受けて → USB Audio Class 2.0でホストに流す、という構成です。

ホスト側(NanoPC-T6, RK3588)はUSBマイクとして見えるだけなので、特殊ドライバは不要です。普通のLinux PCでもarecord -D plughw:CARD=...で8chを取れるようになります。

開発フェーズ

このプロジェクトは段階的に進めています。

Phase状態内容
Phase 1完了アルゴリズム検証(Windows)— ノイズリダクションと音源方向推定の PoC
Phase 2完了エッジ検証(RK3588)— CPU/NPU 性能実測、顔追跡実装
Phase 3.1完了LuckFox HAT検証機 — UAC2パイプライン、C daemon、MVDR、LED、ASR
Phase 3.2着手前RV1106 カスタム基板 — 専用 PCB、骨伝導 VAD、TSE 話者分離

現状(2026-05時点)はPhase 3.1完了で、市販開発ボード(LuckFox Pico Ultra)の上にMEMSマイク基板をHATとして載せた検証機が動いている段階です。ここまででUSB Audio Class 2.0経由で8ch 96kHzの音声が取れていて、ビームフォーミング・ニューラルノイズ除去・顔追跡・ASRまで一通り回っています。

連載で書く予定の内容

このシリーズはUSBマイク部分にフォーカスして、設計過程を順番に書いていきます。

  • #2: MEMSマイク選定とアレイ設計 — IM72D128の選定理由、メガネフレームに沿った6mic配置、Directivity IndexとSII(音声了解度指数)でのシミュレーション
  • #3: TLV320ADC5140まわり — PDM入力設定、I2S TDM 8ch出力、Biquad HPF、ASI Master動作
  • #4: RV1106でUSB Audio Class 2.0を動かす — f_uac2ガジェット、カーネルパッチ、Device Tree Overlay、ブート初期化
  • #5: 検証 — UAC2安定性、ALSAタイミング、消費電流の実測

各回は独立して読めるように、必要な背景知識から書く予定です。

ここまでで書きたかったこと

  • 「特定の話者の声だけ強調する」ウェアラブルデバイスを作っている
  • そのために多chカスタムUSBマイクが必要で、市販品では条件が合わなかった
  • 構成はMEMS x6 → ADC5140 → RV1106 → USB Audio Class 2.0
  • 次回以降、それぞれを掘り下げていく

ハードウェアからファームウェア、信号処理、機械学習まで横断する幅の広いネタですが、各回でなるべく設計判断の根拠が伝わるように書ければと思っています。

組み込みオーディオまわりに興味がある方の参考になれば嬉しいです。

参考リンク

Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。