Jupyter notebookやGoogle Colab上のグラフを音声化するためのライブラリを公開した
何を作ったの?
利用例にあるように、グラフの縦軸をピッチ、横軸を左右のパンで表現するように変換してくれる。複数の値に関しては、同時に再生したり、順番に再生したり、色々オプションも指定できるようにしている。
notebook上で
!pip install audio-plot
すれば、すぐに使えるようになるはず。
自分で試してみるならこちらから。 Google Colab
なんで作ったの?
目が見えづらくなったとしても、色々と環境を整えれば、プログラミング自体は(人によっては)十分に出来そうだということが、たくさんの先駆者の方々のおかげで分かってきている。
一方、データ分析に関して言えば、データをグラフ等で可視化する部分だったり、まだまだ視覚に頼らざる得ない部分が多い。だが、データ分析の本質的な部分*1というか、帰納的なプロセスに関しては、従来の演繹的なプログラミング作業だったり、ケアレスミス防止など視覚の優位性が必要とされる作業に比べて、比較的視覚に頼らなくても、(人によっては)得意としていける分野なんじゃないかなと思ってる。
ソフトウェア2.0とか、AI開発の多様性とか、色々根底にあるけれど、うまく整理しきれてないので、そのうちまとまったら記事にしてみようと思う。
さいごに
GithubのStarとか機能要望等のフィードバックもらえたら、とてもとても嬉しい
新コロ対策の手で顔を触ったら通知するツール
概要
仕事中などに、結構無意識に顔をペタペタ触ってしまう癖がある。この度の新型コロナ禍において、結構リスキーな行動だということもあり、対策するためのツールを作ってた(拡大時期の3月頃)。
PCのカメラ画像から、顔認識及び手認識結果を得て、顔を触っている場合に、通知を出す。これで、徐々に無意識の悪癖を直していければ嬉しい。
こちらにデプロイしてあるので、簡単に試せる。 face-touch-alert.netlify.com
顔を触ってしまったときの通知はこんな感じ。
仕組み
プログラムはこちら。 github.com
利用した各JSライブラリ
基本動作は、setIntervalで100msec毎に、顔と手の認識を行い、顔の範囲内に手が近づいていたら、顔を触ったと判定して、push通知を行うだけ。
既知の問題としては、違うタブやアプリに切り替えたときに、setIntervalだと、バックグラウンド動作が不定になり、顔を触ったタイミングを逃してしまうことがある。こういうときに、web workerを使うのかと思って色々調べてみたものの、web workerからDOMにアクセスしたりする方法が分からず、そのまま放置してしまった...が、書いてて思ったのだが、認識位置等の表示を無視して、通知を出すだけなら、DOMへのアクセス関係なく出来たかもしれない。
単語ベクトルを2値ベクトル化
背景
以前、アトラクタ的なダイナミクスをもったニューラルネットワークで、単語の連想記憶を試した。 blog.hassaku-labs.com
この時点では、単語ベクトルをニューラルネットワークに入力する際、単にランダム行列射影を通して、次元数の調整をしただけで、連想記憶するベクトル情報自体は、連続値分散表現パターンのままであった。
しかしながら、シグモイド的な発火パターンを特徴としたニューラルネットワークの特性上、2値ベクトルの方が好ましい。
そこで、既存単語ベクトルを2値化する仕組みを探していたところ、手軽に出来そうな方法を見つけたので記録しておく。
word2bitsによる単語ベクトルの2値化
用いたのはword2bitsという手法。元々は、量子化によるデータのサイズ削減を目的としたものだが、類似度タスクでは性能が向上したとのことなので、連想記憶用の表現としても適していると思われる。
word2bitsについて、日本語で参考になりそうな記事はこちら。 medium.com
既存日本語単語ベクトルの変換
とりあえず検証用なので、比較的小さめの日本語単語ベクトルを用意すべく、こちらを利用させて頂きました。
$ wget https://s3-ap-northeast-1.amazonaws.com/dev.tech-sketch.jp/chakki/public/ja.text8.zip $ unzip ja.text8.zip $ wc ja.text8 0 16900730 100000347 ja.text8 $ ls -lh ja.text8 -rw-r--r-- 1 imt adm 96M 10月 4 2017 ja.text8 (「権限 が ある こと も 認め て いる 。」のような分かち書きされた文章が、連結された1行で存在している)
word2bitsによる量子化を実行する。とりあえず次元数は200。
$ git clone https://github.com/agnusmaximus/Word2Bits.git $ cd Word2Bits $ ./word2bits -bitlevel 1 -size 200 -window 8 -negative 24 -threads 4 -iter 5 -min-count 5 -train ja.text8 -output 1b200d_vectors_ja -binary 1
検証
pythonから読み込んで、確認してみる。
$ ptpython >>> from gensim.models import KeyedVectors >>> wv_from_bin = KeyedVectors.load_word2vec_format("1b200d_vectors_ja", binary=True) >>> wv_from_bin["サッカー"].shape (200,) >>> wv_from_bin["サッカー"] array([ 0.33333334, -0.33333334, 0.33333334, -0.33333334, 0.33333334, 0.33333334, -0.33333334, -0.33333334, 0.33333334, 0.33333334, ... >>> wv_from_bin.most_similar_cosmul("サッカー", topn=10) [('バスケットボール', 0.9099991321563721), ('選手', 0.8699991703033447), ('アメリカンフットボール', 0.8649991750717163), ('クラブ', 0.8649991750717163), ('バレーボール', 0.8599991798400879), ('ディフェン>ダー', 0.839999258518219), ('フットボール', 0.839999258518219), ('ポジション', 0.8349992632865906), ('ラグビー', 0.8349992632865906), ('ミッドフィールダー', 0.8299992680549622)] >>> sum(wv_from_bin["サッカー"] > 0) 102 >>> sum(wv_from_bin["サッカー"] < 0) 98
0.3と-0.3が半々の2値ベクトルが用意できた。
さいごに
以前構築した単語の連想記憶モデルに、今回の2値ベクトルを取り入れて、再度色々試してみたい。おそらく、パターン間の距離に応じた、アトラクタの引き込みとかは、より適切になるはずだと思われる。
音声認識でZoom上の全会話をリアルタイムに字幕表示するための仕組みづくり
耳が聞こえづらい方を含む、不特定多数が参加するZoomミーティングにて、リアルタイムに字幕提供するために用意したもの。
誰か一人が稼働させるだけで、Zoomミーティング全員の会話が全て字幕化される。
詳細や動かし方はこちら。 https://github.com/hassaku/auto-zoom-subtitles
仕組み的には、ほとんどこちらの流用。追加したのは、仮想オーディオドライバでZoomの全会話取り込めるようにしたのと、Zoomに投げるためにローカルサーバ立てたくらい。 nlab.itmedia.co.jp
実際に試してみたものの、音声環境が整った発表形式ならともかく、不特定多数の会話が入り乱れるような場合には、著しく音声認識の精度が落ちるので、そういった場合は、UDトークとかZoomに字幕を投げられそうな音声認識手段(今回の仕組みでも良い)を、各自の手元に用意してもらう方が現実的かも。
あるいは、公式やサードパーティでちゃんとした字幕機能が提供されるかも。
個人的には、仮想オーディオドライバ、Web Speech API、Zoomの字幕機能周りのことを色々調べるきっかけになってよかった。
Hugo on githubから、はてなブログへ
色々書きたい記事は、メモ書きでストックするものの、さあ書くぞ!となったときに限って、環境が壊れてたり、段取り確認する時点でやる気が失せたりしていた(気がする)ので、書くことだけに集中出来る環境に移ってきたつもり。
メモ書きストックを少しづつでも成仏させていきたい(けど、chainerの内容とか、すでに古くなってしまった内容も多数...)🤔