質問: 私はマイクを使って検知した音を使うアプリを作ろうとしています。 https://github.com/ooper-shlab/aurioTouch2.0-Swift こちらのサイトを参考にマイクを使って音は検知して、FFTしたデータは撮ることができました。 そこからなのですがFFTしたデータを既に保存していたデータと比較して似た音(拍手の音なら、拍手)を検知することができるのでしょうか? いくつか調べててみたのですが、解決方法は分りませんでした ### 補足情報(言語/FW/ツール等のバージョンなど) Xcode Version 8.2.1 (8C1002) 言語 Swift
回答: 具体的なコメントでなくてすみませんが・・・ FFTは周波数のスペクトルを分析する手法ですね。これを音波に適用すると倍音がどのような傾向になっているかがわかりますが、いわゆる音の特性のうち音色が倍音の含まれ具合によって決まるのでFFT結果によって原理的に「音色」が判別可能であると言えると思います。 ただ、ご質問を拝見した雰囲気では「録音した波形のある部分のみをFFT変換した単一の結果」により音の識別をしようとしているように感じられました。もしそうだとすると、それは難しいのではないかと思います。なぜなら音の特徴には倍音特性(周波数特性)以外の要素があると思うからです。 例えば単純に楽器の音を考えてみると、同じ周波数特性を持った波形を再生しても、音の立ち上がり(アタック)や最大振幅からの急激な減衰(ディケイ)やその後のなだらかな減衰(サスティン・リリース)の様子やそれぞれの瞬間に(微妙に?)変化する周波数特性などによってかなり違った音に聞こえます。つまり一般に音を識別するには「定常波を単純に周波数分析しただけでは不十分」であり「時間の経過により変化する周波数特性や音の大きさの変化を含めた特徴」を捉える必要があると思います。拍手も断続的かつアタックが早い特徴などもこみで「拍手」に聞こえるのではないでしょうか。 ご存知と思いますが、音声認識や音の識別を達成しているソフトウェアは存在するのでなんらかの手法はあるはずですね。おそらくそういうものは時間的な周波数特性の変化に着目し多くのサンプルから機械学習的手法で得た「拍手の特徴」といったデータに基づいて識別しているのではないかと思います。つまり「ある単一の音声のサンプル(の周波数特性)」どうしを比較することでは(満足できるようなレベルでの)音の識別は難しいのではないかなと思います。 画像認識なんて同様に難しそうなテーマも最近は多くの方が取り組んでおられるようなので、音声認識も自分が考えるほどには敷居は高くないのかも知れません。とはいえこんなページを見ると「「拍手」「咳、くしゃみ」「笑い声」 「大きな息の音」の識別ができます...さらに多様な音を識別する開発を進めています。」なんて書いてあるので、「拍手」を識別するのも簡単ではなさそうだと思いました。 ちなみに「とりあえずサンプル音の倍音特性のみに着目してどこまで識別できるかやってみる」というのも個人的には面白いと思いました。そういうことであればFFTの結果を用いて「基音に対する倍音の成分の大きさの比率」を比較するという手法が取れそうな気がします。あらかじめ用意したいくつかのサンプルの周波数特性と各倍音の比率の差による評価関数を適当に決めて一致の程度により決めるという感じでしょうか。そういう処理なら比較的簡単にできると思います。少なくとも人間の話声とバイオリンの音などは倍音特性が大きく異なるのでそういうものの識別はある程度できるような気がします・・・