Jupyter notebookやGoogle Colab上のグラフを音声化するためのライブラリを公開した

何を作ったの?

利用例にあるように、グラフの縦軸をピッチ、横軸を左右のパンで表現するように変換してくれる。複数の値に関しては、同時に再生したり、順番に再生したり、色々オプションも指定できるようにしている。

notebook上で

!pip install audio-plot

すれば、すぐに使えるようになるはず。

自分で試してみるならこちらから。 Google Colab

なんで作ったの?

目が見えづらくなったとしても、色々と環境を整えれば、プログラミング自体は(人によっては)十分に出来そうだということが、たくさんの先駆者の方々のおかげで分かってきている。

一方、データ分析に関して言えば、データをグラフ等で可視化する部分だったり、まだまだ視覚に頼らざる得ない部分が多い。だが、データ分析の本質的な部分*1というか、帰納的なプロセスに関しては、従来の演繹的なプログラミング作業だったり、ケアレスミス防止など視覚の優位性が必要とされる作業に比べて、比較的視覚に頼らなくても、(人によっては)得意としていける分野なんじゃないかなと思ってる。

ソフトウェア2.0とか、AI開発の多様性とか、色々根底にあるけれど、うまく整理しきれてないので、そのうちまとまったら記事にしてみようと思う。

さいごに

GithubのStarとか機能要望等のフィードバックもらえたら、とてもとても嬉しい

*1:データの解釈、多視点的な分析、アルゴリズム開発、説明・企画・etcといった思考プロセス

新コロ対策の手で顔を触ったら通知するツール

概要

f:id:hassaku-labs:20200706003536p:plain:w300
顔を触るいらすとや画像

仕事中などに、結構無意識に顔をペタペタ触ってしまう癖がある。この度の新型コロナ禍において、結構リスキーな行動だということもあり、対策するためのツールを作ってた(拡大時期の3月頃)。

PCのカメラ画像から、顔認識及び手認識結果を得て、顔を触っている場合に、通知を出す。これで、徐々に無意識の悪癖を直していければ嬉しい。

こちらにデプロイしてあるので、簡単に試せる。 face-touch-alert.netlify.com

顔を触ってしまったときの通知はこんな感じ。

f:id:hassaku-labs:20200705234942p:plain
顔を触った旨を知らせるブラウザの通知

仕組み

プログラムはこちら。 github.com

利用した各JSライブラリ

  1. 顔認識
  2. 手認識
  3. 通知

基本動作は、setIntervalで100msec毎に、顔と手の認識を行い、顔の範囲内に手が近づいていたら、顔を触ったと判定して、push通知を行うだけ。

既知の問題としては、違うタブやアプリに切り替えたときに、setIntervalだと、バックグラウンド動作が不定になり、顔を触ったタイミングを逃してしまうことがある。こういうときに、web workerを使うのかと思って色々調べてみたものの、web workerからDOMにアクセスしたりする方法が分からず、そのまま放置してしまった...が、書いてて思ったのだが、認識位置等の表示を無視して、通知を出すだけなら、DOMへのアクセス関係なく出来たかもしれない。

単語ベクトルを2値ベクトル化

背景

以前、アトラクタ的なダイナミクスをもったニューラルネットワークで、単語の連想記憶を試した。 blog.hassaku-labs.com

この時点では、単語ベクトルをニューラルネットワークに入力する際、単にランダム行列射影を通して、次元数の調整をしただけで、連想記憶するベクトル情報自体は、連続値分散表現パターンのままであった。

しかしながら、シグモイド的な発火パターンを特徴としたニューラルネットワークの特性上、2値ベクトルの方が好ましい。

そこで、既存単語ベクトルを2値化する仕組みを探していたところ、手軽に出来そうな方法を見つけたので記録しておく。

word2bitsによる単語ベクトルの2値化

用いたのはword2bitsという手法。元々は、量子化によるデータのサイズ削減を目的としたものだが、類似度タスクでは性能が向上したとのことなので、連想記憶用の表現としても適していると思われる。

word2bitsについて、日本語で参考になりそうな記事はこちら。 medium.com

既存日本語単語ベクトルの変換

とりあえず検証用なので、比較的小さめの日本語単語ベクトルを用意すべく、こちらを利用させて頂きました。

github.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から、はてなブログへ

旧ブログ blog.hassaku-labs.com

色々書きたい記事は、メモ書きでストックするものの、さあ書くぞ!となったときに限って、環境が壊れてたり、段取り確認する時点でやる気が失せたりしていた(気がする)ので、書くことだけに集中出来る環境に移ってきたつもり。

メモ書きストックを少しづつでも成仏させていきたい(けど、chainerの内容とか、すでに古くなってしまった内容も多数...)🤔