Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/04/12 (水)

こーぞーたいを学ぶよ!

| 20:52 | こーぞーたいを学ぶよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - こーぞーたいを学ぶよ! - 雪乃☆雫のなでしこ日和 こーぞーたいを学ぶよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 こーぞーたいだのぽいんたあだのって・・・なんかソレ系は、非常に敷居が高い気がして、なるべく避けて通るようにしていた命題なんですが・・・

 なんでいきなりーゆうことになったかと言うと、例のカメラですね。

 またちょっと目をしながらVFWのメッセージを眺めていて・・・

 ちょっと、ダイアログを出してみたわけですよ。これは、取りあえず送れば出る簡単なメッセージなので。

 出せるダイアログは、「VIDEOFORMAT(ビデオ形式)」「VIDEOSOURCE(ビデオソース)」「VIDEODISPLAYT(ビデオ出力)」「VIDEOCOMPRESSION(圧縮器)」の4種類あって、実際に出せるかどうかは、カメラに依存しているラシイです。

#-----------------------------------------------------------
!WM_CAP_DLG_VIDEOFORMAT=$400+41
●ビデオ形式ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)

!WM_CAP_DLG_VIDEOSOURCE=$400+42
●ビデオソースダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOSOURCE,0,0)

!WM_CAP_DLG_VIDEODISPLAY=$400+43
●ビデオ出力ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEODISPLAYT,0,0)

!WM_CAP_DLG_VIDEOCOMPRESSION=$400+46
●圧縮器ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOCOMPRESSION,0,0)
#-----------------------------------------------------------

 うちで出せたのは、ビデオ出力を除く3種類で、しかし、圧縮器とは何なのか全く分からないので無視するとして(えっ)ビデオ形式や、ビデオソースは、(別に使わないけど)ちょっとあると、本物っぽくて(?)いいかなあと思ったのが運の尽き!

 ビデオソースの方は、特に問題ありません(たぶん)

 問題は、ビデオ形式で、解像度が変えられるわけなんだけど・・・ビデオの解像度は変わりますが、当然のことながら、母艦のサイズは変わらないので、640*480の母艦の左上に、ちっちゃこいビデオ映像が表示されるとゆーことになってしまいます。

 ビデオ形式ダイアログで解像度を変更したら、変更したキャプチャーウィンドウのサイズを、母艦のサイズに反映しなくちゃいけません。

 しかも、この解像度変更は、プログラムを終了しても元に戻らんので、次起動時も見事にの状態で、起動して来ちゃうんですよね><

 起動時の母艦のサイズも、本当は、640*480で決め打ちではダメで、キャプチャーウィンドウのサイズに合わせてやらなくちゃいけなかったんです。

 ちょっと現実逃避しようと思って別のコトしたら、こっちでもまたキビシイ現実に直面するとゆう、いつものパターン><

(ちょっとリバーシについて考えはじめたのが違いの元ってゆう・・・ミニだかマックスだかアルファだかベータだか、なんかもーわけ分からんヽ(;´Д`)ノ ・・・やっぱ初心で、とりあえずはしりとりかな;)


 さてこでのキャプチャーウィンドウのサイズを知るには、「WM_CAP_GET_STATUS」で、キャプチャーウィンドウのステータスをゲットしなくちゃいけない。一体どこからゲットするかというと、「CAPSTATUS」とゆう構造体からだよって話なんです。

 winAPIでなんかかんかする場合、SETする系はたいてい、ちゃんと送りさえすればこちらが特に意識しなくても値をセットしてくれて動くんだけど、GETするにはどうやら構造体から逃れられないっぽいため、これまではつとめてGETしないよう心がけていたのです(なにそれ;)

 だって、も、こーぞーたいってなんすか・・・。しくしくしく。


 うっすらと分かっているのは、

・目的の構造体と同じ構成の、なでしこのグループを作る。
・PACKグループを構造体にする。→APIで操作。
・UNPACKで構造体をグループにする。→なでしこで操作。

 ・・・的な???

 以前やったジョイパッドを使うAPIのプログラムで使われていて、何の呪文だかさっぱり分からんと思い調べた結果、こんな感じラシイと分かったものの、理解するには到らなかったんです;;;

 しかしまーワタシも近頃は色々ひらめいて、だいぶ賢くなってきてますからっ!

 コレを使って、以前スクリーンセーバーの時に、なんだか分からんと無視した「GetWindowRect」をやってみようと思う。

 ばいなりしゅとくやかくほはいまだよく分からないけど、とりあえずPACKUNPACKで同じコトができーな気がしてきた☆

#-----------------------------------------------------------
#まずはGetWindowRectを使えるようにする。
#https://msdn.microsoft.com/ja-jp/library/cc364769.aspx
#指定されたウィンドウの左上端と右下端の座標をスクリーン座標で取得します。
#スクリーン座標は、表示画面の左上端が (0,0) となります。
#-----------------------------------------------------------
●WinRect取得(hWnd,lpRect)=DLL("user32.dll",
"BOOL GetWindowRect(
HWND hWnd,      // ウィンドウのハンドル
LPRECT lpRect   // ウィンドウの座標値
)")

#-----------------------------------------------------------
#構造体の内容でグループを作る。
#https://msdn.microsoft.com/ja-jp/library/a5ch4fda.aspx
#-----------------------------------------------------------
■WinRect
 ・左
 ・上
 ・右
 ・下

#-----------------------------------------------------------
#グループを構造体に。
#(型ってのがまた、ひとつ分からんケド、これはLONGラシイ。)
#-----------------------------------------------------------
PACK(WinRect,S,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#引数は、パックした構造体へのポインター。
#(変数Aの保持している生データへのポインタ・・・なんて言われても
#ぜんっぜんわかんないけど、深く考えず「POINTER」を使えばOK;)
#-----------------------------------------------------------
WinRect取得(母艦のハンドル,POINTER(S))
それ言う。  # 関数成功すると、0 以外の値が返ります。関数失敗すると、0 が返ります。

#-----------------------------------------------------------
#構造体をグループに。
#-----------------------------------------------------------
UNPACK(S,WinRect,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#(WinRectの右-WinRectの左)と(WinRectの下-WinRectの上)が
#母艦の幅と高さと同一ならば、正しく取得されており成功です。
#-----------------------------------------------------------
母艦の幅を表示母艦の高さを表示改行表示。
(WinRectの右-WinRectの左)を表示。
(WinRectの下-WinRectの上)を表示改行表示。

#ちなみに、「の」でも「.」でもイイっぽい。
WinRectの左を表示。
WinRect.上を表示。
WinRectの右を表示。
WinRect.下を表示。
#-----------------------------------------------------------

 でっ、できた!!(喜)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170412

2017/04/06 (木)

取りあえず辞書切り替えを試すよ!

| 15:03 | 取りあえず辞書切り替えを試すよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 取りあえず辞書切り替えを試すよ! - 雪乃☆雫のなでしこ日和 取りあえず辞書切り替えを試すよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 んなこんなで(?)なんとかとりあえず、ようやく辞書の切り替えができるようになったので、実装。

 単語リストは複数同時に使用することが出来るのだけど、はまあお試しで、完全にいっこづつ切り替える感じに。

#-----------------------------------------------------------
*辞書切り替え(DICに)
  辞書をJulius文法無効化。
  DICをJulius文法有効化。辞書=DIC。
  返事辞書=「{DIC}.adic」を開いてTSV取得。
  返事辞書からコマンドリスト作成。
  1秒待つ。
  塗り色は情報表示色。
  コマンドリストを科白表示。

*コマンドリスト作成(Aから)
  コマンドリスト=「【コマンド】{改行}」
  Aを反復
    もし対象¥0の1文字左部分=「@」でなければ、
      「 ・{対象¥0}」をコマンドリスト一行追加。
#-----------------------------------------------------------

 コマンドリスト作成は、これまで手動で

「【コマンド】{改行} ・ナコ様{改行} ・ナコ{改行} ・バイバイ」と科白表示

 などとしていたのを、辞書から単語を抜いて自動生成するようにしたもので、表示したくない語については先頭に「@」を付けとく仕様にした。

 「@ナコ」などとしておけば、コマンドの一覧には表示されないけど、うっかり呼び捨てすると怒ってくる的な(^m^)

 まあ、コマンドを表示する自体が、お試しの機能だけどね。


 でっ、いちおう「遊ぼう」とか「遊んで」などと言うと、ゲームのリスト表示される的な。

#-----------------------------------------------------------
*コマンド実行(Sで)
 辞書で条件分岐
  初期辞書ならば、Sで条件分岐
    「バイバイ」ならば終了処理。
    「遊ぼう」ならば、「game」に辞書切り替え。
  「game」ならば、Sで条件分岐
    「やめた」ならば、初期辞書に辞書切り替え。
    「@戻るならば、初期辞書に辞書切り替え。
    「サイコロ」ならば、
      「..\..\02_サイコロ\36\36Thirty-six_1_031.nako」を起動。
      ナコ様の可視はオフ。科白非表示。1秒待つ。
      WHD=「36(Thirty-six)」を窓ハンドル検索。
        (WHDの窓ハンドル表示状態=オン)の。
        「nako_sama」に辞書切り替え。
        ナコ様の可視はオン。
    「リバーシ」ならば、
      「{PROGRAMFILESパス}\nadesiko_lang\sample\ゲーム\なでリバーシ.nako」を起動。
      科白非表示。1秒待つ。
      WHD=「*)の番です」を窓ハンドル検索。
        (WHDの窓ハンドル表示状態=オン)の。
        「nako_sama」に辞書切り替え。
#-----------------------------------------------------------

 「サイコロ」と「リバーシ」とほぼ同じコードが並んでるけど、気にしないで!

 希望どうりに辞書が切り替わったり、プログラムを起動したりできることを確認しました。

 ああ~、ひらめいた!

 リバーシなら、どうせなら音声で、ブラインドで打てるようにしたいね。

 ずっと以前、相棒で右京さんがAIとチェスをやってたけど、なんかかっこいいよね~♪

 まあ、ワタシの方にの能力が無いんだけど;;;;;

 しかも・・・

 コンピューターが何かを考えるようなゲームは、まだ作ったことがないんだよね~。

 前になでリバーシを眺めたけど、なんだかよく分かんなかったし><

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170406

2017/04/04 (火)

画面をクリップボードにコピー

| 15:55 | 画面をクリップボードにコピー - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 画面をクリップボードにコピー - 雪乃☆雫のなでしこ日和 画面をクリップボードにコピー - 雪乃☆雫のなでしこ日和 のブックマークコメント

 これまで、カメラの映像の静止画を取得するために使っていた窓内側キャプチャですが、コレがどうもなかなかの遅さですね。

 ワタシは別に、リアルタイムの処理を行おうとかしてないから、困らないけどねw

 でも、速度はともかく、窓内側キャプチャだと、フルスクリーンにしている時に行うと、の画面に合わせて引き延ばされた画像が保存されてしまうんだよね。

 の方がイイという場面もあるかも知れないけど、どっちかっていうと、拡縮やトリミングは後からでも出来ることだから、本来のとうりの絵を取れた方がよさげ。

 なにしろレターボックスにしてたら、の枠まで入っちゃうんだもんね;

 さてこで発見してきたのが、画面をクリップボードコピーするメッセージ。

 正確には「ビデオフレームバッファと関連するパレットの内容をクリップボードコピーします。」とゆうことなんだけど、なんだかよく分からん;

 でも取りあえずコレで、キャプチャーウィンドウの内容がクリップボードに入り、ペイントとかに貼り付けることも出来ました!

#-----------------------------------------------------------
!WM_CAP_EDIT_COPY=$400+30    # 画面をクリップボードコピー。
●クリップボードコピー(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_EDIT_COPY,0,0)
#-----------------------------------------------------------

 クリップボードの画像をイメージ部品に取得するのは、イメージ部品の画像を「クリップボード」と指定します。(「」が必要

#-----------------------------------------------------------
*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルをクリップボードコピー。
  処理用の画像は「クリップボード」
  処理用をファイル名へ画像保存。
#-----------------------------------------------------------

 一見これまでと同じように動作しますが、フルスクリーンの場合には、元のキャプチャーウィンドウのサイズどうりの静止画が保存されるようになりました。

 して、どうやらこっちの方が、かなり高速な印象。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170404

2017/04/03 (月)

文法ファイルの無効化・有効化

| 17:14 | 文法ファイルの無効化・有効化 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 文法ファイルの無効化・有効化 - 雪乃☆雫のなでしこ日和 文法ファイルの無効化・有効化 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 文法ファイルを、一時的にオンオフするコマンドを追加しました。

 ステータスやバージョン同様、Juliusのモジュールモードに備わっているコマンドを送信できるようにしただけですが。

#-----------------------------------------------------------
#任意の記述文法または単語リストを一時的に無効化/有効化する。
# Sは、jconfに記載した文法ファイル名の拡張子を除いたもの、またはJulius文法情報で返されるID。
●Julius文法無効化(Sを|Sの)
  「DEACTIVATEGRAM{\n}{S}{\n}」をJクライアントで送信。
  「SYNCGRAM{\n}」をJクライアントで送信。

●Julius文法有効化(Sを|Sの)
  「ACTIVATEGRAM{\n}{S}{\n}」をJクライアントで送信。
  「SYNCGRAM{\n}」をJクライアントで送信。
#-----------------------------------------------------------

 しか~し、ここに到るまでには、思いもかけない艱難辛苦の道がっっ!!!(嘘;)

 コマンドについては、Julius bookの、この表を参考にしてました。

https://julius.osdn.jp/juliusbook/ja/desc_module.html#table_commands_grammar

 無効化の方は、最初引数は半角スペースでつなげるのかと思いきや、一旦改行を送るんだったよ! という点以外は特に問題も無く、無効化できるようになったんです。

 ところが、なんとしても有効化がうまくいかないっ。なんでだ(涙)

 ・・・っと思っていたら・・・・・

 ようくようくようく表のコマンドを見たらね、「ACTIAVETGRAM」って書いてあるんです。

 スペル、違ってる?!?!?!

 AとV、EとTがダブルで入れ替わっているとゆう・・・ヽ(;´Д`)ノ

 えーえー、安直にコピペしたワタシが悪いんですともさ(号泣)

 たぶん、英語の分かる人が手打ちした場合、こんなことは起こらないんだろう。

 違和感を覚えてすぐ違ってる!と気付くか、あるいは人の脳は逆に、文字が入れ替わっている綴りを見ても、勝手に脳内修正して正しく読んでしまったり、手が覚えてるとうりに正しく書いてしまったりする機能が付いているからね。

 ワタシなんか・・・すぐ上に「DEACTIVATEGRAM」が無かったら、一生分からなかったカモ;;;

 しくしくしくしく。



 とっ、とにかくこれで、複数のリストを登録して置いて切り替えたりなどできるようになりました。

 会話ごとに最小構成のリストを使った方が、誤認識は少なそうな予感。

 文法データ自体を追加したり、削除したりするヤツもあるみたいだけど、なにげに面倒・・ってゆうか、よくわからん(@_@)

 しかしまあ、必要の単語リストは最初から全部登録して置いて、必要に応じてオフオンする方が、効率的で処理も速そうに思います。

 コレでたとえば、ナコ様を呼んで、「なーに?」と答えた後、別のリストを与えて、ナコ様に何かをお願いする・・・的なことが可能?

 たとえば「ゴミ投げて」など言ったら、「rd /s /q c:\$Recycle.Bin」を起動して、ゴミ箱をにする、とかとか?

 音声認識のランチャーなどは、実用とゆうことを考えたら、もJuliusをモジュールモードで起動しっぱなしにしておかなきゃない時点でびみょーだけど(タスクトレイに隠せればまだいいんだけど・・・)

 ・・・ソレが何かの役に立つのか?!なんてコトは考えちゃダメ(爆)

 とゆうわけで、前ひらめいたとうり、「しりとり」をしてくれるナコ様を作ろうと思う。

 ちょっと、しりとりようの辞書なんかは、まるっと別にして置いた方がイイだろうと思ったばっかりに、こんなことになったのだ><;

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170403

2017/03/31 (金)

ウィンドウスタイルの設定で大間違いを犯していたラシイ・・・

| 00:51 | ウィンドウスタイルの設定で大間違いを犯していたラシイ・・・ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ウィンドウスタイルの設定で大間違いを犯していたラシイ・・・ - 雪乃☆雫のなでしこ日和 ウィンドウスタイルの設定で大間違いを犯していたラシイ・・・ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 カメラのプログラムを見返していて・・・とんだことに気が付きました。

 ウィンドウスタイルのフラグ?を設定するについて、盛大な勘違いをしていたっぽいです(汗)

 とりあえず、このよーに指定していたわけですが・・・

!WS_VISIBLEとは整数=$10000000  #(初期状態)
!WS_CHILDとは整数=$40000000   #(子ウィンドウ)
CWスタイルとは整数=WS_VISIBLE+WS_CHILD  #キャプチャーウィンドウのスタイル

 元ネタのコードを見ていたらね、なんと「+」ではなく「OR」でした!

 「和」ではなく「論理和」。日本語で言ったら「または」。

× CWスタイルとは整数=WS_VISIBLE+WS_CHILD
  ↓ ↓ ↓
○ CWスタイルとは整数=WS_VISIBLE||WS_CHILD

 マニュアルによると「||」が「OR」のコトらしく「(WS_VISIBLE)OR(WS_CHILD)」と同じことです。

 つーか、も論理和って何?

 またはって言ったら、どっちかってことじゃないんすか><


 ちなみに・・・

 「WS_VISIBLE+WS_CHILD」と「WS_VISIBLE||WS_CHILD」

 答えはどちらも「$50000000」となり、それゆえ特に問題は起こりません。

 では、一体何が違うのか。

 てゆうかだから、論理和って一体なんなの?!


マニュアル→(ハ)機能の紹介→計算→論理演算のための演算子

https://nadesi.com/doc/reference/syntax/1-7-calc.htm#head4

 さらっと「比較式Aがまたは比較式Bがならば(=1)を返し、違えば(=0)を返します。」なんて言われてもね。

 なでしこは、初心者向けかと思いきや、マニュアルは「のくらいはフツー知ってるよね」くらいの感じでスルーされているので、ワタシのよーにプログラムの基本のキの字も知らない人は、こんな些細なことで、いちいちまごまごしてしまう><


機能→機能/論理演算→あなたは論理演算がわかりますか?(ITPro)

http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20020731/1/

 むむむぅ、こんなのが5分で分かる人の頭脳が、むしろ信じられんね(´д`;


 さて、5時くらいかけて(嘘)、なんとなく理解したところによると・・・

 とりあえず、まず第一にこの計算は、二進数によってとりおこなわれるってことです。コンピューターなんで!

 して、日本語の「または」にとらわれすぎると、なんだかよく分かんなくなる。

 ようするに、どれかいっこでも1だったら、1

 逆に言うと、ぜんぶ0だった場合だけ、0

 したがって、繰り上がらない!!

 でっ・・・

 「1 OR 4」を、二進数にし、このルールに則って縦計すると、

    0000 0001
OR  0000 0100
-------------
    0000 0101

 8ビットにすれとかなんとか書いてたから、いちおうのように。

 答えは5で、一見足し算の結果と同じみたいだけど、足し算と違うのは、「1 OR 1=1」だってこと。

 「1+4+1」の答えは6ですが、「1 OROR 1」の答えは、5です。

    0000 0001
    0000 0100
OR  0000 0001
-------------
    0000 0101

 この効用は、アレですかねー。

 もし違えて、フラグを「WS_CHILD||WS_VISIBLE||WS_CHILD」みたいに重複して設定してしまっても無視されて、あらぬ値が設定されて大変大変!とゆう事件にならない的な?

 いやたぶん、もっと他にも深遠な意味があるんだろうけど。


 ああぁ、AnimateWindowのアニメーションの種類なんかも、みんなそうだったんだ・・・

 時ある時、コソッと直;;;


 明日になったら、またなんだかよく分からなくなってるかもしないので(えっ;)、このように書き残しておく。

 してまた、もしかしてもしかしたら、おんなじようにまごまごする人がいないとも限らないので、恥も外聞も無く、発表しておく><

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170331

2017/03/29 (水)

脳トレ2 じゅんばん!

| 16:33 | 脳トレ2 じゅんばん! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 脳トレ2 じゅんばん! - 雪乃☆雫のなでしこ日和 脳トレ2 じゅんばん! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 取りあえず完成させたから載せとく。

 難易度で、文字の大きさがランダムな問題の他、表示で、逆順や、アルファベットもできるようにしてみました。

 御用とお急ぎのない方は、是非、アルファベットの逆順を試してみて欲しいです。

 ワタシは・・・いっこ選ぶごと、いちいち頭からABCの歌を歌わないと次が選択出来ない(爆)

 コンピューターと違って、人の頭ってそうゆうもの。


 ・・・違うか;

 × 人の頭 → ○ ユキノの頭

#-----------------------------------------------------------------------
# じゅんばん!
#-----------------------------------------------------------------------

#-----母艦設計----------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#---メニュー----
『#親部品名,部品名,テキスト,ショートカット,オプション,イベント
なし,ファイルメニュー,ファイル(&F),,,
 -,新規メニュー,新しいゲーム(&N),Ctrl+N,,新規ゲーム
 -,-,,,,
 -,閉じるメニュー,閉じる(&X),Ctrl+X,,終わる
なし,設定メニュー,オプション(&O),,,
 -,難易度メニュー,難易度(&L),,,
 --,練習メニュー,やさしい(&E),,チェック,易に難易度変更
 --,本番メニュー,むずい(&H),,,難に難易度変更
 -,-,,,,
 -,表示メニュー,表示(&V),,,
 --,数字メニュー,123(&S),,チェック,数に表示変更
 --,数字逆順メニュー,321(&R),,,数逆に表示変更
 --,英字メニュー,ABC(&A),,,英に表示変更
 --,英字逆順メニュー,ZYX(&Z),,,英逆に表示変更
なし,ヘルプメニュー,ヘルプ(&H),,,
 -,ルールメニュー,遊び方(&R),Ctrl+R,,遊び方
 -,-,,,,
 -,バージョンメニュー,バージョン情報(&A),Ctrl+A,,バージョン
』をメニュー一括作成。

*難易度変更(Aに)
  もし、A=易ならば、
    練習メニューチェックオン。本番メニューチェックオフ。難易度は易。
  違えばもし、A=難ならば、
    練習メニューチェックオフ。本番メニューチェックオン。難易度は難。
  新規ゲーム。

*表示変更(Aに)
  もし、A=数ならば、
    母艦のタイトルは「じゅんばん!」
    数字メニューチェックオン。英字メニューチェックオフ。
    数字逆順メニューチェックオフ。英字逆順メニューチェックオフ。
    表示文字は数。文字幅=「0」の文字幅取得*2
  違えばもし、A=英ならば、
    母艦のタイトルは「じゅんばん!」
    数字メニューチェックオフ。英字メニューチェックオン。
    数字逆順メニューチェックオフ。英字逆順メニューチェックオフ。
    表示文字は英。文字幅=「0」の文字幅取得
  違えばもし、A=数逆ならば、
    母艦のタイトルは「じゅんばん! ~逆順~」
    数字メニューチェックオフ。英字メニューチェックオフ。
    数字逆順メニューチェックオン。英字逆順メニューチェックオフ。
    表示文字は数逆。文字幅=「0」の文字幅取得*2
  違えばもし、A=英逆ならば、
    母艦のタイトルは「じゅんばん! ~逆順~」
    数字メニューチェックオフ。英字メニューチェックオフ。
    数字逆順メニューチェックオフ。英字逆順メニューチェックオン。
    表示文字は英逆。文字幅=「0」の文字幅取得
  新規ゲーム。

#---母艦----
母艦のタイトルは「じゅんばん!」
母艦白色画面クリア母艦のスタイルは「枠固定」
母艦オフに最大化ボタン有効変更。
母艦のクライアント幅は800。母艦のクライアント高さは600。
母艦中央移動
母艦のマウス押した時は~
  もし、(C+1<10)かつ(表示文字=数)ならば、MH=文字幅/2  #一桁の時
  違えば、MH=文字幅
  もし、(母艦のマウスX>(正解¥C,0))かつ
  (母艦のマウスY>(正解¥C,1))かつ
  (母艦のマウスX<(正解¥C,0)+MH)かつ
  (母艦のマウスY<(正解¥C,1)+文字高)ならば、
    文字色赤色文字書体は「|{正解¥C,2}|太字」
    もし表示文字=数ならば、
      母艦の(正解¥C,0),(正解¥C,1)へC+1を文字表示。     #画面に数字表示
    違えばもし表示文字=英ならば、
      母艦の(正解¥C,0),(正解¥C,1)へ(ABC¥C)を文字表示。  #画面にABC表示
    違えばもし表示文字=数逆ならば、
      母艦の(正解¥C,0),(正解¥C,1)へ(30-C)を文字表示。
    違えばもし表示文字=英逆ならば、
      母艦の(正解¥C,0),(正解¥C,1)へ(ZYX¥C)を文字表示。
    もし、(「{ランタイムパス}tools\pi.wav」の存在はいならば
      「{ランタイムパス}tools\pi.wav」をWAV再生。
    違えばもし、(「{PROGRAMFILESパス}nadesiko_lang\tools\pi.wav」の存在はいならば
      「{PROGRAMFILESパス}nadesiko_lang\tools\pi.wav」をWAV再生。
  違えばBEEP母艦のマウス離した時は~
  もし文字色赤色ならば、
    文字色黒色文字書体は「|{正解¥C,2}|太字」
    もし表示文字=数ならば、
      母艦の(正解¥C,0),(正解¥C,1)へC+1を文字表示。     #画面に数字表示
    違えばもし表示文字=英ならば、
      母艦の(正解¥C,0),(正解¥C,1)へ(ABC¥C)を文字表示。  #画面にABC表示
    違えばもし表示文字=数逆ならば、
      母艦の(正解¥C,0),(正解¥C,1)へ(30-C)を文字表示。
    違えばもし表示文字=英逆ならば、
      母艦の(正解¥C,0),(正解¥C,1)へ(ZYX¥C)を文字表示。
    描画処理反映。
    C=C+1。
    もし、C=MAXならば、
      ダイアログタイトルは「じゅんばん!」
      終了
      開始時から終了までの秒差で経過時計算。
      「おめでとう!{改行}{改行}タイムは{改行}  {それ}です。」と言う。
      「もう一度?」で二択。
      もしそれはいならば、新規ゲーム。
      違えば終わる。
#-----------------------------------------------------------------------

#-----宣言--------------------------------------------------------------
表示位置とは配列。
正解とは配列。
Cとは整数。
MHとは整数。
MAXとは整数。
難易度とは文字列。難易度=「易」
表示文字とは文字列表示文字=「数」
ABCとは配列。ABC=「ABCDEFGHIJKLMNOPQRSTUVWXYZ」
ABCはABCを文字列分解。
ZYXとは配列。ZYX=ABC。ZYXを配列逆順文字書体は「|32|太字」
文字幅とは整数。
文字高とは整数。

開始時とは整数終了とは整数。
カウントダウンとは配列=「③{~}{~}①」
CDとは整数。
#-----------------------------------------------------------------------

#-----メインルーチン----------------------------------------------------
母艦の可視はオン乱数初期化表示位置設定。
遊び方。
新規ゲーム。

*新規ゲーム
  C=0
  表示位置を配列シャッフル。

#---カウントダウン----
  母艦白色画面クリア。
  文字書体は「|64|太字」
  x=(母艦のクライアント幅/2)-(「①」の文字幅取得/2)
  y=(母艦のクライアント高/2)-(「①」の文字幅取得/2)
  CD=3
  3
    もし、CD>0ならば、
     母艦のx,yへカウントダウン¥(回数-1)を文字表示。
     1秒待つ。CD=CD-1。
     母艦白色画面クリア。
    違えば抜ける。

#---問題作成----
  母艦白色画面クリア。
  文字書体は「|32|太字」。r=32
  もし、(表示文字=数)または(表示文字=数逆)ならば、
      MAX=30。
      文字幅=「0」の文字幅取得*2。文字高=「0」の文字高さ取得。
  違えばもし、(表示文字=英)または(表示文字=英逆)ならば、
      MAX=26。
      文字幅=「A」の文字幅取得。文字高=「A」の文字高さ取得。

  MAX
    もし、難易度=難ならば、
      rは30の乱数。r=r+10。
      文字書体は「|{r}|太字」
    x=(母艦のクライアント幅/6-文字幅)の乱数。
    x=x+表示位置¥(回数-1),0
    y=(母艦のクライアント高/5-文字高)の乱数。
    y=y+表示位置¥(回数-1),1
    正解¥(回数-1),0=x。正解¥(回数-1),1=y。  #正解の位置を記録
    正解¥(回数-1),2=r              #正解の文字サイズを記録
    もし表示文字=数ならば、
      母艦のx,yへ回数文字表示。        #画面に数字表示
    違えばもし表示文字=英ならば、
      母艦のx,yへABC¥(回数-1)を文字表示。  #画面にABC表示
    違えばもし表示文字=数逆ならば、
      母艦のx,yへ(31-回数)を文字表示。
    違えばもし表示文字=英逆ならば、
      母艦のx,yへZYX¥(回数-1)を文字表示。

#---開始時----
  開始時表示位置設定
  30
    表示位置¥(回数-1),0=((回数-1)%6)*(母艦のクライアント幅/6)を切り下げ。
    表示位置¥(回数-1),1=((回数-1)/6を切り下げ)*(母艦のクライアント高/5)を切り下げ。
#------------------------------------------------------------
*遊び方
  ダイアログタイトルは「じゅんばん!について」
  「【じゅんばん!】
   ランダムに並んだ数字やアルファベットを、順番通りに
  出来るだけ早くクリックして下さい。
   
   オプションで、難易度と、数字/アルファベットを変更
  することが出来ます。」を言う。
#------------------------------------------------------------
*バージョン
  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}じゅんばん!{二重カッコ閉じ}{改行} Version 1.00{改行}{改行} by 雪乃☆雫」と言う。
#------------------------------------------------------------
#------------------------------------------------------------
#秒差から00時00分00秒の形式で、経過時を返す。
●経過時計算(Aで)
  時=(A/3600)を切り下げ。
  分=((A-(時*3600))/60)を切り下げ。
  秒=(A)-(時*3600)-(分*60)
  時=時を2でゼロ埋め。分=分を2でゼロ埋め。秒=秒を2でゼロ埋め
  もし、(時=0)かつ(分=0)ならば、
    それは「{秒}秒」。
  違えばもし、時=0ならば
    それは「{分}分{秒}秒」。
  違えば、
    それは「{時}時{分}分{秒}秒」。
#------------------------------------------------------------

 ・・・突然何の脈絡も無くこーゆうのをぶち込む時ってのは大抵、ネタが切れてるか、何かで行き詰まってる時なんだよね(汗)

 いまのところ、ゆりうすで遊んでいる件は、まだネタ切れにはなっていないから・・・・・・しくしくしくしく(ToT)

めだかめだか2017/03/31 04:37お久しぶりです~~~~
この時間まで、ずっとぷろぐらむ組んでいますw

2日かけてようやく動体検出もどきをつくることが出来ました(笑)改良の余地はありそうです!まだまだこれからです・・・


それはそうとです!
以前、雪乃さんに作って頂いたカメラぷろぐらむがあったじゃないですか。あの子を頑張って理解したり、あわよくばいじってやろうかな~とか思っていたんですよ。
で、見るじゃないですか・・・

「これ・・・どゆこと・・・?」


もうお手上げです\(^o^)/

そもそもの、APIなんざさっぱりなので、これがなんの命令だとかがわからないのですっ!
さらに、自分が組んだものでも理解には1日潰す勢いな私ですので、他人がかいたとなれば・・・うぐっ・・・

ということです・・・(どういうことだよっ
よろしければ、とってもわかりやすく、なでしこ初心者、いや...猿でもわかる様な解説を頂けると幸いですぅ・・・^^;

特に今回は、リアルタイム処理を目的としますので、カメラに映った映像がどれに代入されて、どの様に処理をされているのか、どうすればいいか。また、その映像はどうすれば映せれるか(ウィンドを増やすに近い感じです)の辺りを重点的に教えて頂けると、嬉しいです。とっても嬉しいです。本当にうれしいです。はい。(しつこい←

また、なでしこでその様な処理は可能か、もし、不可能ならば、それに近い(または同等の結果を得られる)方法なども教えて頂けると幸いなのです!

長々と語ってしまいましたが、一番重要なことは、雪乃さんのレベルが高すぎて私じゃまだ理解が出来てないってことですよ!!!(笑)

プログラムも、なるべく早めに完成させて改良を地道にしていきたいので、失礼を承知で雪乃さんにこうして頼み込んできた次第でございますぅぅぅ

深夜テンションで文もあれですが、是非お願いします。それでは、失礼します。

雪乃☆雫雪乃☆雫2017/03/31 14:43 お疲れ様です。ほとんど徹夜ですね~w
 ワタシはその頃、もーお弁当作ってたよwww

 いや、心配しなくても、ワタシなんぞは自分が作ったモノを思い出すのも、数日潰す勢いですよ(爆)
(なでしこだからそのくらいで済むんであって、昔HSPとかでしたのなんか、もうムリ;;;)
 しかも、説明したりするのとか、頭悪いから苦手なんだよねぇ~ヽ(;´Д`)ノ

 APIは、前書いたとうり、「DestroyWindow」は最後に破棄するだけのヤツだから、実際のところは「capCreateCaptureWindow」と「SendMessage」の二つだけで、「capCreateCaptureWindow」でキャプチャーウィンドウを作り、そのハンドルに「SendMessage」で色々メッセージを送って操作してるだけなんです。
 カメラに写った映像は、カメラ接続のメッセージを送ることによって、キャプチャーウィンドウに映ります。

 それとも、分からないのは、メッセージのほうかしら。
 「WM_CAP_DRIVER_CONNECT」だの、「WM_CAP_SET_PREVIEW」だのみたいな?
 これはいっぱい種類があって、しかもリファレンスが英語のページしか無いっぽいので、正直よく分かんないんだけど、自分が使ったヤツに関してはだいたい説明出来るとは思うけど、一応全部コメント付けてるつもりなんだよね~(自分のためにだけどw)
 そして、それ以上のことはそんなに分かってないとゆうwww

 一番重要なことは・・・ワタシのレベルは全く高くなく(むしろ低すぎ><)顔認識も動体検出もまったくカケラもそーぞーすらつかないので・・・
 差し支えなければ、ちょこっと教えて欲しいす・・・
 でないと、「そのような処理」ってどのような処理をしようとなさっているのか自体が、今ひとつピンと来てないってゆうかなんとゆうか、むしろさっぱりわからんのですよ(ToT)

 ただ、たぶん、この場合は、「なでしこで可能か」というよりは、「VFWで可能か」って話になってくるんじゃないかと思われ・・・(?)

めだかめだか2017/03/31 23:02早々のお返事有り難うございますー

私も少しVBSあたりを触っていたのですが、思い出すのも一苦労でしたw
そもそも文法と言いますか..あれさえも忘れる勢いですよw

ぎょえぇーwお疲れ様ですぅー
どうも完成していないのが悔しい?感じで、晩御飯中ですが返信です!


むむむ...やはりAPIが絡んできた途端いつも以上に理解に苦しむ...
もういっそのこと、1行づつ解説して頂きたいぐらいです(´;ω;`)

あっ...これは説明不足でしたw今のところ考えているのは、そのような処理=カメラに写しだされている映像を1フレームごとに抜き取る、又は、映像に直接処理をかける(恐らく、かなりのスペックを要する)、といったところでしょうか...

顔検出については、どうやら調べていくうちに動体検出→顔検出という様にグレードアップ?していく様な気がしたので放置ですw
恐らく、動体検出が、顔検出を行う際の基礎となるようです。

なので、動体検出の説明となりますが、ご了承くださいTT

簡潔に言いますと、画像の色や大きさをいじって、検出率、速度を上げる感じです。
検出を行う際に、確率(速度)を上げるため一般的にも用いられているグレイスケール化を行う予定です。その前だったり後だったりに、さらに上げるために色々な処理も施す予定ですかね...
検出自体は、色々な方法がありますが、今回はフレーム間の差分で判別をしてみようと思っています。

ざっとこんな感じです〜。もう、説明とか苦手です...(笑)
でも、プログラムを完成させるためっ...と頑張りました(泣
ど、どうか...ご理解..ください...w

あ、それと、すっごく勝手なことなのですが、画像なども送りたいなと最近思い始めまして...で、私、色々とさっぱりなので、ツイッターやスカイプとかでしか画像を送る方法が思いつきません!なにかいい案はありませんでしょうか〜
雪乃さんがよろしければ、ツイッターやスカイプでもこちらとしてはいいのですが...

雪乃☆雫雪乃☆雫2017/04/01 04:26 カメラのプログラムを見返してるうちに、とんだ間違いに気付き、昨日はすっかりそっちにはまってしまいました;;;
 まったく、ワタシのレベルなんて、ほんとうにこんな物><
 とゆうわけで(?)解説はもうちょっと待って下さいね~。
 ・・・って、そんなたいした解説が出来る見込みはないんですが。

 むむむ。知恵が足りなすぎて、結局イマイチ理解してないけど・・・(@_@;
 「カメラに写しだされている映像を1フレームごとに抜き取る」のは、現状の「*画面キャプチャ」で行っている、窓内側キャプチャでは不都合なのかな。
 プログラムでは、キー入力のイベントを受けて窓内側キャプチャを行い、それをpngで画像保存しているけど、フレームレートは「WM_CAP_SET_PREVIEWRATE」でms単位で指定しているので、その間隔で自動的に窓内側キャプチャしていくような(?)

 ワタシも、さらに一段と色々さっぱりなので、ツイッターもスカイプもやってないんだよね~。
 やっぱり時代はソレ系なんですかね。いまや、写メは死語だっていうんだからね。しくしく。
 どっちかIDでも作ってみたらよいのでしょうか。どっちがいいんですかねー?

めだかめだか2017/04/02 00:48書き込みしようかな→寝落ち→今起床です。とっても困っていますwww

間違いに気づかない程、無知な私であります...w
自分のプログラムの欠陥(ミス)って、上手いこと動いてくれているとなかなか気づかないもんですよねw他人から指摘されたりとかでようやく...w

私もその方法ならいけるかなって、思って試してみたんですが、どうも上手いことキャプチャした画像が出てこないんです~
プログラムの方は、もう1個新しいフォームを作りまして、そこへキャプチャしたイメージ(処理用へ代入される奴ですよね...?)を描画させる様に組んでみたところ、フォームはちゃんと表示されるんですが、どうもキャプチャした画像が表示されないという事件が起こりまして...

イメージ部品もきちんと、親部品の指定、可視設定、X,Y,W,Hを決めたりしましたが、どうも表示されないんですぅ...
プログラムの問題ですよねぇ...これ...w

昨日は書き込みした後ですぐ寝てしまったので、もう少し詳しい調査が出来てないのであれですが、思いつくのは一応全部はしてみました...
ネットで情報を集めてみようかなとは思っていますが、連日徹夜でもうおねむの限界です...w明日からまたやってはみようと思いますが、自分の力だけで果たして上手くいくかどうか...w


写メ時代のお方でしたかw親も昔は言ってたなぁー...と思い出しましたw最近はそもそもメールを使いませんからねw
流れははやいっ!

そうですね...私どっちかっと言うとせっかちなので、早く返信が欲しいっ!とか思っちゃったりしちゃいます(笑)
それと、今回の様に、プログラムをみせたりだとか、エラーとかを見せる際はやはり画像があった方がわかりやすいと思うんです...
絶対お願いします!!までは、言えませんが、雪乃さんが宜しければスカイプぅ.....とかで、コミニュケーションとれたら嬉しいなぁー...とは、思っていますw
すっごいぶしつけなお願いで恐縮ですが、いいでしょうか...?

雪乃☆雫雪乃☆雫2017/04/02 15:14 んんん~?
 窓内側キャプチャした画像を、ファイルに保存するんじゃ無くて、別のフォームを開いてそれに表示したいってことですよね??
 それはもーAPIは関係ないはず。
 ↓こうゆうことではない???

#キャプチャ画像を表示
#-----宣言--------------------------------------------------
CW幅とは整数=640。CW高さとは整数=480。
CWハンドルとは整数=-1  #キャプチャーウィンドウのハンドル。
#---ウィンドウスタイル定数-----
!WS_VISIBLEとは整数=$10000000  #(初期状態)
!WS_CHILDとは整数=$40000000   #(子ウィンドウ)
CWスタイルとは整数=WS_VISIBLE||WS_CHILD  #キャプチャーウィンドウのスタイル

カメラ接続状態とは整数=オフ。
フレームレートとは整数=60      #ミリ秒単位

#---GUI-----
処理用とはイメージ。その可視はオフ。

表示用フォームとはフォーム。
これについて
  可視はオフ。
  タイトルは「キャプチャ画像表示用」
  クライアント幅はCW幅。クライアント高さはCW高さ。

表示用イメージとはイメージ。
これについて
  可視はオン。
  親部品は表示用フォーム。
  位置は「0,0」
  幅はCW幅。高さはCW高さ。

#---母艦-----
母艦について
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  オフに最小化ボタン有効変更。
  タイトルは「PCカメラキャプチャー」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、キャプチャ画像表示。  # Enter
母艦を黒色で画面クリア。
母艦を中央移動。
#-----------------------------------------------------------

#-----メイン------------------------------------------------
カメラ起動

#-----------------------------------------------------------
*カメラ起動
  キャプチャーウィンドウ作成("",CWスタイル,0,0,CW幅,CW高さ,母艦のハンドル,0)
  CWハンドルはそれ。1秒待つ。
  5回
    CWハンドルにカメラ接続。
    1秒待つ。
    もし、それがはいならば、カメラ接続状態はオン。抜ける。
  もし、カメラ接続状態がオフならば、
    CWハンドルをウィンドウ破棄。
    「カメラに接続出来ませんでした」と言う。
    終わる。
  CWハンドルをフレームレートにプレビューレート設定。
  CWハンドルをオンにプレビューモード設定。

*キャプチャ画像表示
  CWハンドルを表示用イメージへ窓内側キャプチャ。
  表示用フォームの可視はオン。

*終了処理
  CWハンドルからカメラ切断。
  CWハンドルをウィンドウ破棄。
  終わる。
#-----------------------------------------------------------
※↓のビデオキャプチャー以下の部分を貼っ付けて実行。エンターキーでキャプチャ画像表示。
https://nadesiko.g.hatena.ne.jp/snowdrops89/20170211/1486826334

 
 それではこれから、すかいぷを学びます(そっからか!)
 写メ時代とゆうよりむしろケータイなんてなかったとゆう・・・(ToT)
 親も・・・昔は・・・言ってた・・・。しくしくしくしく。

めだかめだか2017/04/02 21:53お返事ありがとうございます~

そうなんですよ!API関係ないし、これなら僕にでもできるや!と思ったんですよ!なのに、できない!なんでぇぇ!?でした。はい。

今、プログラムみましたが、自分が組んだプログラムとそう違いはないんですぅ・・・何が原因だったのでしょうか・・・?
もしかして、はじめに、可視をオフにしていなかったのが、だめだったのかな・・・?と思っていますー
GUI関連は、最近(というか、今回ので初めて)触ったので、よくわからない部分が多いんですー
これからやろうかと思って、その試作じゃないですけど、課題で今回の動体検知しようと思ったのですが、思った以上にレベルが高かったですw

これはもう雪乃さんのプログラムをいじって完成という勢い・・・やばいですね・・・w


すかいぷは、ちょっとなれるまで難しいですが、慣れれば楽です!
大体の年齢ばれちゃいますよ!雪乃さん!

雪乃☆雫雪乃☆雫2017/04/03 04:25 可視は、最初からオンでも問題ないですよ~。
 キー入力で開くようにしたかったからそうしただけ~。
 これはもう、実際に書いたモノを眺めてみないとわからんけど、きっとモノスゴク些細なことですよ(^m^)

 すかいぷ・・・いちおうインストールしてアカウント?は出来たんだけど、それからいったいどうしたらいいのか;;;
 めそめそ。むしろ、いっそ、飛脚の・・・!

めだかめだか2017/04/03 15:24とってもお早い時間の返信でびっくりですw

あら~~~???じゃあ、何がいけなかったのでしょうかね・・・
こればっかりは、本当に謎ですね・・・


ご苦労様であります(`・ω・́)ゝ
では、てきとーに「medaka2000」を追加してもらえればうれしいですーw

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170329

2017/03/18 (土)

Juliusで音声認識して、AquesTalkでしゃべるナコ様

| 07:15 | Juliusで音声認識して、AquesTalkでしゃべるナコ様 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - Juliusで音声認識して、AquesTalkでしゃべるナコ様 - 雪乃☆雫のなでしこ日和 Juliusで音声認識して、AquesTalkでしゃべるナコ様 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 前に、サイコロで、対戦相手としてナコ様を表示させた時に、デスクトップマスコットにしてみようかなーと思い、方向の変えられる吹き出しを作ってみたりしてたんだけど・・・

 画面に表示させて、時々ランダムトークしたりするのなんて、「伺か」とかでよくない? ・・・ってゆうね;

 実際、「nako.png」をシェルにして、いろいろしゃべらすくらいのゴーストは実に簡単に作れたんです。しくしくしく。


 と、ゆうわけで?! ひらめいた☆

 Juliusで音声認識して、AquesTalkでしゃべるナコ様を作るよ!

 実用性は、限りなくゼロです;;;

 して、世の中にはそういった様な物も当然既にあるだろうし、ベースがJuliusの単語リストとなでしこに付属しているAquesTalk(1なので声が変えれない~)だから、大した物にはならないだろうけれども、気にしないで!

 「伺か」くらい、それなりに高性能で、しかもフリーで、好きな画像とテキストで簡単にできるツールがない(・・・のか?)以上、ワタシ的には意味がある! ・・・かも知れないwww

 AIっぽく、しりとりくらい出来るといいかねえ♪


 それでまあ、とりあえずこんな感じ。

# Juliusで音声認識してAquesTalkで喋るプログラム
#-----------------------------------------------------------------------
!「Julius.nako」を取り込む。
!「aquestalk.nako」を取り込む。
!母艦設計=「母艦の可視はオフ」

#-----設定---------------------------------------------------
Julius起動バッチとは文字列=「{母艦パス}nakotto.bat」

発声フラグ=オン。   # AquesTalkで喋らせるかどうか。
科白表示フラグ=オン。 # 科白を全て吹出に表示するかどうか。
#------------------------------------------------------------

#-----宣言---------------------------------------------------
科白種別=。
吹出表示状態=オフ。
返事辞書=「nako_sama.adic」を開いてTSV取得。
AQH=AQT開く  # AquesTalkハンドルの取得。
#------------------------------------------------------------

#-----色定数-------------------------------------------------
!通常科白色=$EEBBCC
!情報表示色=$CCCCEE
#------------------------------------------------------------

#-----GUI-------------------------------------------------
#なこ様
ナコ様とはなこ。
これについて
  可視はオフ。
  X=デスクトップワークエリアW-ナコ様の幅。
  Y=デスクトップワークエリアH-ナコ様の高さ。
  マウス押した時は~
    吹出の可視はオフ。吹出右の可視はオフ。
  マウス離した時は~
    もし、Y-吹出の高さ+50<0ならば、Y=吹出の高さ-50-20。
    もし、Y+ナコ様の高さ>デスクトップワークエリアHならば、Y=デスクトップワークエリアH-ナコ様の高さ
    もし、X-吹出の幅<0ならば、
      もし、X<0ならば、X=0。
      吹出右の位置=「{ナコ様のX+ナコ様の幅-80},{ナコ様のY-吹出の高さ+50}」
      もし、吹出方向=「右上」でなければ、吹出方向は「右上」。
    違えばもし、X+ナコ様の幅>デスクトップワークエリアWならば、
      X=デスクトップワークエリアW-ナコ様の幅
      吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」
      もし、吹出方向=「左上」でなければ、吹出方向は「左上」。
    違えば、
      吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」
      もし、吹出方向=「左上」でなければ、吹出方向は「左上」。
    もし、吹出表示状態=オンならば、
      吹出方向で条件分岐
        左上ならば、吹出の可視はオン。
        右上ならば、吹出右の可視はオン。
  ダブルクリックした時は~終了処理。

*終了処理
  Julius終了終わる。

#なこ様吹出
吹出とはフォームの可視はオフのドラッグ移動オフ。
吹出右とはフォームの可視はオフのドラッグ移動オフ。
#------------------------------------------------------------

#-----Julius-------------------------------------------------
もし、Julius起動バッチの存在はいならば、Julius起動バッチを起動。
//違えば、「起動バッチがありません。」を言う終わる母艦最前面。
Julius接続。
Julius一時停止。

●Julius音声認識時処理(Aで)
  Julius一時停止。0.1秒待つ。//この秒待つは大事。
  Aで返事。
  戻る。
#-----------------------------------------------------------

#-----メイン-------------------------------------------------
文字サイズは10。
吹出方向は「左上」
ナコ様の可視はオン。
0.1秒待つ塗り色は通常科白色。
「こんにちは!ナコです。{改行}用があったら呼んでね☆」,「こんにちわ。な'こです。。よ'うがあったら+よんでね?」と喋る。
1秒待つ塗り色は情報表示色。
(AQHがAQT話し中)の
「【コマンド】{改行} ・ナコ様{改行} ・ナコ{改行} ・バイバイ」と科白表示。
Julius再開。

#-----------------------------------------------------------
*返事(Sで)
  塗り色は通常科白色。
  返事辞書の0で0からSを表検索。検索行=それ。
  もし、検索行=-1でなければ、
    (返事辞書¥検索行,1),(返事辞書¥検索行,2)と喋る。
    (AQHがAQT話し中)の。
    Sでコマンド実行。
  0.1秒待つ。
  Julius再開。

*コマンド実行(Sで)
  もし、S=「バイバイ」ならば終了処理。

#-----------------------------------------------------------
*喋る(S,Aと|Aを)
  もし、発声フラグ=オンならば、Aと発声。
  もし、科白表示フラグ=オンならば、Sと科白表示。

*発声({数値=110}SでAと|Aを)
  AQUESTALK_Play(AQH,A,S,母艦ハンドル,0,0)

*科白表示({文字列=「」}AでSと|Sを)
  科白種別はA。ナコ様を元通り。
  吹出方向で条件分岐
    「左上」ならば、
      吹出にSを「左上」へ200,100で吹出科白表示。
      吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」
      吹出の可視はオン。
      吹出右にSを「右上」へ200,100で吹出科白表示。
    「右上」ならば、
      吹出右にSを「右上」へ200,100で吹出科白表示。
      吹出右の位置=「{ナコ様のX+ナコ様の幅-80},{ナコ様のY-吹出の高さ+50}」
      吹出右の可視はオン。
      吹出にSを「左上」へ200,100で吹出科白表示。
  吹出表示状態=オン。

*科白非表示
  吹出の可視はオフ。吹出右の可視はオフ。吹出表示状態=オフ。
#------------------------------------------------------------
●吹出作成({グループ=?}FをW,Hで方向へ)
  xx=0。yy=0。ww=0。hh=0。
  方向で条件分岐
    右上ならば、  #矢印は左下
      Fのポケットは「右上」
      x1=0。y1=H。x2=W/8。y2=H/4*3。x3=W/4。y3=H/8*7。
    右下ならば、  #矢印は左上
      Fのポケットは「右下」
      x1=0。y1=0。x2=W/4。y2=H/8。x3=W/8。y3=H/4。
    左上ならば、  #矢印は右下(吹出し変形と同じ)
      Fのポケットは「左上」
      x1=W。y1=H。x2=W/4*3。y2=H/8*7。x3=W/8*7。y3=H/4*3。
    左下ならば、  #矢印は右上
      Fのポケットは「左下」
      x1=W。y1=0。x2=W/4*3。y2=H/8。x3=W/8*7。y3=H/4。
    上ならば、  #矢印は下向き
      hh=H/10。Fのポケットは「上」
      x1=W/2。y1=H+hh。x2=W/2-W/20。y2=H-H/100。x3=W/2+W/20。y3=H-H/100。
    下ならば、  #矢印は上向き
      hh=H/10。yy=hh。Fのポケットは「下」
      x1=W/2。y1=0。x2=W/2-W/20。y2=hh+H/100。x3=W/2+W/20。y3=hh+H/100。
    左ならば、  #矢印は右向き
      ww=W/10。Fのポケットは「左」
      x1=W+ww。y1=H/2。x2=W-W/100。y2=H/2-H/20。x3=W-W/100。y3=H/2+H/20。
    右ならば、  #矢印は左向き
      ww=W/10。xx=ww。Fのポケットは「右」
      x1=0。y1=H/2。x2=ww+W/100。y2=H/2-H/20。x3=ww+W/100。y3=H/2+H/20。
  Fの可視はオフ。
  FのクライアントWはW+ww。FのクライアントHはH+hh。
  Fを$00FF00で画面クリア。
  線スタイルは透明。
  Fのxx,yyからxx+W,yy+Hへ。0.1秒待つ。
  Fの「{x1},{y1},{x2},{y2},{x3},{y3}」へ多角形。
  F→画像通り変形。
//  Fの可視はオン。

●吹出科白表示({グループ=?}FにSを{整数=100}minW,{整数=50}minHで{文字列=「」}方向へ)
  Aとは文字列=「」。Bとは文字列=「」。
  Sで反復
    Bはそれ。
    もし(Aの文字数)<(Bの文字数)ならば、A=B。
  swとは整数=Aの文字幅取得shとは整数=(Sの文字高さ取得)*(Sの要素数)
  fwとは整数=(Aの文字幅取得)*1.5。fhとは整数=(Sの文字高さ取得)*(Sの要素数)*1.8
  もしfw<minWならば、fw=minW。</pp>
  もし、fh<minHならば、fh=minH。</pp>
  sxとは整数fw/2-sw/2-10
  syとは整数=fh/2-sh/2
  もし、方向=ならば、方向=F→ポケット。
  もし、方向=ならば、方向=左上。
  もし、方向=右ならば、sx=sx+fw/10  #矢印の長さ分
  もし、方向=下ならば、sy=sy+fh/10
  Fをfw,fhで方向へ吹出作成。
  Fのsx,syへSを文字表示。
#------------------------------------------------------------

 サイコロの時には、ふつーにフォームを作って画像通り変形とやったんだけど、なんとvnakoに、「なこ」で登録があり、簡単にナコ様をデスクトップマスコットとして出すことができたのですよw(゜o゜)w

 AquesTalk関数は、動機と非同期とどっちがいいか色々試した結果、非同期にして置いて、非同期にさせたくない部分には「(AQHがAQT話し中)の」を挟み込むのがよさそうな気配。

 標準の関数だと、スピードが90に固定なのが気に入らないので(デフォが100なのに何故か遅くしてるし?)110にしてみた。

 あんまりちんたら喋られると、なんかイラッとするんで;;;;;


 返事の部分は、会話数が増えた場合のことを考えると、全部のパターンをプログラムに書くのではなく、Juliusの単語リストに対応した辞書を作成して、読み込ませることにした。

 こんなヤツです。

#---nako_sama.adic------------------------------------------
ナコ様	な~に?	な'ーにー?
ナコ	呼び捨てかよ!	よびすて/か'よ
バイバイ	バイバイ	ば'い/ばい
くじらさん	僕は「くじらさん」じゃないよ	ぼ'くわ/くじらさん/じゃな'いよ?
#-----------------------------------------------------------

 ¥2がAquesTalkの音声記号列で、¥1は吹出に表示させる文字列

 いちおう吹出に、いちいち科白を表示することもできるよーにしてみたんだけど、どうかねえ・・・?


 うーん、でも、まあまあイイ感じですよ~♪

 ここまで作ってみると、やっぱりAIっぽく会話に柔軟性を持たせようとするなら、断然記述文法だろうね。

 でもまー、ソレは後の課題とゆうことで。

 柔軟性を持たせようとすると、認識率が低下する的な事件が発生しそうな予感もするし、またなでしこさんじゃなく、ゆりうすさんと格闘しなきゃないコトになりそうだからね。

 どうやら、記述文法と単語リストは共存出来ないっぽいし。

 しりとりなんかだと、単語の方がラクだろうからね(?)

remsErrofotremsErrofot2017/07/23 04:32http://allocating.one

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170318

2017/03/12 (日)

呼んだら返事をするプログラム

| 17:41 | 呼んだら返事をするプログラム - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 呼んだら返事をするプログラム - 雪乃☆雫のなでしこ日和 呼んだら返事をするプログラム - 雪乃☆雫のなでしこ日和 のブックマークコメント

 とりあえず、こうゆうこと。

#-----------------------------------------------------------
ダイアログIME=「IMEオン」
「◆コマンド◆
・ナコ様
・ナコ
・バイバイ」を表示

オン
  「ナコ様を呼ぶ」で尋ねる。
  それで返事。

*返事(Sで)
  もしそれが「ナコ様」ならば、「な~に?」と言う。
  違えばもしそれが「ナコ」ならば、「呼び捨てかよ!」と言う。
  違えばもしそれならば抜ける。
  違えばもしそれが「バイバイ」ならば、「バイバイ」と言う終わる。
  違えば、「僕は{それ}じゃないよ」と言う。
#-----------------------------------------------------------

 コレを、音声認識でやりたいってだけのこってす。

 プログラム的には、「尋ねる」で文字入力の代わりに、音声認識した単語で返事させればいいだけなので、難しいことなどいっこもなく。

 ただ、Juliusさんが、どーでもいい音までいちいち拾っては、あからさまに合わないものは無視してくれればいいのに、必ずリストの中のどれかに無理矢理割り当てて返してよこすんだよね。

 ことに一番短い「ナコ」に割り当ててしまう率が高く、すぐにナコさまが「呼び捨てかよ!」と怒ってくるとゆう困りもの;;;


 大人しく一人で家でパソっていて発生しがちな雑音は、テーブルにコーヒーカップなどを置く音、マウスがテーブルにぶつかった音、うさがシャカシャカとフローリングを掘る音!ヽ(`Д´)ノ ・・・など。

 人が身じろぎするような音には、それほど反応しないんですが、あと、結構ばしばしキーボードを叩いても、あまり反応しないんですが、上記の音については非常に良く反応しちゃいます。周波数?とかの関係???

 しかしまー、これらの人の声ではないノイズを面目にどーこーしようなんてコトはワタシの能力の範疇を軽々とえているので考えない!w


 「カタン」とか「コツン」というような音については、リストにいくつか適当な単音を登録しておいて、それを無視するのがいいみたい。「カサカサ」「シャカシャカ」などの連続した音については。果たしてどうなんだろう・・・

 とりあえず、50音プラス濁音、半濁音などを加えた単音で、どの音で認識されてくる率が高いかを実験してみたので、結果をはっぴょーします。

 、栄光の(?!)トップテンに輝いたのは・・・

 「っ」「ぷ」「う」「あ」「え」「ん」「ふ」「く」「ぶ」「ぱ」でしたぁ~。

 「っ」の音素列は「q」だし、「ん」は「N」。母音の「う」「あ」「え」がランクインするなど、より短い方がいいっぽいとゆうのは、まったくめだかさんに教えて頂いたとうりですね!

 しかし、「い」「お」を抑えての「ぷ」「ふ」「ぶ」のろい踏みも、なかなかじゃないですか?

 はJuliusさんを起動しっぱなしにして置いて、自然発生した音を認識させといてハッシュで集計したので、どんな音がどの音に? というのは不明なんですが、うさの立てる音は圧倒的に「っ」になる率が高くて、それが「っ」の順位を大幅に引き上げてる気がしますwww


 この実験結果を踏まえて、単語リストはこんな感じにしてみた。

#---nako_sama.jdic------------------------------------------
ナコ様	n a k o s a m a	
ナコ	n a k o	
バイバイ	b a i b a i	
くじらさん	k u j i r a s a N	
ペンちゃん	p e N ch a N	
ワニさん	w a n i s a N	
らいおん君	r a i o N k u N	
ノイズ	q
ノイズ	N
ノイズ	a
ノイズ	u
ノイズ	e
ノイズ	p u
ノイズ	f u
ノイズ	b u
ノイズ	k u
ノイズ	p a
フィラー	a:
フィラー	e:
フィラー	N N
フィラー	e: t o
フィラー	u: N t o
#-----------------------------------------------------------

 反応を見ながら増減の予定。

 「ノイズ」だの「フィラー」だのとゆうのは別になんでも良く、「※」でも「 」でもよかったんですが、には出来ないようだったのとコメントなどが付けられないので、取りあえず見て分かりやすいように。


 してプログラムはこんな感じ。

 JuliusようのTCPや音声認識結果を取得する関数は定型なので割愛。

 いちおう、「Julius音声認識時処理」だけ書き換えたらいいようにしたつもり・・・

#-----母艦設計----------------------------------------------
母艦の閉じた時は~Julius終了。
#-----GUI------------------------------------------------
会話エディタとはエディタの幅は200。
#-----Julius起動--------------------------------------------
もし、Julius起動バッチの存在はいならば、Julius起動バッチを起動違えば、「起動バッチがありません。」を言う終わる
Julius接続。
#-----メイン------------------------------------------------
「◆コマンド◆
・ナコ様
・ナコ
・バイバイ」を表示

*返事(Sで)
  もしそれが「ナコ様」ならば、「な~に?」と言う。
  違えばもしそれが「ナコ」ならば、「呼び捨てかよ!」と言う。
  違えばもしそれが「ノイズ」ならば抜ける。//「ノイズ」と言う。
  違えばもしそれが「フィラー」ならば抜ける。//「フィラー」と言う。
  違えばもしそれが「バイバイ」ならば、「バイバイ」と言う終わる。
  違えば、「僕は{それ}じゃないよ」と言う。
  会話エディタのテキストは。
#-----------------------------------------------------------
●Julius音声認識時処理(Aで)
  会話エディタのテキストはA。
  Aで返事。
  戻る。
#-----------------------------------------------------------

 これで一通りは「尋ねる」の場合と同じような感じで答えてくれるようになりました。

 時々、「ナコ」が「うーんと」に認識されて、フィラー扱いで無視されるっぽい; えー? 似てるかい??

 「うさこさん」などと言うと、ほぼ「ナコ様」と認識して、返事してくるwww

 これはもう、この孤立単語認識自体が、決まった単語をコマンドとしてどうこうするためのモノなんですから、リストに無いことは言うなって話なんです。

 でもまー、「うさこさん」にいちいち反応されてはめーわくなので、単語リストに「うさこさん u s a k o s a N」を追加

 リストに登録さえあれば、混同されることはない様子。

 よしよし♪♪♪


 ・・・でっ?

 それでどーするんだよっていうと、別にの先の展望はなかったり;;;

めだかめだか2017/03/12 22:24お久ぶりです。この前のお返事をしようと書いていたらいつの間にか寝てしまっていました(笑)
この前のお返事ですが、私が文章を読んでいなかったのであのような頓珍漢なお返事になっていましたwあの時も眠かったんです~・・・許してください(笑)

で、本題ですが、今回のこのプログラムですが、何か喋った後にも、操作をつけたりするのでしたら、条件分岐などを使っても面白い様に思いました。ただ、実用性は・・・w

僕の場合は、関数にしてわかりやすくしています。また、処理の内容や命令が多いため、整理しやすくと思いそうしてます^^

ただ、その時は関数内でGUI部品がつくれねぇ!ってなりまして、諦めてましたwちょっと前に知ったのに、手を付けず他のプログラムをポチポチかいておりますw

雪乃☆雫雪乃☆雫2017/03/13 08:22 めだかさん、おはよーございます。
 ワタシは、基本的には、実用的なモノは作らないのですよ~(爆)

 条件分岐ね~。そんなのもありましたね~~~(こらこら;)
 ワタシってば、どうもフロー制御の色々なパターンをうまく使いこなせてないんだよね。基本、「もし」と「回」で生きてるってゆうか;;;(最近になって急に「反復」の便利さを知ったんですよ(爆))
 もしもしもしもしと、見づらいプログラムでゴメンね><;

 そーいわれて振り返ると、過去にも条件分岐使えばいいのに(苦笑)ってヤツがいっぱいだ~。サイコロで胴元やナコ様が沢山喋ってるトコなんか特にね(@_@)
 もちろん、知らないってわけでは無くて、たまたま書いてる時にシナプスが繋がれば、実にさりげなく当然のよーに「条件分岐」を使って記述してる時もあるみたいなんだケドwww

 GUIを動的に作るヤツ、最初、絶対はまりますよね~!
 マニュアルとか見ても、ぜんぜんどこもそんなこと書いてないもねー・・・

めだかめだか2017/03/17 15:11こんにちはー お返事ありがとうございますー

作る作ると言っておきながらなかなか手をつけておらず、完成までしてないのが毎回のオチです(笑)

フロー制御に関しては、もしか回と反復だけで充分お腹いっぱいになりますよねw反復も代入とかで、ごっちゃになりますしw
もしでも、初めの方はそろうので、コードの見た目的には綺麗かもですね(笑)

よくありますーw何故かリフレインを使ったりとかしちゃいますw

初め探してた時に、動的???静的???関数???この構文で何がダメなの???ってなっちゃいましたよwそれようのページもないので、関数使っていそうなプログラムを見つけては、GUIを使うにはどうすりゃいいかをずっと考えてましたねー(笑)

雪乃☆雫雪乃☆雫2017/03/18 07:58GUIについては、もうちょっと突っ込んだ内容の、まとまった情報があるといいですよね~。
最初、絶対みんな不自由すると思う><;

ワタシもいろいろ完成しないで放置してる~。
けっこう飽きっぽいのさ~~~;;;

めだかめだか2017/03/19 22:18ですが、そういった点(GUI関連)では、Cなどへ移行した時に違和感なく組み立てが出来そうなので、いいですが、なでしこ自体プログラム初心者向けなので、そういうのはまだ難しいところですね・・・^^;

途中までいい感じ作っておきながら、他の事に着手しちゃってほったらかしですぅ~(笑)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170312

2017/03/03 (金)

単語リストを作る

| 23:39 | 単語リストを作る - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 単語リストを作る - 雪乃☆雫のなでしこ日和 単語リストを作る - 雪乃☆雫のなでしこ日和 のブックマークコメント

 Juliusの文法認識キットでは、記述文法による小語彙の認識と、単語リストのみで実行できる孤立単語認識があります

 簡単なのは、もちろん単語リストの方です。

 記述文法の方は・・・文法自体は簡単っぽいんだけど、なんかコンパイルとかしなきゃないらしく・・・コンパイルするにはperlをインストールしなきゃないらしく・・・(*_*)


 単語リストの方は、簡単です。

 こんなの。

#-----------------------------------------------------------
ナコ様				n a k o s a m a
ワニさん			w a n i s a N
くじらさん			k u j i r a s a N
らいおん君			r a i o N k u N
ペンちゃん			p e N ch a N
#-----------------------------------------------------------

 基本ローマ字なんだけど、全部半角スペースで区切らなきゃならないから、手打ちは結構面倒。

 あと、「ん」は大文字の「N」だったり、長音は前のに続けて「:」だったりの法則があるみたいだけど、分かりやすい表みたいなのが無いなあと思っていたら、ひらがなで入れたら変換してくれるヤツがあって、しかもこれまたperl><

 perlは全く分かりませんが、しかし、いちおう中を覗いてみたところ、単に正規表現で順番に置換してるだけっぽい!

 それなら、なでしこさんで出来るね☆

 ・・・っと、作ってみたのがこちら。

#ひらがなをJuliusの音素列に変換
#-----------------------------------------------------------------------
変換辞書とは配列。変換辞書設定。
元ファイルはファイル選択。
//出力ファイルは元ファイルを「.voca」に拡張子変更出力ファイルは元ファイルを「.jdic」に拡張子変更。

元データは元ファイルを開く。
元データはそれの「{タブ}+」を「{タブ}」に正規表現置換。
元データはそれの「  +」を「{タブ}」に正規表現置換。
元データはそれTSV取得。
結果=。

元データで反復
  一時=対象¥1
  もし対象の1文字左部分=「#」または、対象の1文字左部分=「%」でなければ、
    変換辞書で反復
      一時は一時の(対象¥0)を(対象¥1)へ正規表現置換。
  結果は「{結果}{元データ¥(回数-1),0}{タブ}{一時}{改行}」
結果を出力ファイルに保存終わる。

#-----------------------------------------------------------------------
# ひらがな -> Julius 標準モデル用変換辞書(yomi2voca.plより抽出)
#-----------------------------------------------------------------------
*変換辞書設定
  変換辞書=「う゛ぁ," b a"{~}う゛ぃ," b i"{~}う゛ぇ," b e"{~}う゛ぉ," b o"{~}う゛ゅ," by u"
ぅ゛," b u"{~}あぁ," a a"{~}いぃ," i i"{~}いぇ," i e"{~}いゃ," y a"{~}うぅ," u:"{~}えぇ," e e"{~}おぉ," o:"
かぁ," k a:"{~}きぃ," k i:"{~}くぅ," k u:"{~}くゃ," ky a"{~}くゅ," ky u"{~}くょ," ky o"{~}けぇ," k e:"{~}こぉ," k o:"
がぁ," g a:"{~}ぎぃ," g i:"{~}ぐぅ," g u:"{~}ぐゃ," gy a"{~}ぐゅ," gy u"{~}ぐょ," gy o"{~}げぇ," g e:"{~}ごぉ," g o:"
さぁ," s a:"{~}しぃ," sh i:"{~}すぅ," s u:"{~}すゃ," sh a"{~}すゅ," sh u"{~}すょ," sh o"{~}せぇ," s e:"{~}ぉ," s o:"
ざぁ," z a:"{~}じぃ," j i:"{~}ずぅ," z u:"{~}ずゃ," zy a"{~}ずゅ," zy u"{~}ずょ," zy o"{~}ぜぇ," z e:"{~}ぞぉ," z o:"
たぁ," t a:"{~}ちぃ," ch i:"{~}つぁ," ts a"{~}つぃ," ts i"{~}つぅ," ts u:"{~}つゃ," ch a"{~}つゅ," ch u"{~}つょ," ch o"
つぇ," ts e"{~}つぉ," ts o"{~}てぇ," t e:"{~}とぉ," t o:"
だぁ," d a:"{~}ぢぃ," j i:"{~}づぅ," d u:"{~}づゃ," zy a"{~}づゅ," zy u"{~}づょ," zy o"{~}でぇ," d e:"{~}どぉ," d o:"
なぁ," n a:"{~}にぃ," n i:"{~}ぬぅ," n u:"{~}ぬゃ," ny a"{~}ぬゅ," ny u"{~}ぬょ," ny o"{~}ねぇ," n e:"{~}のぉ," n o:"
はぁ," h a:"{~}ひぃ," h i:"{~}ふぅ," f u:"{~}ふゃ," hy a"{~}ふゅ," hy u"{~}ふょ," hy o"{~}へぇ," h e:"{~}ほぉ," h o:"
ばぁ," b a:"{~}びぃ," b i:"{~}ぶぅ," b u:"{~}ふゃ," hy a"{~}ぶゅ," by u"{~}ふょ," hy o"{~}べぇ," b e:"{~}ぼぉ," b o:"
ぱぁ," p a:"{~}ぴぃ," p i:"{~}ぷぅ," p u:"{~}ぷゃ," py a"{~}ぷゅ," py u"{~}ぷょ," py o"{~}ぺぇ," p e:"{~}ぽぉ," p o:"
まぁ," m a:"{~}みぃ," m i:"{~}むぅ," m u:"{~}むゃ," my a"{~}むゅ," my u"{~}むょ," my o"{~}めぇ," m e:"{~}もぉ," m o:"
やぁ," y a:"{~}ゆぅ," y u:"{~}ゆゃ," y a:"{~}ゆゅ," y u:"{~}ゆょ," y o:"{~}よぉ," y o:"
らぁ," r a:"{~}りぃ," r i:"{~}るぅ," r u:"{~}るゃ," ry a"{~}るゅ," ry u"{~}るょ," ry o"{~}れぇ," r e:"{~}ろぉ," r o:"
わぁ," w a:"{~}をぉ," o:"{~}う゛," b u"{~}でぃ," d i"{~}でぇ," d e:"{~}でゃ," dy a"{~}でゅ," dy u"{~}でょ," dy o"
てぃ," t i"{~}てぇ," t e:"{~}てゃ," ty a"{~}てゅ," ty u"{~}てょ," ty o"{~}すぃ," s i"
ずぁ," z u a"{~}ずぃ," z i"{~}ずぅ," z u"{~}ずゃ," zy a"{~}ずゅ," zy u"{~}ずょ," zy o"{~}ずぇ," z e"{~}ずぉ," z o"
きゃ," ky a"{~}きゅ," ky u"{~}きょ," ky o"{~}しゃ," sh a"{~}しゅ," sh u"{~}しぇ," sh e"{~}しょ," sh o"
ちゃ," ch a"{~}ちゅ," ch u"{~}ちぇ," ch e"{~}ちょ," ch o"{~}とぅ," t u"{~}とゃ," ty a"{~}とゅ," ty u"{~}とょ," ty o"
どぁ," d o a"{~}どぅ," d u"{~}どゃ," dy a"{~}どゅ," dy u"{~}どょ," dy o"{~}どぉ," d o:"
にゃ," ny a"{~}にゅ," ny u"{~}にょ," ny o"{~}ひゃ," hy a"{~}ひゅ," hy u"{~}ひょ," hy o"
みゃ," my a"{~}みゅ," my u"{~}みょ," my o"{~}りゃ," ry a"{~}りゅ," ry u"{~}りょ," ry o"
ぎゃ," gy a"{~}ぎゅ," gy u"{~}ぎょ," gy o"{~}ぢぇ," j e"{~}ぢゃ," j a"{~}ぢゅ," j u"{~}ぢょ," j o"
じぇ," j e"{~}じゃ," j a"{~}じゅ," j u"{~}じょ," j o"{~}びゃ," by a"{~}びゅ," by u"{~}びょ," by o"
ぴゃ," py a"{~}ぴゅ," py u"{~}ぴょ," py o"{~}うぁ," u a"{~}うぃ," w i"{~}うぇ," w e"{~}うぉ," w o"
ふぁ," f a"{~}ふぃ," f i"{~}ふぅ," f u"{~}ふゃ," hy a"{~}ふゅ," hy u"{~}ふょ," hy o"{~}ふぇ," f e"{~}ふぉ," f o"
あ," a"{~}い," i"{~}う," u"{~}え," e"{~}お," o"{~}か," k a"{~}き," k i"{~}く," k u"{~}け," k e"{~}こ," k o"
さ," s a"{~}し," sh i"{~}す," s u"{~}せ," s e"{~}," s o"{~}た," t a"{~}ち," ch i"{~}つ," ts u"{~}て," t e"{~}と," t o"
な," n a"{~}に," n i"{~}ぬ," n u"{~}ね," n e"{~}の," n o"{~}は," h a"{~}ひ," h i"{~}ふ," f u"{~}へ," h e"{~}ほ," h o"
ま," m a"{~}み," m i"{~}む," m u"{~}め," m e"{~}も," m o"{~}ら," r a"{~}り," r i"{~}る," r u"{~}れ," r e"{~}ろ," r o"
が," g a"{~}ぎ," g i"{~}ぐ," g u"{~}げ," g e"{~}ご," g o"{~}ざ," z a"{~}じ," j i"{~}ず," z u"{~}ぜ," z e"{~}ぞ," z o"
だ," d a"{~}ぢ," j i"{~}づ," z u"{~}で," d e"{~}ど," d o"{~}ば," b a"{~}び," b i"{~}ぶ," b u"{~}べ," b e"{~}ぼ," b o"
ぱ," p a"{~}ぴ," p i"{~}ぷ," p u"{~}ぺ," p e"{~}ぽ," p o"{~}や," y a"{~}ゆ," y u"{~}よ," y o"
わ," w a"{~}ゐ," i"{~}ゑ," e"{~}を," o"{~}ん," N"{~}っ," q"{~}ー,":"
ぁ," a"{~}ぃ," i"{~}ぅ," u"{~}ぇ," e"{~}ぉ," o"{~}ゎ," w a"{~}ぉ," o"{~}"^ ([a-z])","$1"{~}"\:+",":"」をCSV取得。
#-----------------------------------------------------------------------

 perlがまるっきりいっこも分かんないので移植とは言えませんけど、肝心なのは変換辞書の部分で、これはJuliusに付属している「yomi2voca.pl」から機械的に抜きました。

 たぶんこれを上から順番に、どんどこ置換してってるだけだと思うんだよね~。

 いちおう、うまくいってると思うんだけど・・・

 なんだか、記述文法のvocaファイルでは、「%」がカテゴリのヘッダ、「#」がコメント行となっているようで、のまま出力するようにしてますが、単語リストの場合には、余計なモノは一切入れたらダメみたいです。


 ふりがなではなくて、「読み」なので、「こんにちは」「お姉さん」などは、「こんにちは」「おねえさん」ではなく、「こんにちわ」「おねーさん」みたく、実際の発声に近づけて入れるのがいいみたい。

(「yomi2voca.pl」の中には「助詞の「は」「へ」「を」→「w a」「e」「o」は変換後に手動で直すこと.」・・・て注釈がはいってるんだけど、「を」はちゃんと変換出来ることになっているし、下の「は」「へ」も、ひらがなの段階で、「わ」「え」に直しておくのがイイと思う)


 で、こんなふうに変換して、

#---nako.txt------------------------------------------------
こんにちは			こんにちわ
バイバイ			ばいばい
ナコ				なこ
お姉さん			おねーさん
#-----------------------------------------------------------
 ↓   ↓   ↓
#---nako.jdic-----------------------------------------------
こんにちは	k o N n i ch i w a
バイバイ	b a i b a i
ナコ	n a k o
お姉さん	o n e: s a N
#-----------------------------------------------------------

 「-w nako.jdic(単語リストファイル名)」のオプションを付けて起動します。

 単語リストの拡張子は、別になんでもいいみたい。

 限られた単語の中から判断するので、非常に認識率はいいですが、どんな音を拾っても、近いものに無理矢理割り付けるので困ったもんだというところ;

 カタッというような雑音や、文法認識キットのサンプルにもあったような、「えっと」だの「あのー」だのという言葉を認識させておいて、最終的には無視する・・・的な感じですかね。

めだかめだか2017/03/06 01:33お久しぶりです。
最近、久々にゲームにハマってしまってなんにも出来てないめだかです(笑

横から失礼しますが、雑音の方は、言葉とは違って音が1つだったと思います。
音が1つって言うのが、日本語の場合、「ごど」だと、g o・d o ですが、音の場合、同じ「ごど」でも、godoとなっていたと思います。
なので、音の数でいけたはず...です...!
(ものすーごく曖昧な記憶です...なので、信憑性0です(笑))

また、雑音の前後の余白での判別や、定型句に登録されていない(使用率が低い)から、雑音と処理する。みたいなのが出来ると思います。
後は、音の高さで判別するぐらいしか思いつかないです~...

もっと難しい方法を使うとしたら、音の厚さが~...反射が~...とか意味不明な領域にいっちゃうので、当方お手上げです(既に無理です^^;

「あのー」や「えー」や「えっと」などは、定型句登録しておき、その単語で認識された場合、削除などでいいと思います。

ただ、それらの処理がなでしこで可能かと言われると、難しいものがあります...めっぽう音や動画には弱いなでしこちゃんなのでねぇ...(笑

雪乃☆雫雪乃☆雫2017/03/07 16:13めだかさん、こんにちは。ありがとうございます☆
あぁ~、ワタシもゲームにはまれば、月単位で帰ってこなくなりますよw
もっとも、長いゲームにはまる気力と体力がもう無いですが;

 えーっと、なでしこさん側でやっているのは、ゆりうすさんが返してよこす文字列をどうこうしてるだけなんで、むしろなでしこさんの得意分野かもしんない。
 音声認識部分は、完全にゆりうすさんに丸投げで、ゆりうすさんのリファレンス自体が全く理解不能で、ワタシなんぞには意味不明な領域ばっかです><;
 この単語リストを使った認識は、Juliusの機能の中でも一番簡便な物で、もう完全に単なる「単語リスト」で、ノイズの概念はなく、余白などの設定も無いし、とにかくどんな音を拾っても、リスト内のどれかに無理矢理割り当てて返してよこすんですよwww

 で、おっしゃってる「雑音だと音が一つ」とゆうことと、同じコトなのかどうか・・・
 擬音語で言うと「カタッ」とか「ガタン」と言うところだけど、実際の音はそうではないですよねぇ。一種の破裂音?的な。
 この手の音については、リストにいくつか適当な単音を登録しておいて、それを無視するのがいいみたい。(Juliusの音素列は、「ごど」ならどうしたって「g o d o」でなくてはならず「godo」などとすると、ゆりうすさん自体が起動しなくなっちゃうヽ(;´Д`)ノ)
 原始的だけど、今、五十音の単語リストを作って、どんな音がどの音素列に割り当てられてくる率が高いか試してみてる~。
 集計して、多いヤツをいくつか登録してやる予定~。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170303

2017/02/21 (火)

文法認識キットは、落とし穴だったよ!?

| 21:56 | 文法認識キットは、落とし穴だったよ!? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 文法認識キットは、落とし穴だったよ!? - 雪乃☆雫のなでしこ日和 文法認識キットは、落とし穴だったよ!? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 ディクテーションは、思った以上に使い物にならない感じ。

 知ってる言葉については、こっちの工夫次第では、なかなかな成績になってきたんですケド・・・何しろ知らない(と思われる)言葉が多すぎる~;

 まあ、6万語なんていうとすごい感じですけど、もちろん、しろーとの個人にとっては膨大にちがいないんですけど、広辞苑の収録語数が24万語とゆうことを考えたら、ぜんぜんたいした語彙じゃないもね~。

 なんかもー、しゅーいんぎいん…とかしゃべり続けるのも、疲れたしねー;;;

 ・・・ところで、急に気付いたけど、元の例文は、「衆院議員は,具体的にどう考えているのか」だったのに、何故かワタシはずっと「なにを考えているのか」って言い続けてた!

 ワタシの日本語認識能力も、ダメダメっぽいorz

 理系じゃないのはモチロンだけど、文系ですらない、ただのおバカさんだからね><


 ・・・とゆうわけで(?!)

 ディクテーションには見切りを付けて、文法認識キットを使ってみることにした。

 こちらも、必要の実行ファイルは全部入っているので、ダウンロードしてくればこれだけで取りあえず動くんだけど・・・

 サンプルが色々入っていたので色々遊んでいたんだけど・・・なんだか「音声入力開始待ち」がうまくいってない~。

 ちゃんと「PAUSE」はJuliusに送信出来てはいるみたいなんだけど、「音声入力中」になった途端、PAUSE中にしゃべってた内容が、音声認識結果に上がってきてしまう。

 エンジン、一時停止されてないじゃん! みたいな;;;(クライアントへの送信だけが一時停止になってる的な?)

 確認してみたケド、ディクテーションキットの時は、ちゃんとうまく働いている。

 ディクテーションキットの時は問題ないんだから、こっちのプログラムの問題じゃない気がするんだけどね~・・・っとjconfの内容眺めてみたりしたけど、これまたよくわかんにゃい(*_*)


 んなこんなで、ーとーうだうだとはまりまくっていたんだけど、の途中、こっちに同梱されてるJulius本体はどうやら最新版じゃないっぽい? ってことに気が付いた。

 これは、最新版にし替えちゃった方がいいんですかね~?? っと、ソレはさすがに関係ないだろうと思いながらし替えてみたところ、なんと、いきなり問題が解消!

 なんてこった;;;

 ディクテーションキットの方は、ちゃんと最新版が同梱されていたんですよ。

 やられた~><(別に、誰も、何もやってない!)

 折角、バージョン情報を取得出来るように作ってたんだから、もっと早く気づけよ・・・っという話;;;

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170221