トキの飛翔

toki
最終更新日:2017/07/07

トキの飛翔(Toki)とは

自宅の近所に日本野鳥の会の創始者ともゆかりのある公園があり、自宅でもいろいろな 鳥の鳴き声を聞く事が出来て、知らない鳥の鳴き声も時々あり、鳥の鳴き声を識別する アプリケーションソフトウエアを作成したいと思っています。 スマートフォンでも高音質で鳴き声を録音できるようになっているので、 オーディオ関係のサポートが良いiOSを最初のターゲットとしたいと思っています。 作者はDeveloper登録していないので、JailBreak環境での開発でオープンソースに する予定です。収益モデルは考えず作者に仕事があるうちは研究や実験を続けたいと 考えています。(いろんな趣味のプログラムがあるので、それほどアクティブには できないかもしれませんが)
最終的には一人で出来るとは思っていないので、私個人の成果を利用して何らかの 形になる事を望んでいる。私の成果物はすべてBSDライセンスとしたい。
音楽を録音して、曲名を検索できる、アプリがあり、かなりの精度だと聞いた。 おそらく方法は類似するが、鳥の鳴き声は単純で比較対象も少ないので、シンプル な仕組みで実現可能ではないかと考えている。

Android用録音アプリ

認識するためにはまず録音ファイルを溜め込む必要があるので、録音用のアプリを 作ってみました。 録音開始してから停止前の5秒間の録音をするようにしてあります。 サウンドファイルはWAVファイル形式、44100kHzのモノのファイルです。 Listで録音したファイルの一覧が表示され、クリックすると再生できます。 Dropboxへのファイルのアップロード機能もあります。Dropboxにアップロードするには SetupのオプションからDropboxのログインを行うか、 ここ からログインしてcodeを貼付けてください。 codeが正しく入力されるとUploadボタンが追加されます。 アップロードされたファイルはSDカードから削除されます。 サウンドファイルはSDカードのTokiディレクトリに保存されます。 Nexus OneでテストしていてAndroid 2.3以降で動作すると思われます。 Andoridのサウンドサポートはあまり良くなくて、ちゃんと録音できない機種も あるようです。 GPSを使うと録音時の緯度経度と時間をxmlファイルとしてサウンドファイルと一緒に 保存します。 このアプリを使って録音したデータを公開してもらえるととっても嬉しいです。 Dropboxのアプリ名はToki_AndroidでDevelopmentなので500名が利用可能です。 録音ファイルサンプル

device-2017-07-06-081549 device-2017-07-06-081607 device-2017-07-06-081642
ダウンロード(Toki.apk)

鳥の鳴き声の機械的に判別について

鳥の鳴き声を録音して、種類を判断するためには大きく三つ重要なポイントがあると 考えている。一つは録音した物のどこを鳥の鳴き声として処理するかで、二つ目は その鳴き声のサンプルの標本との照らし合わせである。三つ目はこれに加えて標本を どのようにして作るかである。

一つ目のポイントは人間の音声認識では振幅やゼロクロスなどの手法があるようだ。 ただ人間の音声認識はおおよそ話しかけられた物を認識する事を目標にしていたり、 また話が成立するような雑音が少ない範囲での認識を考えているので、同じ手法で 必ずしもうまくいくとは限らない。

二つ目については、人間の音声認識と同じようにmfccなどの方法が良いのではないかと 考えている。また機械学習の仕組みを使う事になると思われる。

百瀬浩さんの資料にもあるが、二つの手法があり、一つは鳴き声のブロック全体を 対象とする方法と、一部を対象とする方法だ。人間は前者で認識するが、機械の場合 その識別の方法が複雑になるので、後者の方が有効かもしれない。

三つ目は、これ自体でお金にする事はできないと思うので、ボランティア的な力を 使える仕組みを考えるのが良いのではないかと考える。

考察いろいろ

鳥の鳴き声は、繰り返されるものが多いと考えられるが、周波数・時系列変化・強さ などの要素で、特徴を拾いだせる。 以下のシジュウカラの鳴き声のスペクトラムを確認すると0.2秒くらいの間隔で4KHz と6KHzのピークがはっきり確認できる。

スクリーンショット(2012-04-28 17.38.40)

上記の表示はiPhoneで録音して、Mac上の AudioXplorerという フリーソフトを使った。このソフトはすでに開発が終了していて、新しいOSでは 動かないか可能性もあるかもしれない。また鳥の鳴き声の研究の為にコーネル大学で 作られた Raven というソフトウエアもあるようだが、何らかの理由で使うのをあきらめた。 自身でも薮の雀というFFTソフトを作っていたりするが、 こちらもあまりアクティブに開発できていない。。。

大まかな処理としては、鳴き声のブロックの切り出し、ブロックについてFFTの処理、 3次くらいまでのピーク周波数と強さや幅(減衰率)、および時系列の変化の数値化で 取得したデータを標本との比較することになろう。 鳴き声の切り出しは端末側でおこなうのが現実的だろう。当初は人間が録音の開始・ 停止を考えている。自動的に切り出しをおこなう仕組みはおそらく最後の目標となる だろう。鳴き声を聞いていて、人が聞いている時の時を考えると音圧と方向が要素に なるが、端末では向きを判定する事は出来ないので、音圧の操作になるのではないだ ろうか。

検索処理は、拡張性を考えると、サーバで行うことが良いと考えられる。音声データ は、現在のネットワーク帯域では、あまり大きなデータではなく、また利用頻度から 考えてもクライアントは、そのままのデータをサーバに送るモデルが良いのではない かと考えている。

サーバのWebAPIの仕様は、HTTPのマルチパートデータで5秒くらいのサウンドデータや 情報を受け取り、XMLで候補の鳥の名前や画像データのURLなどが返るようにするのが 良いかと思われる。 送られてきた音声データの検索結果が違っていた場合は、そのデータを標本に加える ために、ネットの投票などの仕組みで判定する方法も考えられる。 このような方法で、ユーザが増える事で、精度をあげる事も可能かもしれない。
サーバで処理するメリットとして、クライアントからサウンドデータと一緒にGPS から得られる緯度経度データを送ってもらって、分布をデータ化することができる という点もある。

鳥は季節にも分布が変わるので、日時についてもなんらかの情報になるのではないかと 思われる。 サーバ処理でのデメリットは、ネットワークが使えない場合や反応速度がある。 ネットワークが使えない場合は録音しておいて、オンラインになったときに 確認する方法もある。 音声的な識別だけではなく、緯度経度の情報や、またそれから推測できる地形的 特徴、および時期により、見る事が可能な鳥のリストの写真表示なども、スマートフォン のアプリできると面白いかもしれない。その場所の近くに川や池があるのかや、 海に近いのか田んぼの中なのか、もしくは町中なのかが判定できるWebAPIがあると 判定材料になるのだが。

鳴き声ブロックの取得

録音されたサウンドデータについてFFTを行い、1Kから10Kの範囲の一次ピークを 元に、レベルの高い部分のみ抜き出す。FFTはかなり荒めに行っても問題ないかと 考えられる。1-2秒以内にピークがある連続ブロックを取得すれば良さそうだ。 上のシジュウカラのデータでは0-3秒のブロックと、7-9秒のブロックが切り 出せるようなロジックの実装になると考える。 CPUに余裕があればリアルタイムにFFTを行うこともできるかもしれない。

標本との比較

送られてきた、サウンドデータをFFTを行い複数のピークの周波数や強さなどを あらかじめ用意された、標本のデータと比較して、類似したものを探し出す。 ある瞬間の周波数成分の類似度と、時系列での変化の類似度の二つにより比較で きるものと考えられる。 類似度は標本全体と比較して一番近いものを選び出すか、何からの分類や整列を 行った標本とする比較方法が考えられる。 このような処理をシミュレーションする為にニュージーランドのワイカト大学で 作られた、 WEKAという機械学習の ソフトウエア があるようだ。
機械学習からネットで見つけたのだが「フリーソフトでつくる音声認識システム」 という書籍を購入して勉強中している。こちらの目的は鳥の声なのだが、おおよそ 同じような終着点なので、参考になりそうだ。
2014/05にGISのセミナーで百瀬さんが講演をされていて、聴講させてもらったところ 大変面白く久しく休眠状態だったのだが、すこしやる気を出してみようと思った。
ファーストステップのサーバ側の処理系としてはPythonを使う事にした。これは 解析系が得意な言語であるとネットで調べた結果による。
Pythonの音声処理は「Pythonで音声信号処理」 が参考になりそうだ。

Jubatusという機械学習のフレームワークがあっ たのでFreeBSDビルドしてみた。

前に書いた本の前半を読んでみたが、数式は全く分からなかった。ただ概要はなんと なく理解できたので、実際のデータで試しながら理解していこうと思う。

iPhoneで録音したaiffを聞き取り鳥の鳴き声の部分をLPC指数をとり、学習データに してJubatusにつっこんで、テストデータを確認するとそれなりのスコアーが出る。 これをやってみて気がついたがヒヨドリとシジュウカラが分離しにくい。これは一点 でのLPC指数なので、似た傾向を示しているのではないだろうか。なんらか他の指標 を加える事で分離できるのではないだろうか。テスト対象をどのように抜き出すかも 考えなければならない。勘違いでした。

iPhoneで作ったアプリで、録音したファイルをYahoo! BOXにアップロードできるよう にしていたのだが、APIがクローズされることに別の方法を考えなければならない。 もともととりあえずとは思っていたのだが、現存するサウンド系や汎用のストレージ サービスでしっくりくる物がない。

iPhoneで録音されたデータを聞いてみると、後ろに聞いた事が鳴き声が入っていたり する。欲を言ったらきりがないが、iPhoneでの録音は簡易ではあるが比較的ちゃんと 録音されていると思う。

学習データを作っていて気がついたが、そもそも鳥を見ていなかったりして、本当に 正しいのか実は分からない事もある。似た鳴き声だったりするとあやまった学習データ になることも考えられる。あと根気のいる作業は苦手です。。。

と書きながら思ったのだが、テスト対象を抜き出す処理を先に考え、その処理で学習 データを抜き出して、ラベル付けすれば良いのかも。

wave1

sono1

データ

後半の印がある部分がコゲラの鳴き声でここを探し出す方法を考えてみる。ネットで いろいろ検索したところ音声区間認識には零交差(ゼロクロス)という、単位区間で 何回波形が0を通過したか調べる方法があるようだ。SPTKにもコマンドが用意されて いるので、試してみる。

$ cat chkspeech.sh
#!/bin/sh

SPTKBIN="../SPTK-3.7/bin"
SAMPLE=2205

sox $1 test.raw
NUM=`${SPTKBIN}/x2x/x2x +sf test.raw | ${SPTKBIN}/zcross/zcross -l ${SAMPLE} | $
{SPTKBIN}/dmp/dmp +f | sort -r -n +1 | head -1 | awk '{print $1}'`

TIME=`echo "scale=2; ${NUM} * ${SAMPLE} / 44100" | bc`

echo ${TIME} s
$ ./chkspeech.sh T1458538933.aiff
3.95 s

soxでSPTKが扱えるrawファイルに変換して、x2xコマンドでshort(2Byte)から float(4Byte)へデータを変換して、zcrossで2205サンプル(0.05秒)あたりのゼロクロスの 回数を調べて、一番回数が多い区間を調べて秒数を算出しています。 ざっくり試した感じこれだけだと50%くらいの精度だ。振幅などのほかの要素を考慮して 精度を上げないとちょっと厳しいが、とりあえずこれで試してみたい。

SPTKでlpc をとって mjograph でグラフ化してみた。

MacのCでのサウンド処理の「フォルマントから母音推定してリップシンクを目指してみる」 も参考になる。

こんな構成のシステムを考えている。SPTKで処理できるので、PythonではなくWebAPIが 作りやすい、Rubyを使う事にした。

近所の公園で簡単なiPhoneアプリを作って鳴き声を録音しているが、ヒヨドリ(ピー)、 コゲラ(ギー)、オナガ(ヒュー)、ムクドリ(ビヤビヤ)、シジュウカラ(ピィピィピ)、 カラス(カー)などが良く録音できるが、バン(ガァ)やカワセミ(キー)の鳴き声もたまに 録音できる。いろいろ録音して聞いてみると、シジュウカラなどはいろいろな鳴き方を しているようだ。特徴量をしっかり考えないと教師データを作るのが大変かも。

SPTKのframeコマンドが分かりにくかったので図にしてみた。

「音声情報を用いた夜行性鳥類の種識別」という論文があったので、これと同じように MFCC係数で機械学習する方法を試してみたい。

人の音声認識に関しての処理技術は参考になるが、これらはフォルマントの解析や 圧縮のための技術が多く、鳥の鳴き声を認識する場合すこし違ったアプローチが 必要な気がする。人においても話者認識などは同じ方向性になるのではないだろうか。 あまり話者認識の資料は見つからないのだが。

「音声情報を用いた夜行性鳥類の種識別」はバードリサーチさんと連携した 研究の ようだ。バードリサーチさんは「さえずりナビ」というデータベースを利用した 検索アプリを作られている。これは鳴き声ではなく、地域や時期をキーにして 一覧を表示するアプリのようだ。

「音声情報を用いた夜行性鳥類の種識別」の特徴量はMFCC一つとΔの組み合わせの ようだ。

5秒の録音データのゼロクロス最大値での特定はかなりいい感じのときがある。 このツグミの元の録音データ にはヒヨドリの鳴き声もあったが、ツグミの方が多かったようだ。 ただ偶然なので、ちゃんと検討した方が良いと思ってる。

jubatusに16次のmfccつっこんでRecommender試したら、カラスの鳴き声がちゃんと 分類されていた。ここのT68.aiffから 他のファイルが類似していると判断されました。

作っていたスクリプトなどをgithubに上げてみた。jubatusで音声や画像を扱う場合 には、事前に特徴量を数値化してつっこむ方法とバイナリをつっこんでpluginで処理 する方法があるようだ。(2016/04/01)

とりあえず一点のmfccで処理しているが、複数フレームでのmfccをとったりΔを 取るとか、mfccの次数を大きくするとかlpcなどをするなどの改善方法があると思う。 複数フレームについてはシジュウカラのピヨピヨのような鳴き声については有効だが どれくらいの間隔のフレームで処理するのが最適か考える必要がある。 あまり変化のある鳴き声の鳥は多くないような気がするので、有効な方法ではないかも しれない。

SIM無しNexusOneとiPhone3Gにアプリを入れて録音しているが、NexusOneは7Kくらいの テレフォンクオリティで切れているように見える。鳥の鳴き声は高域成分が多いので 認識精度に影響するかもしれない。

Ruby On RailsでAndroidからWAVファイルを受け取ってJubatusに問い合わせて、 レスポンスを返すように作ってみた。FreeBSD 10.2でRoRは一回インストールに失敗して 一度消して、pkgで入れ直した。/usr/localをすべて消したらpkg updateしても 元に戻らなくなって、portsからpkgをインストールしてどうにか元に戻った。

プロトタイプなのでSPTKのコマンドを実行して処理しているがSPTKをRubyのextにして 使うのが良い気がする。

対象を見つける処理でゼロクロスに移動平均を入れてみた。ノイズをちょっと減らせる と思うが、まだまだな感じだ。また5秒の録音データで一つだけピックアップするように しているが、実際は複数の鳴き声が入ってる事も多く、その処理も入れられたらなとか 思う。

ゼロクロスで取ったピークの0.4秒を切り取って確認しているが、普通に聞ける鳴き声 ではシジュウカラがちょっときつい感じではあるが、十分な気がする。うぐいすのフル の鳴き声などは数秒にもなるが、実際にそういう対象は多くないと思う。またそれだけ 長い時間を対象にすると、他の鳴き声も混じり、精度が悪くなるのであまり得策では 無いような気がしている。

一番良く聞くシジュウカラは一番手強い気がしている。鳴き声がヒヨドリに似てるし いろんなバリエーションで鳴いている。

カラスは比較的特徴のある鳴き声だが、ハシブトとハシボソを区別できるくらいの特徴量 を使って教師データを作れるのか課題なのもしれない。

スマホでの録音はゲインがあまりとれないので、雑音にまぎれて認識が難しい。 ただヘッドフォンで聞いてみると聞き分ける事は十分できるので、いろいろ考えて みるのが良いのかもしれない。自己相関を使った方法などもあるみたいだが、実際の データで試してもまったく特徴がとれない。

1フレームの16次のmfccをJubatusのrecommenderに突っ込んで確認しているが、カラス などは人間の識別よりも良く認識しているケースもあるが、4個の上位スコアーのデータ にまったく違うデータが含まれる事もある。

1ヶ月前くらいに自宅の庭にあまり 見なれない鳥 が遊びに来ていて、調べてみたところシロハラだったようだ。ゴミを減らす事と、 庭木の肥料にするためにコーヒーの出し殻や野菜の切れ端を庭に捨てているのだが、 それによりミミズさんが育っているので、狙われたのかもしれない。シロハラは冬鳥の ようなので、もうシベリアへ旅立ってしまったと思う。残念ながら鳴き声は録音できて ない。

アプリからの問い合わせはWebAPIで提供して、教師データの作成はpageベースが 良いような気がしている。

当面は鳴き始めの0.4秒から特徴量を拾う方法を考えたいと思っている。下の図の ヒヨドリやカラスが認識できることが目標。

少し前にハワイにいるウグイスは鳴き方が変わっているというニュースがあった。 このような変化を録音データを蓄積する事で、どのように変わっていったのかを分析 できるかもしれない。

処理はFreeBSDのサーバでおこなっているが、音の確認はMacでおこなっている。 サウンドファイルを入れたフォルダを開き、ファイルを選択してスペースキーで QuickLookで再生されて簡単に確認できる。またMac OS Xにはafplayというコマンドが 標準で入っているので、コマンドラインからも確認できる。

多くの鳥は鳴き始めがアクセントになっているような気がするが、ウグイスは後ろの方に アクセントがある。

uguisu

教師用のデータ作成のために天気が良い日は近くの公園に出かけているが、MA-1を着て 動きながら録音していると、ジッパーの金具の音が録音されてしまい、雑音になって しまってよくない。一番は動かずに録音するのが良いのだが、そういう訳にもいかない ので動くと高音の音がするような衣類は着用しないのが良い気がする。

ラズパイなどで、常時録音して、鳴き声部分をサーバにアップするようなモジュールを 作り、日本各地に設置できたら良いと思う。だれかお金出してくれる人いないかな?

ゼロクロスでピークを取るとシジュウカラ、ムクドリ、コゲラなどはおおよそ鳴声 になるのですが、カラスは完全に外れます。これはカラスの鳴声はピーク周波数1.2K で倍音成分が全くないためと考えられる。

graph_prob

同じデータをpitchで処理してみた。カラスは良い感じなのだが、今度はコゲラが 消えてしまっている。。。

Pitch

pitchコマンドのthresholdをデフォルトの0.3から0.2に変更したら出てきた。 pitchコマンドちょっと重いが、かなりいい感じに抽出できる。

toriclus

教師用のデータを0.4秒で切り取って作っているのだが、0.4秒だけ聞いているとわからなく なるものも多い。。。

鳴き方の違いには、雄や雌、時期、成長や幼鳥、地域などの要素があるのだと思う。


ソース置き場

リンク

日本鳥学会

バードリサーチ

日本野鳥の会

相関行列(距離行列)を用いた音声の分類・判別手法について 百瀬 浩

ききみみずきん for iPhone

森下功啓製作所さんの「鳴声で鳥を自動識別」

調査画像など

xeno-canto (海外の鳥の鳴き声データベース) オランダのナチュラリス生物多様性センターがスポンサーをしているようだ。

音声言語処理特論 山本一公




くまさんの庵トップへ
Copyright (C) 2012 Hiroki Mori All Rights Reserved.