音の異常を検索する

音の異常を見つける問題を解決してみましょう。

現時点では、マイクは最も一般的な汎用検出器の1つです。 それらは小さく、安く、信頼できます。 そして、それらはデフォルトで携帯電話に存在します。 ほとんどどこでも使用できます。 したがって、音声だけでなく音声を処理するタスクが今私たちに直面しています。 これは、ローハンギングフルーツの典型的な例です。 :)







音の異常の例:





タスクレビュー



入力データ


音は時系列です。 最も単純な形式では、これは時間軸に沿った信号振幅です

画像 信号はスペクトル領域に変換できます。 その場合、信号は時間とともに変化する周波数スペクトルになります。 音はデータの連続的な流れです。 これは非常に重要です。データを[ずっと]前方に表示できず、その後アルゴリズムを構築または調整できません。







さらに、信号は時間とともに変化する可能性があり、これらの変化は異常ではなくなります。 システム自体が信号の変化に合わせて自身を調整し、信号の繰り返しの変化を異常とみなさないようにすることが望ましい。 一般的な場合、タスクはサウンドだけでなく、任意の時間シーケンスに拡張されます。







監視ありまたは監視なし?


1つのケースでは、どの異常が発生する可能性があるかを事前に知ることなく信号を処理します。 通常の動作からの逸脱は異常と見なされます。 これらは教師なしモデルです。







別のケースでは、異常がどのように見えるかを知っています。 音の異常のサンプルがあります。 これらのパターンを異常検索アルゴリズムで使用します。 これらは監視モデルです。







刷り込みと意思決定


最も単純なケースでは、時間に関する異常の事実のみを検出します。 より複雑なケースでは、引き続き異常を分類します。 たとえば、異常は弱い、強い、または壊滅的なものです。 異常の開始時間を特定するか、異常の開始から終了までの時間枠を特定することしかできません。







解決方法



メソッドの概要


音の異常を検出する方法は、異常を検出する方法のサブクラスに属します。 違いは、入力データであるサウンドが連続ストリームで供給されることです。







最も簡単な方法は、 信号変化検出器です。 しきい値検出器は、信号振幅の変化またはスペクトルの変化に応答します。 このような方法は非常に単純で、多くの場合、最も信頼性が高くなります。 入力信号が安定しており、その動作が時間とともに変化しない条件で機能します。 変更はすべて異常と見なされます。







メソッドの次のグループは、 信号処理メソッドに関連しています 。 これらの方法は、無線信号の処理において深く研究されています。 たとえば、レーダーやモバイル通信を提供しています。 私たちが探しているものを正確に知っているとき、メソッドはうまく機能します。 異常の音またはスペクトルを事前に知る必要があります。 信号処理メソッドには、目的の信号用の強力なフィルタリングデバイスがあります。 これらの方法を使用して異常を検索する方法は完全には明らかではありません。







そして、メソッドの最後のグループは機械学習メソッドです。 これには、線形回帰法や分類法などの古典的な方法と最新のニューラルネットワークの両方が含まれます。 機械学習法は、システムが入力信号のさまざまな動作に適応する必要がある場合に適しています。 入力信号はかなり複雑な依存関係によって変化する可能性があり、メソッドは途中でトレーニングされ、これらの依存関係に合わせて調整されます。 信号内のパターンは異常とは見なされません。 従来の方法を使用してこのようなものをプログラミングすることは困難であり、時には不可能です。信号を変更するにはシステムを手動で調整する必要があるためです。 機械学習の方法では、手動で調整する必要はありません。それ自体は、利用可能なデータでトレーニングされます。 機械学習法の主な問題は、入力データである時系列が連続ストリームで供給されることです。 そのようなデータのために、特殊なモデルが開発されました。 例は、 リカレントニューラルネットワーク (RNN)です。 彼の成功した記述の1つはここで読むことができます







実装例


まず、利用可能な例を簡単に調査してから、自分のタスクに最適なものを選択します。







データ準備:KDNuggetsのWebサイトには、 スペクトルシーケンスの使用例があります







次に、コード例を探してみます。







Microsoft Anomaly Detection Serviceは、最も単純なサービスの1つです。 残念ながら、データの連続ストリームを供給することはできません。 そのドキュメントでは 、時系列の典型的な異常が非常に簡単かつ詳細に説明されています。







Numentaは、時系列の異常を検出するシステムとアルゴリズムをテストするためのテストサイトを作成しました。 Numentaは非常に興味深い機械学習会社であり、脳の仕組みを理解しようとしています。 興味のある人には、魅力的なビデオ、特に異常の検出に関するレポートを見ることをお勧めします。 Numentaアルゴリズムは、このタスクに非常に適しています。 テストサイトのリーダーであるNumenta。 残念ながら、それらの実装はかなり複雑です。 2位3位(2016年11月現在)に提示されたいくつかのアルゴリズムは、Numentaに遅れをとっていませんが、実装がはるかに簡単です。

GitHubでは、多くのオープンソースシステム、特にTwitterのシステムを見つけることができます。







古典的な機械学習を使用して異常を検出する理論に目を向けると、このトピックに関する最も一般的で完全な情報源の1つはscikit-learnプロジェクトです。







Azure Machine Learningには多くの実装例があります。 当然、Microsoft Azure MLを使用する必要があります。 モデルを無料で実験および構築できますが、Azureサーバーでモデルをホストするために料金を支払う必要があります。 それはプラスかもしれないし、マイナスかもしれない。







マイクロソフトは、最高のニューラルネットワークパッケージの1つであるCNTKを開発し 、それをオープンにアップロードしました。 パッケージを使用して時系列を処理するいくつかの例があります。







最も人気のあるニューラルネットワークパッケージの1つはGoogle Tensorflowです。 Kerasは、TensofFlowまたはTheanoの上で実行されるかなり人気のあるパッケージであり、モデルの作成を大幅に簡素化します。 RNNでの使用の一例を次に示します。







設計の選択を始めましょうか?


インターフェース


まず、インターフェイスを決定します。 サービス自体の内部の設計に関係なく、サービスへのインターフェースはそれほど変わりません。これは、サービスの実装ではなく主にタスクに依存するためです。







そのため、 入力は音声付きの大きなファイルか、データが継続的に供給されるストリーム(ストリーム)のポートのいずれかです。







出力は、ファイルまたはストリームのいずれかです。 出力形式:異常の発生時刻。 さらに、次のものも発行できます。異常の完了時刻。 異常クラス。







追加の設定は、サービス設計ごとに異なるパラメーターです。 例:









カスタムデザイン


私は3つのアプローチから始めたので、正確に3つのデザインを作成することは論理的です。 1つ目は、機械学習法を使用せずに信号の変化を検出することに基づいています。 最も単純なバージョンでは、入力信号が平均化されるため、ランダムノイズによって誤検出が多くなりすぎません。 次に、「振幅がしきい値より大きい場合、これは異常です」という関数がチェックされます。







信号パターンを検出するロジックを追加すると、もう少し複雑ですが、はるかに実用的です。 たとえば、異常はキャッシュされ、新しい異常は繰り返しチェックされます。 同様の異常がキャッシュで検出され、「異常ではない」とマークされている場合、これは「異常ではない」です。 「異常/異常ではない」を判定する方法を追加する必要があります。 追加のユーザーインターフェイスまたは何らかのアルゴリズムのいずれかです。







使用法:




利点:




短所:




古典的な機械学習設計


最も簡単なオプションは、Azure MLを使用することです。 例として、この単純な実験 、またはより複雑実験を行うことができます。







あるいは、アプリケーションを完全に制御したい場合は、このプロジェクトとこれをモデルとして使用できます。 どちらもPythonで作成されています。







使用法:




利点:




短所:




ニューラルネットワーク設計


最も可能性が高いのは、Kerasに基づく既製のサンプルが適しているか、CNTKを使用できることです。 しかし、私はそのための既製の例を見つけられなかったので、コードを追加する必要があります。







使用法:




利点:




短所:




おわりに



もちろん、これらのレビュー(POC)プロジェクトは、実際のプロジェクトを開始する前に行う必要があります。 特定のデータは、タスクごとに大きく異なります。 このデータに応じて、さまざまな方法が適しています。

この記事の目的は、「音の異常を探す」という問題へのアプローチ方法の問題を解決するアプローチの1つを示すことでした。

読者の一人が新鮮なアイデアを投げたり、問題や間違いを指摘したりすることを決めた場合、私はそれらをコメントで見ることができてとてもうれしいです。 事前に感謝します!








All Articles