春休みが終わりそうで泣いていますドラです。ヤフーのハッカソンOpen Hack U 2020 Online Vol.4に
JPHACKSの時と同じチーム(学科同期3人)で334jstとして出場しました。ありがたいことに発表会では最優秀賞をいただきました。やったね!
今回はその時やったことについて書いていきます。
何を作ったの??
プレゼンペースメーカーというプレゼンするときに話す速度を可視化してくれたりプレゼン練習するときにその速さを示してくれるツールを作成しました。
要素技術はPyQt5、PyAudio、MeCabです。
↓音声認識の動画
↓テキストのスピード支援の動画
プレゼンペースメーカーを支える技術
音声認識について
神記事を読んでもらうのが一番早い気もしますが、
音声からMFCC(メル周波数ケプストラム)という特徴量を計算してその変化率を用いて母音の検出を行い、単位時間ごとの母音数をカウントしてそれを話す速度
と定義することでその値をグラフに描画しています。
ペースの提示について
入力された原稿に対しMeCabを用いて形態素解析を行い、形態素ごとに時間を割り当てた上で時間に対応した空白を設定し描画しています。
また、三角点はその時間に対応して動きます(たくさんの表示バグをかかえていますすみません)。
技術選定パート
まず何で作ろう、という話になり当初は話す速度の可視化にgoogle音声認識に投げ込んで帰ってきたテキストの文字数を数えるとかを考えていたので
とりあえずwebで作るかみたいな話になりました。しかしながらそれだとapiにお金がかかること(web speech apiならお金かからないっぽい)、そして詳しい文字情報は話す速度認識には実は必要なく(話しているかどうかがわかればいい)自前で音声いじったほうが
その後の拡張性につながる
ことから自前で実装することになりました。
やり方のサーベイをする中で神記事をチームメンバーが見つけてくれて音声可視化パートの実装が
決まっていきました。またその中でプレゼンをする環境について考えてみたところwebアプリケーションである必要はない(プレゼンをするときはpcがあるので)ことに気づき、
その上で音声をいじるうえではライブラリの充実しているpythonが良いと考えたのでpythonを用いてデスクトップアプリケーションとして製作することにしました(ちなみにguiアプリケーション開発経験者は無でしたおい)。
使用環境等をしっかり考えたうえで最適な実装を選択することはとても大切だなと感じました。
実際の開発
前回同様基本的にdiscordで会話しつつ開発を進めていきました。
webアプリケーションのようにフロントエンドバックエンドが別れているわけでもないので開発を分業するのが結構大変でした。
結果的には僕は全体のコンポーネントの管理(親クラスの設計)とグラフの可視化、テキスト表示機能なんかを担当した気がします。
できるだけインスタンスの親子関係を大切にするようにコードを書いていったつもりですが、開発言語pythonの関係上子の間で変数共有したいときに一回
親インスタンス経由で渡したりするはめになりどうすればよかったんだろうと思っています。(webフロントだとvuexとかreduxのような状態管理の仕組みが整っていると思いますがpythonだと
ない気がしました、知ってる方いたら教えてください!)
苦労した点
開発環境による差異
GUIアプリケーションを作成したのは初めてだったんですがOSによって適用されるデフォルトフォントが違ったりだとか各個人のディスプレイの解像度が異なるせいで見え方が異なるとかで 再現性の確保が大変でした(結局OS間の差異は埋められず現状Ubuntu番だけ公開しています...)。webだと結構そこらへんがやりやすかったりするのでこういう問題に初めて直面してなるほどなあって言ってました。
メンバーの生活習慣がバラバラ
多分前回よりも直接同時作業している時間がかなり少なかった気がします。非同期的に進捗を上げていく上で現在の進捗確認や詰まっているところをわかりやすく伝えることなどは とても大切だと感じ、意識していました。
QThread乱立させたら重くなった
PyQt5にはスレッドを分けるQThreadというものがあるのですが、それの数を増やしたら割と簡単に重くなりました(あたりまえ)。
同等の処理をQTimerという時間管理をする仕組みを用いることで解決しました。同じことをする上でも実装方法を調べ、考え相談するのはとても大切ですね(このときQTimerなるものの存在を知らなかった)。
今後の課題
ペースの提示回りのバグ
バグの原因が特定できていないのですががんばります。
OS間など環境間の差異をなくす
フォント埋め込んだりできるんですかね...?
感想
- 自分一人じゃできないことができるという意味でチームハッカソンはやっぱ楽しいなと思いました。また、例の記事を読み解く上でチーム内でワイワイしつつ理解していったのですがとても楽しかったです。リンク
- サーベイしてる段階で話題に上がったのですがNHK技研R&Dの資料が普通に面白いのでおすすめです。例
- クソ実装をしようとしてるときは一度誰かに相談するのは大事だと思いました(チームメイトが良い改善をしてくれた)。
- マルチOSアプリケーション開発普通に難しいですね。