はじめに
みなさんは仕事以外でどんな開発をしているのでしょうか?気になります。
自分は仕事でPHPを実装することが多いので、それ以外の言語の習得を兼ねて空き時間でコツコツっとiPhoneアプリを作ってました。
今回はそんなswiftでアプリをつくった話です。(技術的要素はありません。)
つくったアプリ
どんなアプリを作ったかというと日本語をしゃべるアプリです。
簡単にいえば「あ」「い」「う」「え」「お」... とそれぞれボタンにして「こんにちは」とか「おやすみなさい」とか押された文字の音が発音させ、選択した言葉をしゃべらせることができるアプリです。
それにもう少し機能をいれて、自分で録音した音を元にその音でしゃべらせるようにしてみました。
なんか学生の課題みたいですね。
学校でこんな課題が出たらみんなどんな実装をするのだろうか。気になります。
どんなアプローチで作ったか
そもそもswiftで音声ファイル再生したことはあります!(コピペで!)ってレベルからなので
ちょっとした冒険みたいな気持ちで開発していました。
プロトタイプを作って、検証し、時にはあきらめて別の方法を考え
そんなこんなで以下のプロトタイプをつくりました。
1.「あ~ん」の結合された音声ファイルをseekして1音づつ発音させる
2.「あ~ん」の結合された音声ファイルを1音づつ分割して発音させる
3.「あ~ん」を1音ずつ録音して1音づつ発音させる
プロトタイプの結果
1.「あ~ん」の結合された音声ファイルをseekして1音づつ発音させる
この実装、録音は簡単なのですが、seekさせる言葉のタイミングが難しい
1秒間隔で1音1音録音していけばそれっぽく機能するのですが、無音のタイミングが微妙に出て
それを調整したり、録音しくじって取り直しとかめんどくさいので却下。
「めんどくさい」をフーリエ変換などで判定できたら良いのですがプロトでは無理っぽいので断念。
これを作って、再生はどうにかなるが、録音する方が大変だぞと気づきました。
2.「あ~ん」の結合された音声ファイルを1音づつ分割して発音させる
音声の分割はffmpegでできそう&声紋分析はjavaのコードがあったのでそれを利用
Hatada's Home Page
波形を表示するアルゴリズムから無音状態を検知し、その秒数から次の無音までの時間を算出して、ffmpegでスライスしていく方法です。(ある意味 ChangeFinder)
なんか行けそうな気がする!
iPhoneのボイスメモで録音しアプリケーション拡張機能でアップロード!
サーバー側で解析&分割!
そしてアプリでダウンロードォ!
勢いよく動くところまで作ったのですが、ちょっと雑音が入ると正しく判定できずチューニングに苦戦。
音がずれた時の調整がめんどくさいので却下。
あと、音を解析する際にスピーカーから音が出ていたのですが、サーバー側でバッチ処理を動かす際にサウンドボードがなくjavaxのexceptionが発生。
必要なインターフェースだけスタブ作って回避したのですが、もしサウンドボードが刺さっていたら誰もいないさくらのサーバールームから「あいうえお。。。」って人の声が聞こえてくるというホラーな状態になっていたかも。
3.「あ~ん」をそれぞれ別々に録音して1音づつ発音させる
当初、マイクからリアルタイムで波形を分析するところと、UIでよいのが思い浮かばなかったため最後になってました。
が、1,2を踏んでなんとなく勘所もできていたこともあり、波形の開始と終了が判断できれば細かな制御は人間の力を使いカバーすることで完成。
UIと合わせてこれが一番しっくり来たので採用。
それでできたアプリがこちらです。
https://itunes.apple.com/us/app/bokatsuku/id1158648715?mt=8
siriと会話させようと思ったのですが、このアプリで出した音声はsiriではうまく解析できないようです。
苦戦したこと&やり残したこと
swift2.x~3のバージョンが変わるなかコードが動かないことがちょくちょくあり、そこに結構コストがかかった。
後半はswift2~3 のマイグレーションの情報が増えたのでだいぶ楽になりました。
普段業務で行っている開発は多かれ少なかれ近しい課題にぶつかっている人たちがいて、情報もある程度ありますが、こういった類の情報は知識を持っている一部の人が情報を残しているため躓くとハードルが急に高くなるきがしました。
あと、フーリエ変換とかで解析もやってみたかった。
無音のトリムと雑音除去フィルターを入れたかった。
かんそう
そのうち音声もAIとかで本人の再現とかできるようになっちゃうと思いますがもしかしたらベースの50音があると、リアリティーが上がるかもという思いで作りました。
ちなみに姪っ子に使ってもらったときは、あ行は言ってくれたのですが、か行の途中で「パズドラやりたい」と超序盤で敗北。
50音言ってもらうって結構むずかしいもんです。
ぜひ @yamamotojunta さんにはアイカツのキャラボイスを作ってもらいたいですね。
さいごに
UIの相談に乗ってくれた渡辺yさん、吉井hさんキャラを使わせてくれたいのまたさんに感謝。
明日はいよいよラストの @sugat1679 さん。クリスマスにタイガーアッパーカットだぁ!