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を使ったほうが良いだろうなーというのはあります。利用文字数もカウントするようにしようかな?

2017年10月23日月曜日

ブログを無理やりHPっぽく

何も考えずにブログで自作したソフトなどの紹介をすると確実に埋もれてしまうので、ヘッダーに関連リンクを載せる、という対応を取っているのですが、どこからどうみてもブログにしか見えないという不具合が(当たり前)。
なんとなく嫌だったので、テンプレートを弄ってシンプルなWebページっぽくしたい…ということで以下のようなページを作ってみました(本当はサーバー借りてドメイン作って…とした方がいいかなと思ったんですが、まぁ長続きしないだろうということで)。

https://webmicrolemongrass.blogspot.jp/2017/10/index.html

いらないものをバッサリと。HP作成初心者でとりあえず作ってみた、みたいな殺伐としたものになっていますが、個人的には気に入ってます。

作り方ですが、bloggerのテーマから一番シンプルなものを選択して、htmlを加工するだけです。それっぽーいのを消していけばどんどん見た目がすっきりしていって何とも言えない爽快感を味わえました。

で、Webページっぽく、となるとページ内容がそれなりに凝ったものである、という印象があったので、Googleドキュメントを埋め込むことでお手軽にきれいなものを作れないかなーと思ってやってみたのですが、大きな問題点が。

…ページのリンクが貼れない!
正確に言うと、リンクは貼れるのですが、埋め込まれたドキュメント内でページ遷移します。そのため、普通にリンクを貼ると、マトリョーシカのように同じものが内に連なる現象が起こってしまいます。
ページ遷移の設定はGoogleスプレッドシートには存在するのですが、Googleドキュメントには存在しません。どうしようもないですね。

とりあえず、ドキュメント内にリンクを貼らない、webページの構造をシンプルに、また余白を削って、ドキュメント内で遷移しても自然に見えるようにする、という方法を試し、なんとか見られるものにはなったんじゃないかなと思います。

他にも色々気になる箇所はあるのですが、本来の用途とは異なる使い方ですので、割り切ってます。Googleサイトがもう少し使い物になればこんなことは考えなかったんですが…簡単に作成できる、他のGoogleサービスとの連携が強いなど、良いところもあるのですが、ページデザインを始めとして弄れないところが本当に多いです。旧Googleサイトは自由度が高そうでしたが、サービス終了が決まっているため手を出せません。


こんな感じですかね。ぐちゃぐちゃ書きましたが、それでもGoogleのサービスは素晴らしいと思います。突然サービス終了、はないと信じている、というかもしあったとしたら、とてつもなく恐ろしい何かが発生していてそれどころではない状況になっていると思います。


2017年9月26日火曜日

スタンバグ

スーパーマリオワールドというゲームには様々なバグや裏技が存在します。ブロックを増殖したり、回転ブロックの塊を高速ですり抜けたり、壁の中に入ったり…無を取得というのも発見当時はSMW界隈で騒がれ、現在ではRTA技の一つとして使用されています。

この無を取得というのがスタンバグの一種だというのを、ある方に教えていただいた資料より知りました。この資料によると、全城や全ゴールで一部の方が採用しているboss kill(コース内でコクッパを召喚し、それを倒すことでクリアする)やオーブストック(沈没船のゴールアイテムをストックする)、知名度が高いものとしては、Pスイッチからプクプクを出すバグ(ヨッシーに乗った状態でPスイッチを踏み、直ぐに食べて吐く)は全てスタンバグである、とのことです。
これは知っておいたほうが良さそうだなということで、googleさんに頼りながら読んでみました。そのまま訳してるわけではないので(英語力低いし)間違っている可能性がありますがご了承を。他の記述も気になりますが、時間がかかr



==============ここから==============

「スタンしたスプライト」
スーパーマリオワールドにおいて、スプライトにはいくつかの状態が存在します。そしてそれを決める値はアドレス$7E:14C8に格納されています。具体的には以下。

$7E:14C8 : Sprite Status Table
#$00 = Free slot, non-existent sprite.
#$01 = Initial phase of sprite.
#$02 = Killed, falling off screen.
#$03 = Smushed. Rex and shell-less Koopas can be in this state.
#$04 = Killed with a spinjump.
#$05 = Burning in lava; sinking in mud.
#$06 = Turn into coin at level end.
#$07 = Stay in Yoshi's mouth.
#$08 = Normal routine.
#$09 = Stationary / Carryable.
#$0A = Kicked.
#$0B = Carried.
#$0C = Powerup from being carried past goaltape.

States 08 and above are considered alive; sprites in other states are dead and should not be interacted with.

この中で、#$0B、すなわち運ぶことが出来る状態、というのがスタンバグでは重要になります。例を上げると、緑色の甲羅と緑ハダカガメは同じスプライトですが、状態が違います。

緑色の甲羅:#$0B。スタン状態(持ち運び可能)
ハダカガメ:#$08。通常ルーチン

他にもクリボンやボム兵が当てはまります。

それ以外のスプライトの中で、鍵やPスイッチ等、マリオが常に持ち運ぶことの出来るスプライトは常にスタン状態となっており、通常のルーチンになると不安定な状態になります。

ここでもう1つ重要な概念、「スタンタイマー」を説明します。これは目的別に異なるスプライトで使用されるもので、ノコノコを踏んでハダカガメが生成される時に使われている値のため、このような名前になっているそうです。

ノコノコをジャンプで踏んだりマントで体当たりしたりすると、スタン状態になる(甲羅に変わる)だけではなく、スタンタイマーがある値に設定されます(最初のケースでは小さく、2回目のケースでは大きい)。このタイマーは1フレーム経過する毎に1ずつ減り、0になるとハダカガメが生成されます。これは通常ノコノコでのみ発生するものですが、開発者は、スプライトがスタン状態になり、スタンタイマーが0になる度に別のスプライトがそれから生成されるというコーディングをしていました。

スタンタイマーには色々な用途があります。例えば、スプライトが消滅するように踏み潰したとします。それで、もしそのアイテムがヨッシーの下に乗せられるもの、かつ踏み潰すことが出来るものであり、そのアイテムを踏むと同時に食べた時、ヨッシーはスタン状態のアイテムを吐き出すことが可能でしょう。
またその時、スタンタイマーが0以外の値にセットされ、その後毎フレームごとに減っていきます。そして値が0になると、それからスプライトが生成されます。
これにより、甲羅(赤以外)からハダカガメを無限に生成することができます。アイテムがPスイッチの場合、プクプクを生成することが出来ます(有名ですね)。

変異型:驚くべき「不安定な」スプライト。
スプライトの中にはスタン状態となることが想定されていないものもあり、そのようなスプライトはスタンルーチンが存在しません。
スプライトは、舌2枚出しバグによりスタン状態にすることが可能です。その際、以下のような手順を踏む必要があります。

 1 
舌2枚出しバグをする。

 2 
1枚目の舌で、ヨッシーが口内に保持できるスプライト(ノコノコ/甲羅、Pスイッチ、鍵、ジャンプ台等)を捕まえる。

 3 
2枚目の舌で、スタン状態にさせたいスプライトを捕まえ、ヨッシーの舌の上に乗っている間にダメージを受け、ヨッシーが飲み込まないようにする。


すると見かけ上、ヨッシーの口は膨れているが、2つ目のスプライトは飲み込まれていない、という状態になります。実際、ゲーム内ではそのように捉えられています。
たとえそのスプライトが口の中に留まることが想定されていなくても、そのスプライトはヨッシーの口から吐き出すことが出来ます。

この状態を引き起こした時スタンタイマーが0になっていなければ、SpriteKoopasSpawnテーブルがオーバーフローを起こし、何らかのスプライトが生成されます。何が生成されるかは、スタンさせたスプライトにのみ依存します。

スプライトのスタンタイマーは、様々な方法で0以外の値に設定することが出来ます。
方法の一つとして、スプライトを踏むというのがあります。後に残る塵や雲がエフェクトを表示する時間を決めるために、スタンタイマーが使用されます。
スプライトによっては、最初の生成(初期スポーン?)や、アクションを行う時等、上記とは別のことでスタンタイマーを使用します。例えば、ゴールポイント(ゴールバー)はタイマーを使用し、方向を変えるタイミングを決めます(上下反復)。

この不具合により、非常に奇妙な結果を得ることが出来ます。最も有用なケースは次のとおりです。

1. 滑る青色のハダカガメ 
スタンさせるとコクッパが生成される。倒すとレベルが終了する(通常クリア)。

2. サンボ 
スタンさせるとゴールバーが生成される。ゴールバーを得るには、(x, y) =(0~15, 0)の位置に移動する必要がある。

3. ライタ 
スタンさせると鍵穴が生成される。しかしライタが炎を吐くとクラッシュする。

4. 横方向に泳ぐ魚、パラボム 
スタンさせるとブイブイが生成される。ブイブイがスロット7に入るとレベルが終了する。
次のRAMメモリアドレスの値―$7E:1520, $7E:1521, $7E:1522 and $7E:1523―の合計は4でなければならない。それぞれのスプライトが異なった方法でアドレスを使用する。その多くは「垂直方向」のために使用。4つの引用アドレス(4 cited addresses)はスロット4と7の間のスプライトによって使用される。

5. Diggin' Chuck(地面を掘り起こして岩を転がしてくるブル) 
スタンさせるとClappin' Chunk(手拍子ブル)を生成する。これはオーブストックバグとして知られている。ファイアマリオを使い、アイテム交換を介してブルを食べると、ストックにオーブが表示される。

他にもスタンさせると便利なスプライトがあります。

テレサはコクッパを生成。
テレサウルスは鍵穴を生成。

…ヨッシーはお化け屋敷に入れないので、実機ではこの恩恵を得ることは出来ませんが、ハックロムでは可能です。また、以下のリストにどのスプライトがどのスプライトを生成するかを載せています。例えば、Diggin 'Chuckの岩をスタンさせれば滑る青ノコノコを生成でき、更にそれをスタンさせるとコクッパを生成できます。その為、時にはダブルスタンやトリプルスタンが役に立つことがあるかもしれません。以下のpastebinにて各スプライトが何を提供するかを知ることが出来ます。

==============ここまで==============


…細かいところは違うだろうけど、だいたいこんな感じだと思います。
ざっくり書くと、スタン状態とスタンタイマーを利用すると色んなスプライトが作れるよってことです(ざっくりしすぎ)。

ROM解析に関してはさっぱりなので、根本的に説明がおかしいところがあるかもしれません。気づいた方はコメントで指摘をば。


※参考動画
ゴール錬成(サンボを使用)
http://www.nicovideo.me/watch/sm20743580
ブイブイ錬成(横方向に泳ぐ魚を使用)
http://www.nicovideo.me/watch/sm31072476
コクッパ錬成(滑る青ハダカガメを使用。boss kill)
http://www.nicovideo.me/watch/sm31992078

2017年9月15日金曜日

Autosplit Helper 関連ソフトのリンク

適宜追加していきます。

<仮想webカメラ>

・SCFF Directshow Filter 
https://github.com/Alalf/SCFF-DirectShow-Filter (GitHub) https://sites.google.com/site/scffdirectshowfilter/ (Nightly Builds)

必要なランタイム:
Microsoft .NET Framework 4 Client Profile
https://www.microsoft.com/ja-jp/download/details.aspx?id=24872

 Microsoft Visual C++ Redistributable for Visual Studio 2017 (x64 or x86) https://www.visualstudio.com/ja/downloads/ (一番下)


 ・SCFH DirectShow Filter 
http://mosax.sakura.ne.jp/yp4g/fswiki.cgi?page=SCFH+DSF


 ・NDC(XP) 
http://consolas.web.fc2.com/ndcxp/

2017年9月9日土曜日

(続)RTAで各区間の成功回数をカウントしたい

アドバイスを頂いたので、すこし挑戦してみました。

Livesplitには名前付きパイプが存在し、それを利用するとSegment nameを変更できます。"setsplitname [index] [segment name]\n"を投げれば、指定した位置のSegment nameを指定できます。

先程投稿した記事で書いたものにこれを入れると、いい感じに動いてくれました。


細かい部分の調整がまだなので外に出せるものではないですが、ちょっとだけ便利だと…思い…ます…?

スマホからテスト

メインブログに雑言を書くのもどうかなーと思い、bloggerにダラダラ書いていこうということで。 相変わらず書き始めで詰まるんですが、最近は体の歪みを少しでもとっていこうと一人でちまちまストレッチなどをしています。矯正したいのはO脚、外反母趾、内反小趾あたり(整体に行くべきなんだ...