2018年3月22日木曜日

GCPの感情解析

かなーり前に作成したもので、自分でも存在を忘れていたので、完全に忘却しないように。

ニコ生等のコメントを対象に感情解析をかけてます。得られる情報は、そのコメントがポジティブなのかネガティブなのか、その強さ。
他のメーカーの感情解析はもっと詳細な情報を得られるものもあります(喜怒哀楽と4つのパラメーターがあるもの等)。Googleの感情解析も進化しないかな(他のエンジンは使うのが(個人的に)面倒くさい)

2018年2月28日水曜日

Unityを初めて触った時のメモ

なんかゲーム作ってみたいよね、ということで少しだけ触ってみました。

目標もなしにダラダラすると十中八九何も得られないままやめてしまうので、適当に目標を設定しました(設定しても挫折s

大きな目標
 ■音楽ゲームを作る。

中くらいの目標
 ■音ズレ対策

小さな目標
 ■タップ判定を取得(シングル、マルチ)
 ■音楽を鳴らす(BGM、SE)
 ■タイトル、シーン遷移を行う
 ■セーブデータの読み書き
 ■タップエフェクト(パーティクルもしくは普通のオブジェクト)
 ■音符の生成
 ■解像度に応じた画面サイズの調整
 ■当たり判定周り
 ■同時押し、フリック、長押しの処理
 ■
 ■
 ■…(いっぱい)

その他雑記
 ■なぜUnityにしたのか。
→単純に日本語の情報が多そうだったから。
シンプルな2Dゲームを作ろうとしていたので大体どのゲームエンジンでも問題ないかなと思いましたが、今までいくつかのソフトを作った時、コードを手当たり次第コピペすることが非常に多く、コードが多そうなものを(この辺りはドキュメントを基準に作っていく等して重度のコピペマン病からほんの少しでも脱却したい)
 1つのゲームエンジン固執するのは良くなさそうなので、もし余裕ができればUE4やDefoid等も触ってみたい、かも。


今までやったこと
・本を買う(買ったもの:Unityの教科書 Unity2017完全対応版)
・Unityのダウンロード、インストール
・↑のスクリプト部分までを写経する(ここで既に混乱。ゲームエンジンではないし比較対象にすらならないけど、VB.Netのお手軽さに涙)
・↑のサンプルゲーム(ルーレット)を作る。
 四苦八苦しつつプレビューで何とか動き、Build&Runをしようとするとエラー。
 Buildだけをしてapkファイルを移そう→ビルドエラー。
 どうもJDKのバージョンが悪かったらしく、jdk1.8.0_162を入れたらビルドできた。
・サンプルゲーム2つ目を作成途中。
・寄り道してタップ情報の取得を試みる→なんとかできた。
・ヒエラルキー内の文字の色の違いはなんだろう。
・VS2017の補完機能が使えない…とりあえずMonodevelopを使用。でも使いにくい…
2018-02-28

メモURL
【Unity】複数カメラを使ってみてつまづいたこと。分かったこと。
http://naichilab.blogspot.jp/2013/07/unity.html

Unityでメインカメラとサブカメラを同時に画面表示
https://qiita.com/WassyPG/items/a53889dc00b01999d47a

unityで音ゲーのモックを作りました
http://developer-ryo.hatenablog.com/entry/2015/11/11/232205

2018年1月20日土曜日

ニコ生ミラー補助ツール

n番煎じですが、作ってみたかったので作ってみました。
ニコ生だけでなく、Twitch、Youtube、Mixerも同一ウィンドウ内に表示できます(埋め込みコードの取得が必要)
音声ON/OFF、ラベルの添付も。要するにRTAのミラーに特化?した?ツールです。対応プラットフォームが上記のみなのもそういうことです。



こういうの作ったよっていう報告記事なので、適当ですがこれくらいで。

2018年1月11日木曜日

OCR精度確認

OCRソフトの認識精度チェック

使用したソフト
・Capture2Text
・GT Text
・Panasonic 読取革命 15
・Google Cloud Platform - VisionAPI Text Detection
・Office Lens(字幕のみ)

検証方法
様々なフォントで書かれた文字、ゲームの字幕を各OCRソフトで認識させる。
前者は単純な認識精度、後者は背景が単色ではない場合の認識精度を見る。

フォントの種類:207種類
フォントサイズ:8,12,16pt
文字列:ABCDE FGHIJ KLMNO PQRST UVWXYZ 12345 67890

連結させた画像を読み取る。
利用させていただいたサイト:全標準フォント一覧 / フォントシミュレーター
http://dekasu.net/fonts/

































ゲーム一覧
Ori and the Blind Forest
Crypt of the NecroDancer
Rabi-Ribi
Getting Over it
ICEY

連結させた画像を読み取る。


















結果:

概要

8pt12pt16pt
読取革命1.964.524.96
Capture2Text4.145.315.54
GT text2.594.975.30
GCP5.946.606.74
※スペースで区切られた文字がそれぞれ正確に認識されているか。
スコアは各0~7。全てのフォントに対するスコアの平均を表に示している。


フォントに関してはGoogle Cloud Platform 1強、字幕に関してはGCP、Office Lensが抜きん出ている。全体的にGCPがより優秀。

Capture2Text、GT Textについては余白を限りなく減らせば多少認識精度が上がったが、上記ソフトには及ばない。

使い勝手諸々を考慮すると、今回検証した中ではCapture2Textが良さそう。
GCPはプログラムを組む必要がある、一定以上の利用は有料の為、少し頑張らないといけない。リアルタイムで使用する必要がなければ、Googleドキュメントに画像を読み込ませれば同様のことが可能。

(今回GCPのプログラムは以下のようにした(サンプルコードをVB.netに書き換えただけ))

 Dim image As Image = Image.FromFile("ファイルパス")
        Dim client As ImageAnnotatorClient = ImageAnnotatorClient.Create
        Dim response = client.DetectDocumentText(image)
        Dim count As Integer = 0

        For Each page In response.Text
            If count = 0 Then
                Textbox1.AppendText(response.Text)
                count = 1
            End If

        Next







2017年12月23日土曜日

html5コメジェネで、配信プラットフォーム毎にスキンを切り替えて表示

経緯
・[目的]多重配信において、各配信サイトでのコメントをまとめて表示したい。
・kilinさん作html5コメントジェネレータがマルチプラットフォーム対応してる(凄い)
・はなげさんがコメントの投稿元をコメジェネに追記出来るように改造する方法を公開
 →どの配信サイトからのコメントなのか一目瞭然!

…経緯を書いていたら目的が既に達成されていることに気づいてしまいましたが…まぁ、あれです。プラットフォーム毎にスキンを変えられたらもうちょっと見栄えを良くすることが出来るんじゃないかなと。

てわけで適当に弄ってたらなんか上手くいったので、備忘録として残しておきます。

(初期設定は済ませ、正常にコメジェネが作動している、をスタート地点とします。)


1. コメジェネ内のskinsフォルダを開き、画像ファイル名を以下のように変更します。
skins_00_basic.png
skins_01_nico.png [ニコ生]
skins_02_youtube.png [Youtube live]
skins_03_twitch.png [Twitch]
skins_04_fresh.png [FRESH!]
skins_05_abemafresh.png [Abemafresh]
skins_06_openrec.png [OPENREC]

画像の中身は適切なものに変更して下さい。
通し番号の後ろは自分が判別できる名前であれば結構ですが、コメジェネ側でアルファベット順に読み込まれるので、通し番号は付けて下さい。



2. hcg_settingを開き、スキンの設定を「ランダム」にします。フォルダのパスは、コメジェネのフォルダ内にある「skins」にしておいて下さい。


3. CommentGenerator_multi.htmlを開きます。メモ帳で開くと体裁がかなり崩れるので、高機能なエディタ(VSCode、Mery等)を使用することをおすすめします。


4. 109行目辺り(以下のような記述がある所)
if(xml[i].getAttributeNode("service").value == "nicolive") {
handle = "【ニコ生】" + handle;
~
を、
//ここから
var num_plat = 0;


if(xml[i].getAttributeNode("service").value == "nicolive") {
 handle = "【ニコ生】" + handle;
 num_plat =1
} else if(xml[i].getAttributeNode("service").value == "youtubelive") {
 handle = "【YouTube】" + handle;
 num_plat =2
} else if(xml[i].getAttributeNode("service").value == "twitch") {
 handle = "【twitch】" + handle;
 num_plat =3
} else if(xml[i].getAttributeNode("service").value == "FRESH") {
 handle = "【FRESH!】" + handle;
 num_plat =4
} else if(xml[i].getAttributeNode("service").value == "AbemaFresh") {
 handle = "【FRESH!】" + handle;
 num_plat =5
} else if(xml[i].getAttributeNode("service").value == "OPENREC") {
 handle = "【OPENREC】" + handle;
 num_plat =6
}
//ここまでを追記しただけ

に、その下の
var CGen = new CommentGenerator(handle, fixComment(xml[i].firstChild.nodeValue), HcgFormat, TxtFormat);

を、
var CGen = new CommentGenerator(handle, fixComment(xml[i].firstChild.nodeValue), HcgFormat, TxtFormat, num_plat);

に書き換え、上書き保存します。


5. CommentGenerator.jsを開き、最初の方にある
function CommentGenerator(Handle, Comment, hcgFormat, txtFormat)

を、
function CommentGenerator(Handle, Comment, hcgFormat, txtFormat, num_plat)

に書き換え、118行目辺り
var filename = xml.getElementsByTagName('skin')[
Math.floor(Math.random() * xml.getElementsByTagName('skin').length)
].firstChild.nodeValue;

を、
var filename = xml.getElementsByTagName('skin')[num_plat].firstChild.nodeValue;

に書き換え、上書き保存します。


以上です。上手くいけば↓のようになると思います 。


文字の位置調整は、CommentGenerator.jsを開いて、
"「"や"」"で検索すると出てくる場所(this.textcomment = new createjs.Text(~~)
にスペースを入れると簡単に調整できます(雑)。

2017年10月29日日曜日

読み上げのちょっとしたメモ

Limechatの読み上げで、日本語と英語でTTS変更
(文章中に日本語が含まれていたら日本語エンジン使用)

・Limechat2のダウンロード、インストール
・マクロ設定で棒読みちゃんを指定。
  ユーザー:%me|*
  コマンド:Privmsg
  チャンネル:#チャンネル名
  メッセージ:
  自分の状態:なし
  送信者の状態:なし

  動作:ExecuteMinimize
  動作の情報:"...\RemoteTalk.exe" /T "%m"

  チェック無し

・棒読みちゃんの設定(配信者向け機能True)
 辞書登録
  正規表現
   優先度:100
   正規表現:^(.*[ぁ-ん亜-黑].*)*$
   置換後:(Voice 1)$1

_______________________________________

Cloud translation APIが有料なのならば

Webから直接引っ張ればいいじゃない?

現在、ストリーミング配信サービスは数を増やし、複数のサイトへ同時に配信する、という方も増えてきています。日本人の場合、Twitch、Youtube liveへ配信することも多くなってきています。国内サービスの1つであるniconicoで配信していて、サービスの不安定さから他サイトと同時配信(もしくは完全移行)に切り替えた、という方も多いでしょう。

以前は海外のストリーミングサービスは遅延が多いため乗り換えがたいところもありましたが、Mixerが超低遅延配信(0.1秒~)を始めたことを皮切りに、他サービスも低遅延配信に力を入れるようになってきました。Youtube live、Twitch共に実用レベルまで遅延が減り、それならば乗り換えよう、と思った方も多いと思います。

海外のストリーミングサービスの利用において、避けては通れないことがあります。それは、視聴者のグローバル化です。国内サービスでは基本的に日本語がわかれば何の問題もありませんでしたが、海外サービスでは基本的に英語でコメントが来ます。もちろん英語以外のコメントも普通に来ます。これに対応するかどうかは人次第ですが、対応できたほうが良いでしょう。

ここで頭に浮かぶのがGoogle翻訳。
Google 翻訳(グーグルほんやく、英語Google Translate)はGoogleが提供する翻訳サイトで、テキストの一部分、もしくはウェブページ全体を別の言語に翻訳するサービスである[1]。文章の言語識別や、入力した文字を即座に反映させるリアルタイム翻訳、音声入力機能を持つ。(Wikipediaより)
このように、入力された言語を自動判別し、リアルタイムで翻訳してくれます。ニューラルネットワークの活用により翻訳の精度も上がってきており、これを活用すれば、コメントの理解が進むことは間違いありません。

かつてGoogle翻訳にはAPIが存在していました。これを使えば、プログラムに翻訳機能を組み込むことが出来ました。しかし現在ではそのAPIは廃止され、Cloud translation APIにバージョンアップし、同時に有料化しました。

価格は$20/1,000,000 文字と破格の安さなのですが、ちょっと使いたい、という時にこのサービスを利用する、というのはちょっと厳しいものがあります。


Google翻訳はWebサービスも存在し、そちらは無料で使用することが出来ます。これを利用してちょっとした自動翻訳ソフトを作れないかと思いました。




というわけで、とりあえずシンプルなもの(手動入力)を作ってみました。
やっていることは非常に単純で、Web browserでGoogle翻訳を開き、上のテキストボックスの内容を入力、結果をクリップボードにコピー→下のテキストボックスに貼り付け…を1ボタンでやっています(もっと良いやり方もあるでしょうが…)。

あとは、上のテキストボックスにコメントを自動入力するようにすれば、完全自動化出来ます(コメントが多いとスキップされるので、そちらも考えなければなりませんが…)。一応配信者向け、コメントビューワーの使用を前提とした作りにするつもりで、棒読みちゃんと連携→読み上げ内容を取得、このソフトに投げる、という形にしようと思っています。

Webページを開いてテキストを入力して結果をコピー…と、http通信のみしかしていないので問題ないとは思いますが、使用量が多いのならば有料APIを使ったほうが良いだろうなーというのはあります。利用文字数もカウントするようにしようかな?

GCPの感情解析

かなーり前に作成したもので、自分でも存在を忘れていたので、完全に忘却しないように。 ニコ生等のコメントを対象に感情解析をかけてます。得られる情報は、そのコメントがポジティブなのかネガティブなのか、その強さ。 他のメーカーの感情解析はもっと詳細な情報を得られるものもあ...