喋る同人誌が作りたい!③ プロトタイプ編
同人誌を喋らせる方法として,スマホのカメラと画像処理で何とかしてページめくりを検出しようという話でした.前々回で技術的な壁を確認し,前回はそれをリアルタイムに処理するためにOpenCV(ネイティブライブラリ)を取り込みました.
今回は実際の本に実装してみて使用感を見てみます.
取り敢えず結論から
前回
材料をダイソーで買ってきました.加工に必要な所要時間は5分/冊ですが,100冊ぐらいまとめて工夫してやれば1分/冊ぐらいでできる程度です.
- 厚紙(黒)
- クッションテープ
- マジックテープ
- 穴あけポンチ(Φ1mm,Φ0.8mm)
- 同人誌の素
まずベースの同人誌が必要です.勿体ないので適当にコピー本を作ります.そして背面が弱いので厚紙で補強します.何となくプレスしました.
そして穴をあけていきます.適当に買ってきた厚紙が厚すぎて大変でした…最後にレンズ代わりのグルーボンドを流します.一枚づつ空けるのは大変なので,量産する場合はレーザーカッターなんかを借りて焼きヌクのが良さそうです.
レンズと穴に最低でも10mm程度距離がないと視野に収まらないのでクッションテープで台を作ります.
カメラからはこんな景色が見えます.この奥に任意個の輝点が表示されそれを読み取ります.
最後にスマートフォンを取り付けます.マジックテープで着脱できるバンド付けたのですがデバッグのためにくるくる回していると,マジックテープが硬くて固定が甘くなり,ずれてきたのでテープで留めちゃう.(一応マジックテープでもいけました)やっぱりゴムバンドで巻いて,くっつける部分だけマジックテープ張っておくべきですね.
輝点検出のアルゴリズムはOpenCV編とほとんど同じです.ただ,時間方向にもチラつきが出るのでこっちも平滑化します.入力が離散値なのでNフレームC連続していたらCを出力するというアルゴリズムです.
// 記憶 mBufferForSmooth.add(value); while(mBufferForSmooth.size() > BUFFER_SIZE) mBufferForSmooth.remove(0); // 判断 if(mBufferForSmooth.size() == BUFFER_SIZE) { int pre = mBufferForSmooth.get(0); boolean isSame = true; for(Integer i :mBufferForSmooth) { if (pre != i) { isSame = false; break; } } return = isSame? pre : -1; }else{return -1;}
繰り返しになりますが,こちらの動画のようになりました.コピー用紙なので穴がずれないように手を添えています.最低穴の数はページ数/2あればよいので,ページ数が少ないなら穴を大きくしたり離して配置した方がコスト面でも精度面でも良さそうです.
あと分かっていたことですが,今回使った同人誌,私が1年以上前に描いたものなんですが,実に迫力がない.画力も残念ですが私には到底盛り上がりがあるというか扇情的というか…はいそういうのが描けないので.でもやっぱりそっちの方が調声のし甲斐もあるしいいと思うんですよ.
誰かえっちな先生,技術提供しますんで一緒にやってくれませんでしょうか?
今後の予定はUIの作成,雑音除去の改善,同人誌本体も描かなきゃ…(´・ω・`)あとできれば音声データもハードコーディングじゃなくて,専用サーバー,もしくはYoutubeなどの共有サイトからインポートできるようにしたいと思っています.そうすれば,新しい同人誌にもアプリが使いまわせるだけでなく,読者が自分なりの調声をしてみてシェアする遊びができるので.
…ってコミケまであと3ヵ月切ってる…orz(まだ当落発表すらされてないのに本当参りますよ…)