3DSoundSimulatorを公開しました。
ダウンロードはこちらのページから3DSoundSimulator.zipをどうぞ。
コマンドライン前提というユーザーそっちのけな作りをしておりますが、ウィンドウから操作するGUIもオマケでつけておきましたのでそれでご容赦ください。
コマンドライン使うと「パイプで他のソフトと接続して標準入出力で操作する」みたいなことができる利点があるので、こういう仕組みになっております。
もろもろ、詳しくは付属の説明書に書いておきましたのでご一読ください。
以上です。
2010年9月19日日曜日
AudioInputStream3D更新
ライブラリAudioInputStream3Dを更新しました。
変更の内容は下記の通りです。
結果、「ほぼ」完全にJIS Z 8738に準拠するようになっている(はず)です。
「ほぼ」のほぼ部分は、
ではなく、
となっている所です。
元の式をさらに距離で割っているため、減衰量が元よりも大きくなっています。
また、前回のエントリで近々新しいソフトを出す、と言っていた件ですが、自分にとって都合の良い作り方をしすぎたため、説明がないと使い方がわからないソフトになってしまいました。
オマケの付属品や説明書を作るのに手間取っておりましたが、一応これで良いかな、という程度にはなりましたので、今日明日中には公開できるのではないかと思います。 (追. 公開しました。)
以上です。
変更の内容は下記の通りです。
- Airクラス、AirDiffuseDeformerクラスをJIS Z 8738にほぼ完全に準拠するように変更
結果、「ほぼ」完全にJIS Z 8738に準拠するようになっている(はず)です。
「ほぼ」のほぼ部分は、
(減衰後の音量) = (減衰前の音量) × exp(-0.1151 × (減衰係数) × (距離))
ではなく、
(減衰後の音量) = (減衰前の音量) × exp(-0.1151 × (減衰係数) × (距離)) ÷ (距離)
となっている所です。
元の式をさらに距離で割っているため、減衰量が元よりも大きくなっています。
また、前回のエントリで近々新しいソフトを出す、と言っていた件ですが、自分にとって都合の良い作り方をしすぎたため、説明がないと使い方がわからないソフトになってしまいました。
オマケの付属品や説明書を作るのに手間取っておりましたが、一応これで良いかな、という程度にはなりましたので、今日明日中には公開できるのではないかと思います。 (追. 公開しました。)
以上です。
2010年9月10日金曜日
2010年8月22日日曜日
バグのお知らせ
ライブラリAudioInputStream3Dの左チャンネルの畳み込みの計算で、パワースペクトルを位相にも使ってしまうバグがありました。
具体的には、SimulationStrategy.javaの212行目で引数の指定を間違っており、下記のとおり修正を行いました。
修正後コンパイル済みのものをコチラにアップロードしましたので、現在利用されている方は改めてダウンロードをお願いします。
また、3DAudio4MMDを利用されている方は以下の手順で修正が可能です
何らかの理由でバグ版を保存しておきたい場合はバックアップを取っておくと良いと思います。
以上、取り急ぎのご連絡でした。
具体的には、SimulationStrategy.javaの212行目で引数の指定を間違っており、下記のとおり修正を行いました。
208 hrtfConvolution.setCoefficient(
209 data.getRight().getPowerRatio(),
210 data.getRight().getPhaseDifference(),
211 data.getLeft().getPowerRatio(),
212 data.getLeft().getPowerRatio()); ←誤
208 hrtfConvolution.setCoefficient(
209 data.getRight().getPowerRatio(),
210 data.getRight().getPhaseDifference(),
211 data.getLeft().getPowerRatio(),
212 data.getLeft().getPhaseDifference()); ←正
修正後コンパイル済みのものをコチラにアップロードしましたので、現在利用されている方は改めてダウンロードをお願いします。
また、3DAudio4MMDを利用されている方は以下の手順で修正が可能です
- AudioInputStream3D.zipをダウンロードする
- 解凍して出てきた『AudioInputStream3D.jar』を『(プログラムをおいてあるフォルダ)\MMDのデータに基づいて立体音化するソフト\lib』へ移動する
何らかの理由でバグ版を保存しておきたい場合はバックアップを取っておくと良いと思います。
以上、取り急ぎのご連絡でした。
2010年8月7日土曜日
動画公開しました
前回のエントリに書いてからだいぶ遅れましたがとりあえず動画出しました。
MMDのデータを使ってただの音を立体音にするソフトを作った (ニコニコ動画)
サイトの方でソフトをダウンロードできるようにしましたので、興味のある方はコチラからどうぞ。
また、HRTF XMLの仕様にHRTFの水平角のプラスが右向きか左向きかを指定する項目を追加しています。
AudioInputStream3Dもそれに伴って必要となった変更を加え、デフォルトの窓関数を矩形窓からHann窓に変更しました。
8/9追.
【MikuMikuDance】3DAudio4MMDのデモ(ニコニコ動画)
もう使ってみてくれた方の動画が見つかりました。
どうもありがとうございました。
こんな速度でこういう動画作っちゃえるもんなのかと驚いています。恐ろしい世界だ…
MMDのデータを使ってただの音を立体音にするソフトを作った (ニコニコ動画)
サイトの方でソフトをダウンロードできるようにしましたので、興味のある方はコチラからどうぞ。
また、HRTF XMLの仕様にHRTFの水平角のプラスが右向きか左向きかを指定する項目を追加しています。
AudioInputStream3Dもそれに伴って必要となった変更を加え、デフォルトの窓関数を矩形窓からHann窓に変更しました。
8/9追.
【MikuMikuDance】3DAudio4MMDのデモ(ニコニコ動画)
もう使ってみてくれた方の動画が見つかりました。
どうもありがとうございました。
こんな速度でこういう動画作っちゃえるもんなのかと驚いています。恐ろしい世界だ…
2010年7月22日木曜日
予定は未定続き
ニコニコ動画で立体音響化するソフトを公開してる人がいて、すごいよー、なんつって知人友人に紹介していたら、「すこしは悔しがれ」とか「出遅れ残念」とか言われてしまいました。
「あれまあ、そういう感じなの?」というわけで、勢いでジャーッとそれっぽいのをデッチ上げることにしました。
月曜あたりに追っ付けで何かしら動画上げようかと思います。
「あれまあ、そういう感じなの?」というわけで、勢いでジャーッとそれっぽいのをデッチ上げることにしました。
月曜あたりに追っ付けで何かしら動画上げようかと思います。
2010年6月18日金曜日
予定は未定
Webカメラを使って頭の向きを計算すると、カックカクで本当にどうしようもない感じになってしまうので、とりあえず、PCの外側の情報を取得する系は放置しています。
で、せっかく作ったんだから、誰かしら人様にも使っていただきたい。
ですが、現状では「ちょっとやってみようか」にもならない気がします。
Java使えて、Java3D使えて、他人のソースコード読んで、という三重苦を乗り越えられるのはよほど時間の余裕がないと無理でしょうし、そんな余裕があったら普通もっと別のことしたくなるでしょう。
そもそもJavaがイヤだというのも十分に説得力がある話ですし。
ありえないね。
ということで、
優先順位は書いた順番通りです。
Javaのアプリケーションが最初なのは、とりあえず一番早くできるだろう事が期待できるから。
ActionScriptが先なのは
C++が後回しなのは
特に、Windowsの場合はDirectXとかDirectSoundとかDirectAudioとかXAudioとかXAudio2とか「ドレがどういうライブラリで最新のはドレなんだよ」みたいなモヤモヤ感があります。一度追いついてしまえば後は追いかけるだけなんだろうとは思うのですが、ちょっとしんどい。
ただし、 C++は計算速度と豊富なライブラリという圧倒的な強みがありますので、ちょっとした事で気変わりする可能性は大です。
で、せっかく作ったんだから、誰かしら人様にも使っていただきたい。
ですが、現状では「ちょっとやってみようか」にもならない気がします。
Java使えて、Java3D使えて、他人のソースコード読んで、という三重苦を乗り越えられるのはよほど時間の余裕がないと無理でしょうし、そんな余裕があったら普通もっと別のことしたくなるでしょう。
そもそもJavaがイヤだというのも十分に説得力がある話ですし。
ありえないね。
ということで、
- Javaでライブラリについて何も理解しなくても使えるアプリケーションを作る
- ActionScriptに移植
- C++に移植
優先順位は書いた順番通りです。
Javaのアプリケーションが最初なのは、とりあえず一番早くできるだろう事が期待できるから。
ActionScriptが先なのは
- OSによる環境の違いを考えないで良い
- 書き方がJavaに近い印象がある
- FlashDevelopという無料の開発環境が見つかった
C++が後回しなのは
- そもそも言語に不慣れ
- OSを意識する必要がある
特に、Windowsの場合はDirectXとかDirectSoundとかDirectAudioとかXAudioとかXAudio2とか「ドレがどういうライブラリで最新のはドレなんだよ」みたいなモヤモヤ感があります。一度追いついてしまえば後は追いかけるだけなんだろうとは思うのですが、ちょっとしんどい。
ただし、 C++は計算速度と豊富なライブラリという圧倒的な強みがありますので、ちょっとした事で気変わりする可能性は大です。
2010年6月8日火曜日
Google sitesでJava Appletは手間がかかりそう
立体音響のソフトをおいておくのにGoogleSiteを使っているのですが、せっかくJavaのライブラリを作ったんだからJavaAppletでデモすれば面白いかもと思いついたのですが、どうやらGoogleSitesでアプレットを使うにはGWT使わないとダメみたいです。(Java applet in Google sites - Google Sites Help)
これは大変そうだな…
音出せるんだろうか?
これは大変そうだな…
音出せるんだろうか?
2010年5月2日日曜日
PICkit3で「USBデバイスが正しく認識されません」が出た時の対処
立体音響とは何の関係もないのですが、ググってなかなか出てこなかったのでメモしておきます。
PICkit3を繋いで書き込みなどをしていると
というメッセージが出て、MPLABが
というエラーを出してPICkit経由の操作が全部ダメになるという謎の症状が出ました。
Windowsのエラーメッセージは哲学的で意味不明なので放っておくとして、ヘルプにはPKErr0038の対処法として「抜き差ししてReconnectを試せ」というような感じのことが書いてあったのですが、成功したりしなかったりで安定しません。
どうしようもないので逐一PCを再起動させたりして対処していたのですが、先ほど再起動も効かなくなり、本当にどうしようもなくなってしまったため、グーグル先生にお伺いをたててみました。
で、結局、Microchipのフォーラムによれば
ケーブルがダメって事もあるんですね。
PICkit3を繋いで書き込みなどをしていると
USBデバイスが正しく認識されません
このコンピュータに接続されているUSBデバイスの1つが正しく機能していないことがWindowsによって認識されていません
というメッセージが出て、MPLABが
PICkit 3 detected
Connecting to PICkit 3...
PK3Err0038: Failed to initialize PICkit 3.
というエラーを出してPICkit経由の操作が全部ダメになるという謎の症状が出ました。
Windowsのエラーメッセージは哲学的で意味不明なので放っておくとして、ヘルプにはPKErr0038の対処法として「抜き差ししてReconnectを試せ」というような感じのことが書いてあったのですが、成功したりしなかったりで安定しません。
どうしようもないので逐一PCを再起動させたりして対処していたのですが、先ほど再起動も効かなくなり、本当にどうしようもなくなってしまったため、グーグル先生にお伺いをたててみました。
で、結局、Microchipのフォーラムによれば
Try another USB cable - the bundled ones were reported to be a crap.(意訳:別のUSBケーブルを試してみてください。付属のケーブルはクソであると報告されています。)ということで、USBケーブルを取り替えて無事解決しました。
ケーブルがダメって事もあるんですね。
2010年4月2日金曜日
JCudaで頓挫
CUDAをJavaから呼び出すライブラリのJCudaを使ってみようと試していますが、
ドキュメントだと、cufftPlan1dが出す値は以下の6種類。
ソースも読んでみましたが、
CUDA のドキュメントを見てもcufftPlan1dはCUFFT_INVALID_VALUEは出さないみたいなので、この先を読んでいったところで泥沼っぽい…
cufftHandle plan = new cufftHandle();で
int planRet = JCufft.cufftPlan1d(plan, size, cufftType.CUFFT_Z2Z, 1);
System.out.println("planRet: " + cufftResult.stringFor(planRes) + "(" + planRet + ")");
planRet: CUFFT_INVALID_VALUE(4)というエラーが戻ってきています。
ドキュメントだと、cufftPlan1dが出す値は以下の6種類。
CUFFT_INVALID_VALUEは出てこないはずなのに…
Return Values ---- CUFFT_SETUP_FAILED CUFFT library failed to initialize. CUFFT_INVALID_SIZE The nx parameter is not a supported size. CUFFT_INVALID_TYPE The type parameter is not supported. CUFFT_ALLOC_FAILED Allocation of GPU resources for the plan failed. CUFFT_SUCCESS CUFFT successfully created the FFT plan. JCUFFT_INTERNAL_ERROR If an internal JCufft error occurred
ソースも読んでみましたが、
private static native int cufftPlan1dNative(cufftHandle plan, int nx, int type, int batch);というところであきらめました。
CUDA のドキュメントを見てもcufftPlan1dはCUFFT_INVALID_VALUEは出さないみたいなので、この先を読んでいったところで泥沼っぽい…
何か面白そうな特許
特許とかで怒られたら嫌なので、特許庁ホームページの初心者向け検索を使ってチョコチョコと特許をチェックしてみています。
といっても、どういうのがアウトでどういうのがセーフなのか全くわからないので、単純に興味本位でへーへー言いながら見てるだけなのですが。。。
(ぱっと見だと内容が同じに見えるのが複数あったりとかして基準がよく分からない…)
で、そういう中に、こういうのがありました。
どうもリンクはうまくいかないので、気になる人は特許公開2010-56589で検索してみてください。
といっても、どういうのがアウトでどういうのがセーフなのか全くわからないので、単純に興味本位でへーへー言いながら見てるだけなのですが。。。
(ぱっと見だと内容が同じに見えるのが複数あったりとかして基準がよく分からない…)
で、そういう中に、こういうのがありました。
ユーザの頭部の回転に応じて調整が必要になる処理を行う装置において、ユーザの頭部の回転を適切に検出して適切な調整を行えるようにする。のだそうです。ほしい。
どうもリンクはうまくいかないので、気になる人は特許公開2010-56589で検索してみてください。
2010年3月31日水曜日
途中経過
そろそろどこかにまとめておかないと後から書くのが面倒になりそうな量になってきたので書いておきます。
0. 現状
反射音の生成と顔向きの取得を作りました。
0.0 反射音の生成
反射音の生成にはレイトレーシングを使いました。
レイトレーシングの計算法にはラウンチング法とイメージング法の2種類があるみたいなので両方作ってみました。
(ラウンチング法とイメージング法がどのような計算法なのかは情報数理研究所のこのページが図があって分かりやすいと思います。)
いずれの方法を使っても、レイを1本計算するのにかかる時間よりも 1本のレイからデータを立体音響化する時間の方がはるかに長いため、レイの本数が少ないイメージング法の方が結果も良好で計算時間も短いという結果になりました。
また、計算結果を聞いた感想としては
反射音が無くても後方から聞こえてくる感じはできるのに、反射音を作っても前方はイマイチよく分からない位置から聞こえてきます。
仮に反射音に前方に音を持ってくる効果があったとして、『前方の音≒後ろっぽくないところから大きく聞こえて後ろからちょっとズレた音が小さく聞こえる』と『後方の音≒後ろから大きく聞こえて後ろっぽくないところからちょっとズレた音が小さく聞こえる』なのかな、とか思いますが、これはまだ試してません。
0.0.0 ラウンチング法
とりあえず3DCGとかで使われていていっぱいソースコードがあるラウンチング法から先に手をつけましたが、計算時間が長すぎてやってられませんでした。
(5度刻みで反射回数の上限が3回のレイを飛ばして4分25秒のデータをレンダリングした場合で19時間16分41秒)
0.0.0.0 ラウンチング法での計算の流れ
そこで、音源を点ではなく球にする事でこの問題を解消したのですが、その副作用で『当たったレイ』が沢山発生してしまいました。これ らの音量を100%にして単純に足し算してしまうと あっという間に音量が10,000%とかになって鼓膜が壊れそうなとんでもないことになってしまいます。
そこで、『当たった位置と音源の中心とのズレ×正規分布の微小面積』とする事で何本レイが当たっても音量が爆発してしまわないように調整しています。
正規分布の確率密度関数は(確率なので)面積が100%以上にならず、何本レイが当たったとしても爆音にはなりません。(分散の値は当たり判定に使う球の半径を、微小面積の幅はレイとレイの隙間の大きさを考えながら勘で決めました)
7/22追
防衛省のサイトにあった資料(PDF)によれば、これにはガウシアンビームモデルという名前があったみたいです。
0.0.0.1 ラウンチング法の何が問題か
音源と観測点を結ぶレイが一本に定まらないため、以下のような問題が出てきます。
0.0.1 イメージング法
ラウンチング法で計算時間が酷い事になったので、イメージング法も試しました。
ラウンチング法と同様の計算をした場合でも21分しかかからず、18時間も早くなりました。
これは、0.0で書いたように、レイを1本計算するのにかかる時間よりも1本のレイからデータを立体音響化する時間の方がはるかに長いのが原因です。
(イメージング法は反射面が増えると計算量が一気に増えるらしいのですが、今回は部屋を単純な直方体にしているので問題になりませんでした)
0.0.1.0 イメージング法の計算の流れ
顔方向を取得し、Java3Dのカメラ方向を制御するプログラムを作りました。
頭にWebカメラをつけてNyARToolkitを使う方法と画像認識を使う方法の2種類を試した結果、頭を自由に動かせる画像認識を使うことにしました。
0.1.0 NyARToolkitを使って顔の向きを取得する
手やヒモを使って頭にWebカメラを固定して、画面に表示したマーカーの姿勢をNyARToolkitを使って取得し、カメラの向きを設定します。
ライブラリにJava3D版が付属していたので、プログラムを作るのは楽でした。
0.1.0.0 NyARToolkitの問題点
画像認識ではOpenCVなどのライブラリが使えるかと思っていたのですが、Javaから呼び出す良い方法が見つからなかったので、画像処理部分も手前味噌で作りました。
JavaでWebカメラの画像を取得する方法についてはにゃんたこす!徒然草のUSBカメラで画像処理(Java)を参考にしました。
MAlibアプリケーションのgnodempaで使われている肌色抽出部分を参考にして顔認識を作ってみましたが、背景の木製品を誤認識してしまってうまくいきませんでした。
対策のため、黒いニット帽を用意して黒い部分(頭)を抽出するようにしています。(確認しやすいように表示では白黒反転しています)
黒色フィルタを通して残った部分の中で面積が一番大きいものを頭ということにして、その中心を位置、中心と重心の差を向きにしています。
0.1.1.0 画像認識の問題点
予定は未定
1.0 GPGPUを使えないか
玄人思考の安いグラボがCUDAに対応してたので、JavaからCUDAを呼び出すJCudaを試そうと思っています。
FFTにはJTransformsを使っているのですが、ベンチマークを見る限りだとJCufftの方が速いっぽいですし、画像認識部分をどうにかCUDAで処理するとかすれば何とかなるかもしれないような気がしないでもない…
X. その他
前回のエントリを読んでいて、Java3DのConeSoundへの対応がほったらかしになってることに気がつきました。
早めにやっとこう。
0. 現状
反射音の生成と顔向きの取得を作りました。
0.0 反射音の生成
反射音の生成にはレイトレーシングを使いました。
レイトレーシングの計算法にはラウンチング法とイメージング法の2種類があるみたいなので両方作ってみました。
(ラウンチング法とイメージング法がどのような計算法なのかは情報数理研究所のこのページが図があって分かりやすいと思います。)
いずれの方法を使っても、レイを1本計算するのにかかる時間よりも 1本のレイからデータを立体音響化する時間の方がはるかに長いため、レイの本数が少ないイメージング法の方が結果も良好で計算時間も短いという結果になりました。
また、計算結果を聞いた感想としては
- 思っていたよりも存在感は出ない
- 狭い空間だとエコーっぽさも無いため、徒労感が非常に強い
- 前から聞こえてくる感じはやや強い気がしたが、十分に時間のたった今改めて聞きなおすとただの希望的観測だった気もする
反射音が無くても後方から聞こえてくる感じはできるのに、反射音を作っても前方はイマイチよく分からない位置から聞こえてきます。
仮に反射音に前方に音を持ってくる効果があったとして、『前方の音≒後ろっぽくないところから大きく聞こえて後ろからちょっとズレた音が小さく聞こえる』と『後方の音≒後ろから大きく聞こえて後ろっぽくないところからちょっとズレた音が小さく聞こえる』なのかな、とか思いますが、これはまだ試してません。
0.0.0 ラウンチング法
とりあえず3DCGとかで使われていていっぱいソースコードがあるラウンチング法から先に手をつけましたが、計算時間が長すぎてやってられませんでした。
(5度刻みで反射回数の上限が3回のレイを飛ばして4分25秒のデータをレンダリングした場合で19時間16分41秒)
0.0.0.0 ラウンチング法での計算の流れ
- 観測点を中心にして放射状にレイを(たくさん)飛ばす
- 音源の位置を中心にした球とレイの当たり判定を取る
- 当たったレイの『飛ばした方向』『反射回数』『長さ』『当たった位置と音源の中心とのズレ』を覚えておく
- 各種パラメータを設定する
- 『飛ばした方向』を聞こえる方向にする
- 『長さ』だけ空気減衰させる
- 『長さ / 音速』だけ音を遅らせる
- 『反射率の反射回数乗 × 当たった位置と音源の中心とのズレ × 正規分布の微小面積』を音量にする
- データを立体音響化して足し合わせる
- アニメーションが終わるまで繰り返す
そこで、音源を点ではなく球にする事でこの問題を解消したのですが、その副作用で『当たったレイ』が沢山発生してしまいました。これ らの音量を100%にして単純に足し算してしまうと あっという間に音量が10,000%とかになって鼓膜が壊れそうなとんでもないことになってしまいます。
そこで、『当たった位置と音源の中心とのズレ×正規分布の微小面積』とする事で何本レイが当たっても音量が爆発してしまわないように調整しています。
正規分布の確率密度関数は(確率なので)面積が100%以上にならず、何本レイが当たったとしても爆音にはなりません。(分散の値は当たり判定に使う球の半径を、微小面積の幅はレイとレイの隙間の大きさを考えながら勘で決めました)
7/22追
防衛省のサイトにあった資料(PDF)によれば、これにはガウシアンビームモデルという名前があったみたいです。
0.0.0.1 ラウンチング法の何が問題か
音源と観測点を結ぶレイが一本に定まらないため、以下のような問題が出てきます。
- 足し合わせても爆音にならないように音量を調整してあげないといけない
- 調整に確率密度関数を使うと点の位置が分かっているのに『点がそこにある確率』で調整してるような感じで、何か無駄な計算してる気になってくる
- 当たったレイの本数の回数だけ立体音響化の計算をするので、ものすごい時間がかかる
0.0.1 イメージング法
ラウンチング法で計算時間が酷い事になったので、イメージング法も試しました。
ラウンチング法と同様の計算をした場合でも21分しかかからず、18時間も早くなりました。
これは、0.0で書いたように、レイを1本計算するのにかかる時間よりも1本のレイからデータを立体音響化する時間の方がはるかに長いのが原因です。
(イメージング法は反射面が増えると計算量が一気に増えるらしいのですが、今回は部屋を単純な直方体にしているので問題になりませんでした)
0.0.1.0 イメージング法の計算の流れ
- 音源と観測点を結ぶ直線の『方向』『反射回数』『長さ』を覚えておく
- ラウンチング法と同様にパラメータを設定する
- データを立体音響化して足し合わせる
- 壁に反射した音源の位置を計算して↑を計算する
- 設定した反射回数の上限に至るまで↑を繰り返す
- アニメーションが終わるまで繰り返す
- イメージング法の方が良い
- 反射を計算する環境が複雑になるとラウンチング法が逆転する可能性がある
- リアルタイムで計算するのは今のところ無理
- 早かったイメージング法でも4分の計算に21分
- 大体5倍の時間がかかっている
顔方向を取得し、Java3Dのカメラ方向を制御するプログラムを作りました。
頭にWebカメラをつけてNyARToolkitを使う方法と画像認識を使う方法の2種類を試した結果、頭を自由に動かせる画像認識を使うことにしました。
0.1.0 NyARToolkitを使って顔の向きを取得する
手やヒモを使って頭にWebカメラを固定して、画面に表示したマーカーの姿勢をNyARToolkitを使って取得し、カメラの向きを設定します。
ライブラリにJava3D版が付属していたので、プログラムを作るのは楽でした。
0.1.0.0 NyARToolkitの問題点
- 常にカメラがマーカーをとっている必要がある
- 頭の動きが制限されてしまって意外と不便
- 頭の周りを囲うように複数のマーカーを配置すれば良い?
- 認識がちょっとシビア
- カメラが静止していてもカタカタ揺れたりする
- 設定(調整)の問題かもしれないが、よく分からない
画像認識ではOpenCVなどのライブラリが使えるかと思っていたのですが、Javaから呼び出す良い方法が見つからなかったので、画像処理部分も手前味噌で作りました。
JavaでWebカメラの画像を取得する方法についてはにゃんたこす!徒然草のUSBカメラで画像処理(Java)を参考にしました。
MAlibアプリケーションのgnodempaで使われている肌色抽出部分を参考にして顔認識を作ってみましたが、背景の木製品を誤認識してしまってうまくいきませんでした。
対策のため、黒いニット帽を用意して黒い部分(頭)を抽出するようにしています。(確認しやすいように表示では白黒反転しています)
黒色フィルタを通して残った部分の中で面積が一番大きいものを頭ということにして、その中心を位置、中心と重心の差を向きにしています。
0.1.1.0 画像認識の問題点
- 静止していてもカタカタ揺れる
- 現象的にはARToolkitと似たような症状
- 蛍光灯のチカチカで閾値付近の色が安定してないのかも
- この動画を見るとカルマンフィルタというのを使えればよさそうな気がする
- カルマンフィルタの理屈が難しい
- ARToolkitはこの用途には向いてない気がした
- 常にマーカーの方向を向いているような用途向き(当たり前か…)
- Java3Dに対応させておいて良かった
- NyARToolkitから画像認識に切り替えるのが楽だった
- 重い
- 『Java3D + 画像認識』、『Java3D + 立体音響化』は処理落ちせずに動くが、『Java3D + 画像認識 + 立体音響化』はカクカクでしんどい
- サーバーとクライアントを作って複数PCで負荷を分散する?
- GPGPUやってみる?
- 画像認識の時間間隔を短くするとリアルに聞こえる
- その分音がガクガクになってるので、ちゃんとした音だったらどうなのか気になる
- レイテンシがすごく大事な気がする
- 人にこの感覚を伝えるのは難しそう
予定は未定
1.0 GPGPUを使えないか
玄人思考の安いグラボがCUDAに対応してたので、JavaからCUDAを呼び出すJCudaを試そうと思っています。
FFTにはJTransformsを使っているのですが、ベンチマークを見る限りだとJCufftの方が速いっぽいですし、画像認識部分をどうにかCUDAで処理するとかすれば何とかなるかもしれないような気がしないでもない…
X. その他
前回のエントリを読んでいて、Java3DのConeSoundへの対応がほったらかしになってることに気がつきました。
早めにやっとこう。
2010年1月17日日曜日
予定や方針
今後の予定・方針についての箇条書き。
0.現状
Java3Dへの対応はほぼ完了。
あとはConeSound(円錐状に音が広がるタイプの音源)への対応くらい。
また、FPSっぽくカメラを動かすBehaviorも作った。
あとは何らかの方法で顔の向きを取得してカメラの動きに反映させれば、音響空間をリスナーの動きに追従させることができる…はず。
1.顔の向きを取得したい
頭部伝達関数と音像定位をめぐる諸問題(外部PDF)によれば
実現するためには受聴者の頭部運動なるものを入力する仕組みを作る必要があります。
できるかぎり ダウンロードすればとりあえず試せる状態 を維持したいので、特別な機器は不要にしたいと考えていますが、マウスとキーボードで頭の動きを入力するのは恐らく不可能ですので、
ARToolkitとWiiリモコンはどちらもディスプレイ(マーカー類)を頂点にした円錐状の運動を得意としています。
これは何かを中心にして常にそっちを向きながら動く場合に有効なのですが、立体音響では逆にどれくらいそっぽ向いているかのほうが大事なので、画像認識が有利かな、と思います。
しかし、画像認識は経験がまったくないのと、使えそうなライブラリも見つからないという状態ですので、後回しにしておきます。
Wiiリモコンは以前JavaScriptで遊んだ経験から、わりと正確に傾きを取れることがわかっているのですが、今現在手元に現物がないのでこれも後回し。
とりあえず、ARToolkit(NyARToolkit)はJava版がある上にJava3Dもサポートしているので、まずはARToolkitから試していこうかと考えています。
2. サーバーとクライアント作りたい
レンダリング、画像処理、フーリエ変換を使った畳み込み、という ただでさえ重たい3つの処理を同時に素早くやらないといけません。
もはやPC1台で処理する量ではないのかもしれないと思えてきましたので、立体音響処理用のサーバーを作って並列っぽい事をしてみようかと思っています。
できるかどうかはわかりませんが、やってみたい…作るとしたら、JMFでRTPを使った送受信ができるようなので、それを使おうかと考えています。
X. 方針
今後の方針として、ゴマカシっぽくてもいいから早く計算する方向と、とにかくリアルに作る方向の2つの方向に分岐させていくつもりです。
一人でできる量じゃない気もしますが。
0.現状
Java3Dへの対応はほぼ完了。
あとはConeSound(円錐状に音が広がるタイプの音源)への対応くらい。
また、FPSっぽくカメラを動かすBehaviorも作った。
あとは何らかの方法で顔の向きを取得してカメラの動きに反映させれば、音響空間をリスナーの動きに追従させることができる…はず。
1.顔の向きを取得したい
頭部伝達関数と音像定位をめぐる諸問題(外部PDF)によれば
『古くから知られているように、受聴者の頭部運動に追従させた動的バイノーラル信号を用いると、再生される立体音像空間の様相は大きく変わる。すなわち、(…中略…)再生立体音像空間の歪は激減する。』らしいので、これを試したいと思っています。
実現するためには受聴者の頭部運動なるものを入力する仕組みを作る必要があります。
できるかぎり ダウンロードすればとりあえず試せる状態 を維持したいので、特別な機器は不要にしたいと考えていますが、マウスとキーボードで頭の動きを入力するのは恐らく不可能ですので、
- Webカメラ(ARToolkit, NyARToolkit)
- Webカメラ(画像認識)
- Wiiリモコン
ARToolkitとWiiリモコンはどちらもディスプレイ(マーカー類)を頂点にした円錐状の運動を得意としています。
これは何かを中心にして常にそっちを向きながら動く場合に有効なのですが、立体音響では逆にどれくらいそっぽ向いているかのほうが大事なので、画像認識が有利かな、と思います。
しかし、画像認識は経験がまったくないのと、使えそうなライブラリも見つからないという状態ですので、後回しにしておきます。
Wiiリモコンは以前JavaScriptで遊んだ経験から、わりと正確に傾きを取れることがわかっているのですが、今現在手元に現物がないのでこれも後回し。
とりあえず、ARToolkit(NyARToolkit)はJava版がある上にJava3Dもサポートしているので、まずはARToolkitから試していこうかと考えています。
2. サーバーとクライアント作りたい
レンダリング、画像処理、フーリエ変換を使った畳み込み、という ただでさえ重たい3つの処理を同時に素早くやらないといけません。
もはやPC1台で処理する量ではないのかもしれないと思えてきましたので、立体音響処理用のサーバーを作って並列っぽい事をしてみようかと思っています。
できるかどうかはわかりませんが、やってみたい…作るとしたら、JMFでRTPを使った送受信ができるようなので、それを使おうかと考えています。
X. 方針
今後の方針として、ゴマカシっぽくてもいいから早く計算する方向と、とにかくリアルに作る方向の2つの方向に分岐させていくつもりです。
一人でできる量じゃない気もしますが。
登録:
投稿 (Atom)