2012年1月22日日曜日

棒読みちゃん for Google+:技術解説

拙作 棒読みちゃん for Google+ についての技術的解説です

「棒読みちゃん for Google+」は棒読みちゃん
読み上げテキストを外部から受信する機能を使用しています。


通信にはSocket通信を使用しますが
Chrome ExtentionだけではSocket通信を行うことができません。

それを解決するため滅びの技術といわれる「NPAPI」というものを使用します。

NPAPIとはFlash Player などのプラグインで使われる
EMBEDタグでOSネイティブの機能を呼び出す技術です。

ようするに、OSネイティブな機能はDLLとして実装します。

(FlashもHTML5に取って代わられ、
NativeClientなどの新しい技術によって
NPAPIは滅びる運命にあると言われています)

今回の機能は以下によって構成されています

  • コンテント・スクリプト
  • バックグラウンドページ
  • オプションページ
  • プラグインDLL

コンテント・スクリプト

Google+ページで動かすJavaScriptです。

DOMNodeInsertedのイベントを監視して
追加されたPOSTから文字列を取り出し
バックグラウンドページに送信します。
バックグラウンドページとのやりとりは

chrome.extension.sendRequest()を使用します。


バックグラウンドページ

バックグラウンド動くため、表示させることはできませんが
EMBEDタグでDLLをプラグインとして貼り付けます。

コンテント・スクリプトからのsendRequestは
chrome.extension.onRequest.addListener()で受信し
送られてきた文字列をプラグインへ渡します。


<embed id="bouyomichan" type="application/x-vnd.bouyomichan"></embed>

のようにしてプラグインを貼り付けることによって

document.getElementById('bouyomichan').talk('hogehoge');

というJavaScriptでプラグインに実装したtalk()メソッドを呼び出すことができます。


オプションページ

ブラウザの「拡張機能」画面から呼び出すオプションを設定する画面です。
設定した値は localStorage をつかって保存します。
デザインが適当なのはそこまで頑張る気力がなかったためです。

プラグインDLL

Socketを使って棒読みちゃんと接続し
文字列を送りつけます。

今回はtalk()というメソッドで棒読みちゃんに文字列を送信しています。
他にも、音声、音量、音程、スピードなどを変更するためのメソッドも
実装しています。

こればっかりはWindowsネイティブな部分なので
VisualC++2010でビルドしました。

このDLLに相当する部分をMacやLinux用に用意すれば
MacやLinuxでも動かせないことはないはず。

とはいっても棒読みちゃん本体はWindows版しかないわけで、、、、

NPAPIを使うにあたって、
色々とサンプルを漁ったりしましたが
唯一動いたのがこちらのものだけでした。

ChromeからプラグインDLLとして認識されるためには
DLLのバージョン情報にMIMETypeなどを定義しなければいけないのだが
これがなかなかうまいように設定できず、苦しみました
上手いことchromeに認識されるとabout:pluginにて確認することができます。

文字列のやりとりはutf-8で行われ、
棒読みちゃんもutf-8での指定は可能なのですが、
初期に配布したバージョンでは
文字列長の指定を誤っていたため
ゴミまで読み上げることがあったのはナイショだ


今回ちょっとめんどくさかったのは以下2点

  • ストリームのPOSTについてはあっさりと文字列を取り出すことができたのですが、ハングアウトのCHAT部分はiframeで別ページになっててその中の更新を監視しなければいけなかったこと
  • 一度実装できたと思ったらGoogle先生がごっそりDOMの構成かえたため実装しなおしたこと


2012年1月21日土曜日

棒読みちゃん for Google+

一億人のGoogle+ユーザの皆さん
おまたせしました


ちまちま、開発を続けていた「棒読みちゃん for Google+」が
ようやく使用に耐えられそうな段階になりましたので
公開いたします。

あ、Windows専用です


テキスト読み上げソフト「棒読みちゃん」を使用して
ストリームの内容を読み上げます

読み上げる内容は以下になります
  • POST本文(POST主の名前の有無)
  • コメント
  • ハングアウトのchat
ただ、コメント部分の読み上げについては元POSTとは無関係に
追加された順番に読み上げられます。
また、ストリームの勢いがはやいと
コメント読み上げがストリームに追いつかなくなるので要注意

個人的には、実況系ハングアウターの皆さんにつかってみていただきたいと思っています。
(ご意見ご感想お待ちしています)

chat部分はストリーム部分と比べて
Google先生がページ構成をちょくちょくいじるので
突然使えなくなる可能性があるのがめんどくさいかな

現在、Chrome Webストアにて審査待ち(即時公開させろよ)なので、
待てない人は以下から取得してください
審査で却下されたのでここでほそぼそと配布します



起動時に「msvcr100.dllなんたら」なエラーが出る人は
を入れると幸せになれるかも