TwitchChatPlugin 1.0 for Yukarinette

TwitchChatPlugin 1.0 on GitHub

TwitchChatPlugin は、ゆかりねっとで音声認識した文章をTwitchの自身のチャンネルに発言することが出来ます。使用にはチャット用OAuthの取得が必要ですが、詳細はREADMEを読んで下さい。

streamingラグを考慮した遅延送信機能と、スパム抑制機能を追加しています。遅延時間は自身の配信設定やTwtichサーバーとのラグを考慮しながらいい感じに調整してみてください。

TwitchChatPlugin 0.1 for Yukarinette

ゆかりねっとプラグインを作りました。

TwitchChatPlugin 0.1 on GitHub

TwitchChatPlugin は、ゆかりねっとで音声認識した文章をTwitchの自身のチャンネルに発言することが出来ます。使用にはチャット用OAuthの取得が必要ですが、詳細はREADMEを読んで下さい。

ニコニコ動画やYoutube Liveでは既に同種のプラグインはあるのに、私が主に利用しているTwitch向けには無かったというので、やってみようかなと思ったら割と楽に出来たやつです。一番大変だったのはWPFでのウインドウ作りだったかもしれない。

とはいえそれよりも面倒臭そうな、streamingラグを考慮した遅延送信とスパムコントロールは後回しです。非同期処理が避けて通れませんが、使用しているTwtichLibに非同期メソッドが容易されていなさそうなのと、適当にスレッドプールに投げて終わりというわけには行かないだろうなという状況があるので。
そういうわけでバージョンは0.1のpre-releaseとなっています。

もう一つ、汚い言葉を使用したときのフィルタリングも機能も本来は必要で、これが無いとTwitch側の機械判断 (AutoMod) に引っかかってペナルティをもらう可能性があります。そういう言葉を使わない善良な人でも音声認識の都合、誤認識で思わぬワードが出ることもあるので注意して下さい。
これはGoogleの音声認識部分である程度はやってくれるのと、Twitch側の処理は日本語に対してはまだそう厳しくないだろう(未対応の可能性すらある)というのと、ゆかりねっとアプリケーション側でやったほうがいい機能だろうかつ、やってくれそうという判断から優先度は低いです。

SubtitlePlugin 1.0 for Yukarinette

作ったと言うほどのものではありませんが、ゆかりねっとプラグインを作りました。

SubtitlePlugin 1.0 on GitHub

SubtitlePluginは、ゆかりねっとの詳細字幕ウインドウを、読み上げ機能無しに使用するプラグインです。なんと5行書いただけの何もしない、いわゆるnullデバイス的なやつです。

ゆかりねっとでは、字幕表示をする場合、簡易字幕と詳細字幕がありますが、簡易字幕による字幕表示のウインドウはChromeのそれであり、キャプチャツールでこれを取り込むにはかえって手間がかかります。簡易字幕はウインドウ名が親ウインドウと被っているので、OBSの場合では音声認識を開始する度にキャプチャ先を設定し直さなくてはなりません。
そこで、通常のWindowsのウインドウである詳細字幕を用いたいところですが、私の見落としでなければ、この詳細字幕ウインドウを利用するには読み上げ機能のプラグインを必ず一つは選択する必要があり、しかもその機能から呼び出される読み上げアプリケーションなりが使用可能な状態でなければ、そのプラグインは無効化されます。つまり、読み上げ機能無しに字幕機能だけを使うことが出来ないのです。

読み上げ機能無しにゆかりねっとを用いるなんて意味無いじゃないかと思われるかも知れませんが、個人的には読み上げ機能は無くていいかなという感じでしたし、字幕のためにわざわざ適当な、特にフリーの読み上げアプリケーションを有効にして、気の抜けるような読み上げ音声を聞かなくてはならないというのはナンセンスなのです。
また、googleの音声認識APIを呼び出して字幕として出力するアプリケーションをフルスクラッチで作るよりも、既に組み込まれているゆかりねっとのプラグインとして作った方が楽だろうという判断です。結果的に開発者に要望を出す手間よりも楽でした。

Python Setup for Data Science without Any Distributions

Pythonは書けるが、データサイエンスを囓ってみようと思ってセットアップをしようとすると、立ちはだかるのがAnacondaを始めとするdistributionである。適当に調べていると、いずれかのdistributionを使わないと本当にデータサイエンスが出来ないわけでは無さそうなのに、よく分かっていないにも関わらずとにかく何も考えずに入れろというような風潮が強い印象を受ける。includeをおまじないと言って誤魔化すような類の人達なんだろうか。よく分からないまま入れた挙げ句にdistributionに依存したトラブルが起きて、当然これを解決出来ず、そういうdistributionの現状に対する批判も出てたりするという、ドロドロとした界隈を覗き見ることが出来る。

ということで、pipと打てば済みそうなのにわざわざcondaとタイプさせる意味が分からないし(どうでもいいところで自己主張しなくていいよ。タイプ数増えてるし…)、使いもしなさそうなモジュールをてんこ盛りで入れられて汚染されるのも嫌だし、distributionへの依存性が高くなりすぎるのも嫌だったので、全部自力でセットアップしてみることにした。
言うまでもないけれど、Windows。

Python

3.6.3使用。インストーラでは、他にPython環境が入っておらず、今後もそんなに沢山入れるつもりが無いのならpath追加にチェックを入れる。組み込みとか他のソフトウェアでよくPythonをねじ込まれるので判断が難しいところだが。あとはお好みで。

Pythonは、バージョン間での互換性は重視しないくせに、バージョンが複数混在する場合の選択は、プロジェクト毎の設定を定義するものが無く、環境変数のみに強く依存する。そのため、仮想環境のような回りくどい方式が用いられる。これもdistributionと同じようにゴチャゴチャと乱立しているのだが、最小限の自力セットアップを目的とするのであれば、3.6に標準でパッケージされているvenvコマンドで良いと思う。

pathを追加した場合は、PCの再起動が必要。改めて自力でpathを追加したい場合は、Pythonインストール直下とそこにあるScriptsディレクトリを追加する。追加しないで、実行したい場合は、パス込みで実行すれば良いだけなのだが、pathに追加されていることが前提な処理が結構あるので、pathに足してしまうか、仮想環境を用いる方が良い。

Jupyter

なんでもいいが、この手の実行環境が無いと、グラフの確認すら困難なので入れる。

chcp 65001
pip install jupyter

最初のchcpコマンドは超重要で、コマンドプロンプトのコードページをUTF-8に変更するものだ。これを最初に実行しないとJupyterのインストールに失敗する。コマンドプロンプトのデフォルトの文字コードがSJISなのが駄目なのだが、その辺のプラットフォーム間の違いを吸収して適切にインストールするのはpipの役目ではないのか。

これは予備知識無しにやるとまず失敗するが、失敗した場合はコードページを正しく設定してインストールし直しても、それ以前の駄目なデータが残ってしまっていてまともに動作しないので、一旦Jupyterをアンインストールする必要がある。正しくインストール出来たなかったら元通りに戻すのはpipの役目ではないのか。
また、Jupyterは多数のモジュールの依存から成るのでただuninstallコマンドを入力するだけでは除去しきれない。手動で一つ一つ消して回るのは大変なので pip-autoremove を用いると楽である。依存性も考慮して完全なアンインストールを行うのはpipの役目ではないのか。

pip install pip-autoremove
pip-autoremove jupyter -y

で、再インストールはキャッシュを無効にしてやる必要がある。デフォルトのままキャッシュを有効にしていると、再び不完全なファイルを使用してインストールしやがるので失敗する。キャッシュデータの整合性を確認していないpipはゴミだと思う。

pip install --no-cache-dir jupyter

これでようやく、jupyterが動作する。

jupyter notebook

さて巷では、もてはやされているjupyter notebookだが、私はウェブベースの貧弱なエディタでコードを書かされるのは大変苦痛だと感じた。最低でもVSCodeで書きたいところである。

ということで、VSCodeでextensionをJupyterで検索するとそのまま出てくるのでそれをインストール。このextensionはpylintを要求するのだが、VSCodeの言うがままにインストールしようとすると、こいつもコードページがUTF-8前提なので失敗する。最早pipの欠陥じゃないか?
そのため別途インストールしてやる。

chcp 65001
pip install pylint

pylintを入れると、どうでもいいだろとか、個人の流儀だろみたいな書き方までケチをつけてきてとても五月蠅いので、適当にdisableする。
これで、VSCode上でjupyterを実行できるようになる。仮想環境上で実行する場合は一工夫いるのだが、後述。

Modules for Data Science

この辺は、必要になったタイミングでひたすらインストールするだけ。

pip install requests
pip install numpy
pip install pandas
pip install matplotlib
pip install scipy
pip install -U scikit-learn

上から順に…

  • HTTP通信。データサイエンスと直接的に関係ないのだが、ウェブデータをスクレイピングするときに使う。
  • 算術。Cでネイティブ実装されているのでパフォーマンスが悪くないらしい。
  • データフレーム。今のところ扱いやすいとは思わないのだが…
  • グラフ描画。
  • 科学演算。今のところ必要性を感じていないが、下のscikit-learnが要求する。
  • 機械学習フレームワーク。-Uをつけるのは何故…

venv with VSCode

仮想環境そのものは、適当に作ればいいが、VSCode上ではどの仮想環境を使うかという指定はできない。精々使用するpython.exeの場所を選べるくらいで何の役にも立たない。
以下のように、仮想環境を有効にしたコマンドプロンプト上でVSCodeをコマンドラインで起動させる。

activate
code

仮想環境を有効にすると、コマンドプロンプトウインドウが作り直されるので、バッチファイルを用意して叩くだけというのが出来ず不便である。

仮想環境上だとJupyterもVSCode上から適当に実行(’Jupyter: Start a new Jupyter Notebook’)させても動作しなくなる。自前でJupyter Notebookを起動しておいて、出てきたURLをトークン込みで ‘Jupyter: Enter the url of local/remote Jupyter Notebook’ に入力してから実行する。

VSCode settings

余談。
Jupyterは、以前のセルに入力した内容やimportが何時読み込まれるのか分かり難い。

"jupyter.languages": [
    {
        "languageId": "python",
        "startupCode": [
            "%load_ext autoreload",
            "%autoreload 2",
            "%matplotlib inline"
        ],
        "cellIdentificationPattern": "^(#\\s*%%|#\\s*\\<codecell\\>|#\\s*In\\[\\d*?\\]|#\\s*In\\[ \\])(.*)"
    },
    {
        "languageId": "javascript",
        "cellIdentificationPattern": "^(\\/\\/ %%|\\/\\/%%|\\/\\/ \\<codecell\\>|\\/\\/ In\\[\\d*?\\]|\\/\\/ In\\[ \\])(.*)"
    }
]

参考:IPython: autoreload

VSCodeの、startupCodeにこう書いておくと毎回リロードされそうなのだが、プラグインのバージョンで設定のフォーマットや挙動が変わったりするのでよく分からない。

Getting Started with GitHub

GitHub をはじめました。手始めに過去のツールのソースコードなんかを順次置いていっています。

過去に何度かツールのソースコードを公開してくれないかという要望が、特に海外ユーザからあったものの、”諸事情”によって敢えてしないという状態でした。最近では時間が経過したことや、BioWare Social Networkが停止したこともあり、構わないだろうという判断によって公開に至りました。

余談ですが、Dragon Age Conversation Readerは、当時韓国で非公式なローカライズツールとして利用されていたようで、その際にデコンパイルして韓国語対応するわ、敢えてつけなかった編集機能もつくわ、バージョン管理機能もつくわと魔改造をされていたのを、ソースコードを整理している最中に思い出しました。一から作った方が早いんじゃないかな。