BONXを支える音声信号処理開発
BONXでは、音声通話品質向上のために独自の音声信号処理アルゴリズム開発やVoIPシステムに関するソフトウェアを開発しています。組み込み向けの音声処理ライブラリはC++で、VoIPサーバをgolangで書いています。
BONXは、複数人で行う様々なアクティビティをより楽しくするためのコミュニケーションツールとして、デスクレスワーカー・エッセンシャルワーカーのための新たなコミュニケーションプラットフォームとして、ウェアラブルトランシーバとそれに付随するアプリケーションの開発を行っています。
今回は、その中でもBONXを支える技術の一つである、音声信号処理アルゴリズムの開発過程をまとめさせて頂きます。
BONXと音声信号処理
BONXは、店頭、工事現場や医療現場での仕事やアウトドアスポーツ等を行っている間に利用するトランシーバーなので、両手を解放したままコミュニケーションを取れることが重要です。
そこで、通常のトランシーバーのようにボタンを押してから話し始めるのではなく、人の発話を自動的に検知して手による操作をなしに会話が出来る(自動発話検知)ということがkey featureの一つとなっています。
(接客等の周囲の人間と会話しつつ、離れた人とも会話したいというユースケース向けに、ボタンを押して音声送信を始めるPush-to-talkモードでも利用可能です。)
BONXのユースケースは、メインとなるアクティビティの補助であるので、電話と異なって常に会話を行うというものでもありませんし、利用シーンとして周辺環境の騒音が大きい場所で利用することになります。一般的な電話機なんかでも発話検出やノイズ除去の機能を持ったチップは乗っていたりするのですが、もともと想定されているユースケースが異なるのでそのまま使えるわけではありません。
BONXを利用している間、会話自体はまれにしかしないのに常に音声を送信し続けてしまうと非常に耳障りなだけではなく、電話代・パケット量が大変なことになってしまいますので、UXだけではなくコスト的にも非常に重要な機能となっています。
また自動発話検知を実現するために、アプリケーションレベルの様々なアルゴリズムの適用だけではなく、ハードウェアレベルの音質向上の取り組みや、ファームウェアレベルの音響調整と音質向上のためのセッティングなども同時に進める事になります。
発話区間検出について
BONXにおける音声信号処理アルゴリズム開発
BONXでの音声信号処理アルゴルズム開発以下のような流れで今に至っています。
1. 標準的なセッティング
2. 実地テスト・ユーザからの要望が上がる
3. アクティビティ中の生音の収集
4. 集めた生音でPython + Jupyter Notebook(Lab)の簡易環境によるアルゴリズム検討
5. モバイル向け実装の開発
6. ファームウェアの最終チューニング
7. 社内実地テスト(2に戻る)
基本的には、一般的なWebサービス等のプロダクトにおけるUI/UX改善のデータ分析業務と同じようなものだと思っていますが、体験が音声会話であり、扱うデータが音声であることという部分に特殊性があると思います。
標準的なセッティングの実施
BONXは、Bluetoothヘッドセットデバイスと、スマートフォンアプリを連携させて初めて真価を生むプロダクトです。音声信号処理についても、まずハードウェアレベルでの前処理が上手く動いているお陰で、アプリケーション側だけでは実現不可能なノイズ除去や発話検出を実現しています。
ハードウェアチップには標準音響処理エンジンが入っているのでマイクの配置の調整と、ビームフォーミングによる口元の音声の強調や、定常ノイズの除去とイコライジング等のセッティングを実施します。それの設定によって音の質(スペクトルの分布や波形の歪み)が変わってきますので、その音声に合わせて、パラメータを調整した発話検出のための標準的なアルゴリズムを実装して、まず社内リリースを行いました。
音響的なものについては、プロのオーディオエンジニアの方にハード・ソフト両面に色々処理を追加してもらうのですが、デザイン性を損ねずにS/N比を高めるために、マイクを口元に持ってくる以外の音声信号処理のレイヤーでできることはとにかくなんでも試す必要がありました。
一方、最新のBONX BOOSTではマイクオプションによって非常に高いS/N比の実現を確認しています。(音の作り込みは現在進行形で行なっています)
https://bonx.co/ja/new-gear-2021/
アクティビティ中の会話の生音を集める
定性的な感想から、実際にその環境を再現して音データを見ないと行けないわけですが、再現するとなると実際にアクティビティをやって音を集めてこなければなりません。マイク(ハードウェア特性)、空間特性、環境音、声によって音は変わってくるのでとにかく体当たりで集めに行くのが一番はやいです。
駒沢公園をランニングしながら、自分のブレス音と環境音を録音してみたり、スケートパーク内でスケートしながらボードが立てる騒音を録音してみたりしました。もちろん、他の社員も日常的に山に行ったり釣りに行ったりするので、録音アプリで環境音を集てもらったりもしました。
Python + Jupyter Notebookによるアルゴリズム検討
検証用の音声が集まったあとは、普通のデータ分析仕事と同様、Python + Jupyter Notebookを用いてインタラクティブにアルゴリズム検証を行いました。Pythonには、numpy、scipyといった基本的な数値計算のためのものから、音楽分析と可視化用のlibrosaや、音声分析のためのpysptk等音声信号処理アルゴリズムの検証を低コストで回す環境は一通り揃っています。音声データをスペクトルの可視化等をしながら検証出来るのはとても効率的です。
直接BONXの製品に入っているアルゴリズムが入っているわけではないのもあるのであくまでご参考まで。
モバイル向け実装の開発
アルゴリズムが固まったら、スマートフォン上で実行出来るようにC++で再実装します。iOS/Android両方で利用出来るように、C++による共通実装をライブラリ化して開発しています。
リアルタイム性が求められるアプリケーションであり、計算遅延の発生は許されないため、メモリアロケーションを最小限にすると言った基本的な高速化から、ARMのSIMD拡張であるNEONを利用するなどの効率的な実装が求められます。iOSだけであればAccelerate Framework(vDSP)があるので、そこまで頑張らなくても十分早くなったりするのですが共通化を目指すと組み込み系素人にはなかなかにハードルの高い取り組みでした。
「こんな音絶対非発話として判定できねーよ」となって打ちひしがれることも多いので、上手く行ったときの喜びは一入であります。
まとめ
音声信号処理アルゴリズムの開発プロセスについてまとめさせていただきました。以上の様に、BONXでは、快適な音声コミュニケーションプラットフォームをユーザーに届けるために日々開発を行なっています。まだまだ改善の余地はあるプロダクトでありますが、Dogfoodingを厭わないチームとして動いています。End-to-Endでのアルゴリズム開発からアプリへの適用、そしてそれをリリースしたプロダクトで自分たちを含めた仕事を頑張る人達、アウトドアスポーツを楽しむ人達のコミュニケーションがより楽しくなるという素晴らしい環境であると思うので、音声信号処理の仕事としては非常に楽しいプロダクトだと思います。
BONXではソフトからハードまで手掛けるHeSaaS領域のスタートアップで共にサービスを作るメンバーを募集中です。カジュアル面談、採用面談をご希望の方はこちらのフォームよりお申し込みください!
(golangでVoIPシステムを書いたり音声信号処理の基盤ライブラリを書いたりするような音声信号処理の組み込みライブラリをベンチャーで書いてる人がいればいろいろ話聞きたいので仲良くしてください)
本ブログはBONXを支える音声信号処理開発のウラガワの一部をリライトしたものです。