Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017-02-21

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

| 21:56

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

 なんてこった;;;

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

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

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

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

2017-02-17

認識結果の取得を修正

| 14:12

 うぇいくさまより教えを頂き、修正。

 「1のメッセージ送信ごとに,データの終端として,"." のみの行が送信される.」ってゆうのは、受信が始まったら「.」だけの行が出るまでは、データをためとけってコトだったんだね。

 ねっとわーく的なことに関する知識が皆無なもので、んなこととはしらなんだ;

 ってゆうより、頭が基本的にプログラム的じゃ無いから、一行とか、単語やタグをひとかたまりのものとして見てしまう概念から、抜けられないのさ~。しくしくしく。


 でもまあ、考え方としては、「<RECOGOUT>」タグがあったら「</RECOGOUT>」が出るまで、「認識ブロック」にログをためて、タグを完成させていたのと同じコトだろう。

 元のコードを生かす形で、あんまりスマートじゃないケド、

・受信が始まったら「{改行}.{改行}」が出るまで、「認識ブロック」を作る。

・一行だけのステータスやバージョンの情報も、「認識ブロック」が完成してから取得するように変更。

・「<RECOGOUT>」タグがあったら、音声認識結果を取得。

 正規表現だから「.」は「\.」にしなきゃダメだとか、なでしこ上の実験では{改行}が使えたんだけど、TCPでは「\n」じゃなきゃダメだったとか色々あったけど、わりとすんなり・・・?

 こうなった。

#-----------------------------------------------------------
●Jログ取得(Aから)
  Jログは「{Jログ}{A}」
  認識ブロックは「{認識ブロック}{A}」
  もし、Aを「\n\.\n」で正規表現マッチでなければ、
    認識ブロックからJログ切り出し。

●Jログ切り出し(Aから)
  認識ブロックは。
  JステータスはAの「SYSINFO」から「PROCESS」をタグ属性取得。
  JバージョンはAの「ENGINEINFO」から「VERSION」をタグ属性取得。
  AでJuliusログ取得時処理。

  もし、Aを「<RECOGOUT>」で正規表現マッチでなければ、
    AからJ認識結果抽出。

●J認識結果抽出(Aから)
  J認識結果は。
  Aの「WHYPO」から「WORD」をタグ属性取得。
  それ反復
    もし対象が「<s>」または対象が「</s>」ならば対象。
    J認識結果は「{J認識結果}{対象}」
  J認識結果でJulius音声認識時処理。
#-----------------------------------------------------------

 さて、どうかなあ?

 一応、のところ、問題なく動いています。

 もっとも、前の状態でも、ちょっと実験したレベルでは特に問題なく動いてたんで、沢山使ってみないと分からないかな?

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

2017-02-15

音声認識結果を抽出するよ!

| 15:09

 認識結果を切り出すのは、思ったよりは、簡単じゃ無かった(涙)

「クライアントがパーズしやすくするため, 1のメッセージ送信ごとに,データの終端として,"." のみの行が送信される.」

 ・・・て書いてあったから、そうなんだろうと、のつもりでやっていたら、どうもうまく出来ない

 おっかしいなあと思って、一受信ごと確認してみたら、他のタグは基本一行づつだからいいんだけど、複数行にわたる「<RECOGOUT></RECOGOUT>」タグは、どうも途中で結構途切れてた。

 送信時はそうでも、受信時には分割して受信してるってコトだろうね。

 しかも、一行づつとかゆう、分かりやすいブロックでは無くて、結構ヘンなところでバサッと分割されてしまうっぽい。

 認識結果が長いと分割されるというわけでも無いみたいで、わりと初っ端の文頭無音の辺りで一旦切れることが多いみたいなんだけど、位置は一定では無い。


 とりあえず、受信したモノの中に「<RECOGOUT>」があったら認識ブロックとしてログを取得し始めて、「</RECOGOUT>」があったら終了で、1ブロックの「<RECOGOUT></RECOGOUT>」タグを完成させてから、こからログを切り出すようにしてみたんだけど・・・

 もしも、「<RECOGOUT>」タグ自体が分断されたりすると、これもうまく働かないって話になってしまうけど・・・さすがにそれないかな? かな?

 取りあえず、のところはコレでうまくいってるような・・・???

# 認識結果を抽出。ログと比較。
#-----------------------------------------------------------
!「nakonet.nako」を取り込む。

#-----設定--------------------------------------------------
Julius起動バッチとは文字列=「run-win-gmm-module.bat」
接続待時とは整数=10
#-----宣言--------------------------------------------------
再試行とは整数=0
Jログとは文字列。
J認識結果とは文字列。
Jステータスとは文字列。
Jバージョンとは文字列。
認識ブロックとは文字列。

音声入力フラグ=オフ。
#-----------------------------------------------------------

#-----母艦設計----------------------------------------------
母艦のクライアント幅は1200。
母艦のクライアント高さは600。
母艦中央移動
オフ母艦の最大化ボタン有効変更。
母艦の閉じた時は~Julius終了
#-----------------------------------------------------------

#-----GUI------------------------------------------------
取得ログとはTエディタの幅は600。のレイアウトは「左」
音声認識とはTエディタの幅は600。のレイアウトは「右」

#---TCP-----
JクライアントとはTCPクライアント。
Jクライアントについて
  ホストは「127.0.0.1」  # 「127.0.0.1」はローカル。
  ポートは10500。  # モジュールモードではJuliusがサーバーとなり、ポート番号10500で接続を待ちます。
  接続した時は~
    再試行=接続待時。
    Julius接続完了時処理。
  受信した時は~
    Jクライアントで受信。
    それからJログ切り出し。
  エラー時は~
    Jクライアントで切断。
    もし、再試行<接続待時ならば、
      1秒待つ。再試行=再試行+1
      Julius接続。
    違えば、
      Jクライアントのエラーメッセージ言う。
      終わる。
#-----------------------------------------------------------
上バーとはパネル。
上バーについて
  レイアウトは「上」。高さは25。
  スタイルは「枠なし」。
  クリックした時は~
    「Julius情報」を「ステータス{~}バージョン{~}インスタンス情報{~}文法情報」でボタン選択。
    もしそれが「ステータス」ならば、Juliusステータス。
    違えばもしそれが「バージョン」ならば、Juliusバージョン。
    違えばもしそれが「インスタンス情報」ならば、Juliusインスタンス情報。
    違えばもしそれが「文法情報」ならば、Julius文法情報。

音声入力ボタンとは画像ボタン。
音声入力ボタンについて
  親部品は上バー。フラットはオン。テキストは「」
  位置は「0,0」。幅は150。高さは25。
  マウス入った時は~フラットはオフ。
  マウス出た時は~フラットはオン。
  クリックした時は~
    もし、音声入力フラグ=オフならば、音声入力中。
    違えば、音声入力開始待ち。

説明ラベルとはラベルの親部品は上バーの位置は「160,6」。
#-----------------------------------------------------------
音声入力開始待ち。
*音声入力開始待ち
  音声入力フラグ=オフ。
  Julius一時停止。
  音声入力ボタンの0,0をウィンドウ色塗る。
  文字色赤色文字サイズは14。
  音声入力ボタンの5,2へ「●」を文字描画。
  文字色黒色文字サイズは10。
  音声入力ボタンの30,5へ「音声入力開始」を文字表示。
  説明ラベルのテキストは「←ボタンを押すと音声認識を開始します。」

*音声入力中
  音声入力フラグ=オン。
  Julius再開。
  音声入力ボタンの0,0をウィンドウ色塗る。
  文字色青色文字サイズは14。
  音声入力ボタンの5,2へ「■」を文字描画。
  文字色黒色文字サイズは10。
  音声入力ボタンの30,5へ「音声入力停止」を文字表示。
  説明ラベルのテキストは「音声認識中・・・」
#-----------------------------------------------------------

#-----メイン------------------------------------------------
#バッチファイルを選択して起動。
「*.bat」のファイル選択して起動もしそれならば終わる。

#Julius起動バッチを起動。
//もし、Julius起動バッチの存在はいならば、Julius起動バッチを起動。
//違えば、「起動バッチがありません。」を言う終わる

//母艦最前面。
Julius接続。
#-----------------------------------------------------------

#-----Julius関数--------------------------------------------
●Julius起動(BATで)
  BATを起動。
  Julius接続。

●Julius接続
  Julius接続中処理
  Jクライアントで接続。

●Julius終了
  プロセス列挙反復
    対象を「julius」で正規表現マッチ。
    もしそれでなければ、対象プロセス強制終了。
#-----------------------------------------------------------
# エンジンを一時停止する.受信時点で入力待ちだったときは即座に停止する.
# 認識を実行中の場合,入力が終わり認識が終了してから停止する.
●Julius一時停止
  「PAUSE{\n}」をJクライアントで送信。

# エンジンを一時停止する.入力待ち・認識実行中にかかわらず,即時停止する.
●Julius即時停止
  「TERMINATE{\n}」をJクライアントで送信。

# 一時停止状態から復帰してエンジン動作を再開する
●Julius再開
  「RESUME{\n}」をJクライアントで送信。

# エンジンが現在動作中であるかどうかを返す
●Juliusステータス
  「STATUS{\n}」をJクライアントで送信。

# Julius のバージョンを返す
●Juliusバージョン
  「VERSION{\n}」をJクライアントで送信。

# すべての認識処理インスタンスの情報を出力する…いんすたんすってなんすか;
●Juliusインスタンス情報
  「LISTPROCESS{\n}」をJクライアントで送信。

# エンジンが現在持つ文法情報を返す
●Julius文法情報
  「GRAMINFO{\n}」をJクライアントで送信。
#-----------------------------------------------------------
●Jログ切り出し(Aから)
  Jログは「{Jログ}{A}」
  JステータスはAの「SYSINFO」から「PROCESS」をタグ属性取得。
  JバージョンはAの「ENGINEINFO」から「VERSION」をタグ属性取得。
  AでJuliusログ取得時処理。

  もし、Aを「<RECOGOUT>」で正規表現マッチでなければ、
    取得フラグ=オン。
  もし、取得フラグ=オンならば、
    認識ブロックは「{認識ブロック}{A}」
  もし、Aを「</RECOGOUT>」で正規表現マッチでなければ、
    取得フラグ=オフ。
    認識ブロックからJ認識結果抽出。
    認識ブロックは。

●J認識結果抽出({参照渡し 配列=?}Aから)
  No=0。J認識結果は。
  Aの要素数
    A\Noを「<WHYPO WORD=」で正規表現マッチ。
    もしそれでなければ、
      A\Noの「WHYPO」から「WORD」をタグ属性取得。
      もしそれが「<s>」またはそれが「</s>」ならばそれ。
      J認識結果は「{J認識結果}{それ}」
    No=No+1
  J認識結果はJ認識結果を改行区切る。
  J認識結果はJ認識結果を配列結合。
  J認識結果でJulius音声認識時処理。
#-----------------------------------------------------------
●Julius接続中処理
  取得ログは「{取得ログ}接続中...」。
  戻る。

●Julius接続完了時処理
  Julius即時停止。
  取得ログは「接続完了!{改行}音声入力を開始出来ます。{改行}」
  戻る。

●Juliusログ取得時処理(Aで)
  取得ログは「{取得ログ}{A}」。
  もし、Jステータス=でなければ、「STATUS:{Jステータス}」を言う。
  もし、Jバージョン=でなければ、「VERSION:{Jバージョン}」を言う。
  戻る。

●Julius音声認識時処理(Aで)
  音声認識は「{音声認識}{A}{改行}」。
  戻る。
#-----------------------------------------------------------

 あと、Juliusがクライアントから受け取れるメッセージを送れるようにしてみた。

 なんかよく分かんないから、引数の無いヤツだけ・・・

 欲しいのは、PAUSEとRESUMEだけだったけど、Juliusのバージョンが確認出来るっていうのも、ちょっといいよね。

 他のこともようく学べば、文法ファイルの追加や変更なんかが、再起動しなくてもクライアント側から操作できるような気がするので、後使えそうなんだけど・・・


 それと、プログラム終了とともに、Juliusも一緒に終了させたいんだけど、「DIE(Julius を強制終了する)」を送信するのは、確かに音声認識は強制終了されるっぽいんだけど、コマンドプロンプトの画面はもとより、タスクの中のJulius.exeものまま残ってしまっているから、意味ない感じなんだよね~。

 取りあえず、プロセス強制終了で終わらせちゃってるケド;


 他にひらめいた事としては、ぜんぜん関係ないけど、「ボタン選択」のダイアログって、ボタンが縦に並ぶ時と横に並ぶ時とあるんですよね~。

 こっちの意図に反して勝手に!

 一体なんなんだと思ってたけど、どうやら母艦?の幅に合わせて、横長すぎる場合は縦に並ぶよう、自動調整されてるっぽいですね。

 どうしても縦に並べたい! など見た目にこだわる場合には、やっぱり自前でフォームを用意するしかないんだろうね。

 どーでもいいことだけど、クイズの昔のナゾが解明したので、一応書いとく(爆)

うぇいくうぇいく2017/02/15 23:37TCPの世界では、ただのバイトの羅列なので、順序は(TCPなので)保障されますが、区切りという概念はありません。通信の開始から終了まで、連なります。

なので、受信したものを、だだーーっと、バッファ(文字列変数とか)にどんどん追加していって、自分のアプリケーションで処理を行えるというデータまでをため込んだら、その分を切り出して処理する という部分が必ず必要です。
ちゃんと切り出す前は、ただのバイト列のため、「文字コードに従って、1文字がばらけたりしない」ということもないです。そのため、使用する関数に注意が必要です。
(なでしこの文字列操作関数は、文字列がShiftJISじゃないとうまく処理できないものも結構あります)

雪乃☆雫雪乃☆雫2017/02/16 16:27 うぇいくさま、ありがとうございます☆
 なななんとー!><
 ・・・て、ふつうに日本語の状態でデータが飛び交っているわけないですもねー;
 よく考えたら、そりゃそうだというところなのですが、ばいとが・・・ばいなりが・・・なんて話は、頭がこんがらかってしまうのですよ;;;
 とっ、とにかく、全部取得してつながるまでは「<RECOGOUT>」タグどころの話ではなく、2バイト文字なんか化けてしまうかも知れないんですね。
 ああぁ~、ソレでピリオドだ!
 なんか今、ようやく意味が分かりました!!
 もっぺんやり直しです。
 ほんとうに、いつもありがとうございます!

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

2017-02-11

PCカメラキャプチャー Ver.2 だよ!

| 00:18

 フルスクリーンのモードについては、レターボックスも、縦横比固定で拡大するのも、特に問題も無くカンタンに実装出来ました。

 とゆうわけで、スペースキーでフルスクリーン表示とウィンドウ表示をトグルするようにした他、右クリックメニューを付けて、モードの変更ができるようにしました。

 このくらいできたら、単に画面にカメラの映像を出して、「おぉ!♪」とか言ってるくらいの、ワタシなんかの実用には十分なんじゃないですかね?

 旧版のなでしこでは、枠なしのフルスクリーンも問題なく動くようなので、これで実行ファイル化しておこうっと。

 珍しく、実用の物を作った気がする(爆)

 いや~、おかげさまでカメラでは、ずいぶん遊んで、まただいぶ賢くなったね☆

#-----------------------------------------------------------------------
# なでしこでノート内蔵カメラをキャプチャ ver.2.00
#-----------------------------------------------------------------------
#☆ver.1.00
#・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー)
#・Enterキーでキャプチャ画像を保存(勝手にデスクトップの日時でファイル作ります)
#-----------------------------------------------------------------------
#☆ver.2.00
#・[F5]キーでキャプチャ動画を保存([Esc]キーか、マウスボタンを押すことで保存終了)
#・[Space]キーで、フルスクリーン表示とウィンドウ表示切り替え。
#・右クリックメニュー追加。各機能の他、フルスクリーンモードが変えられます。
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#-----宣言--------------------------------------------------
枠無フルスクリーンとは整数オフ  #古いなでしこならオンで動きます(1.5332で確認)

CW幅とは整数=640。CW高さとは整数=480。
CWハンドルとは整数=-1  #キャプチャーウィンドウのハンドル。

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

カメラ接続状態とは整数オフ。
フレームレートとは整数=60      #ミリ秒単位
フルスクリーン表示フラグとは整数オフ。
フルスクリーンモードとは整数=1
#(0=デスクトップに合わせて引き延ばす、1=レターボックス、2=縦横比固定でズーム)

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

#-----母艦設計----------------------------------------------
#---ポップアップメニュー----
右クリックメニューとはポップアップメニュー
右クリックメニューに『#親部品名,部品名,テキスト,ショートカット,オプション,イベント
 -,フルスクリーンメニュー,フルスクリーンモード,,,
 --,フルスクリーン0,ノーマル,,,0にフルスクリーンモード変更
 --,フルスクリーン1,レターボックス(縦横比固定),,チェック,1にフルスクリーンモード変更
 --,フルスクリーン2,ズーム(縦横比固定),,,2にフルスクリーンモード変更
 -,ウィンドウメニュー,ウィンドウ表示,,,ウィンドウ表示
 -,-,,,,
 -,静止画保存メニュー,スクリーンショット保存,,,静止画保存。
 -,-,,,,
 -,動画保存メニュー,キャプチャ動画保存,,,動画保存。
 -,動画保存コメント, (終了は[Esc]かマウスクリック),,,
 -,-,,,,
 -,ヘルプメニュー,操作説明,,,操作説明。
 -,バージョンメニュー,バージョン情報,,,バージョン。
 -,-,,,,
 -,メニュー閉,メニューを閉じる,,,
 -,-,,,,
 -,終了メニュー,終了,,,終了処理。
』をポップアップメニュー一括作成

*フルスクリーンモード変更(Aに)
  もし、A=1ならば、
    フルスクリーンモード=1。
    フルスクリーン0のチェックオフ。フルスクリーン1のチェックオン。フルスクリーン2のチェックオフ。
  違えばもし、A=2ならば、
    フルスクリーンモード=2。
    フルスクリーン0のチェックオフ。フルスクリーン1のチェックオフ。フルスクリーン2のチェックオン。
  違えば、
    フルスクリーンモード=0。
    フルスクリーン0のチェックオン。フルスクリーン1のチェックオフ。フルスクリーン2のチェックオフ。
  フルスクリーン表示フラグ=オフ。
  フルスクリーン表示。

*ウィンドウ表示
  フルスクリーン表示フラグ=オン。
  フルスクリーン表示。

#---母艦-----
母艦について
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  オフに最小化ボタン有効変更。
  タイトルは「PCカメラキャプチャー」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。
  ポップアップメニューは右クリックメニュー。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、静止画保存。  # Enter
    違えばもし、押された仮想キー=116ならば、動画保存。  # F5
    違えばもし、押された仮想キー=32ならば、フルスクリーン表示。  # Space
    違えばもし、押された仮想キー=112ならば、操作説明。  # F1
    違えばもし、押された仮想キー=113ならばバージョン。  # F2
母艦黒色画面クリア母艦中央移動。
#-----------------------------------------------------------

#-----メイン------------------------------------------------
母艦の可視はオン
カメラ起動

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

*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルを処理用へ窓内側キャプチャ。
  処理用をファイル名へ画像保存。

*動画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.avi」
  CWハンドルをファイル名にキャプチャファイル設定。
  CWハンドルをキャプチャ開始。

*フルスクリーン表示
  もし、フルスクリーン表示フラグ=オフならば、
    フルスクリーン表示フラグ=オン
    母艦のクライアント幅はデスクトップW母艦のクライアント高さはデスクトップH。
    もし、枠無フルスクリーン=オンならば、
      母艦のスタイルは「枠なし」
      母艦の位置は「0,0」
    違えば、
      母艦中央移動。
    もし、フルスクリーンモード=1ならば、
      CWハンドルに(母艦のクライアント幅-(母艦のクライアント高さ*CW幅/CW高さ))/2,0,(母艦のクライアント高さ*CW幅/CW高さ),母艦のクライアント高さを窓ハンドル位置サイズ設定。
    違えばもし、フルスクリーンモード=2ならば、
      CWハンドルに0,(母艦のクライアント高さ-(母艦のクライアント幅*CW高さ/CW幅))/2,母艦のクライアント幅,(母艦のクライアント幅*CW高さ/CW幅)を窓ハンドル位置サイズ設定。
    違えば、
      CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
    母艦最前面
  違えば、
    フルスクリーン表示フラグ=オフ
    母艦のスタイルは「枠固定」
    母艦のクライアント幅はCW幅。母艦のクライアント高さはCW高さ。
    母艦中央移動。
    CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
  処理用を母艦のクライアント幅,母艦のクライアント高さで画像リサイズ。
  CWハンドルをフルスクリーン表示フラグにスケーリングフラグ設定。

*終了処理
  CWハンドルからカメラ切断。
  CWハンドルをウィンドウ破棄。
  終わる。
#-----------------------------------------------------------
*操作説明
  ダイアログタイトルは「操作説明」
  「◆[Enter]キーでキャプチャ画面のスナップショットを保存。
  
◆[F5]キーでキャプチャ動画を保存。
 [Esc]キーか、マウスボタンを押すことで保存終了となります。
 ※終了させない限り、録画し続けます。
 
◆[Space]キーで、フルスクリーン表示。
 フルスクリーン表示時に[Space]キーで、ウィンドウ表示戻る。
 
◎フルスクリーンモードは、右クリックメニューで変更できます。
 ・ノーマル(デスクトップに合わせて映像を引き延ばします)
 ・レターボックス(縦横比固定。左右に黒枠が入ります)
 ・ズーム(縦横比固定。上下を切ってデスクトップ一杯に表示)
 ※設定ファイルは作ってないので、毎初期値に戻ります。」と言う
#------------------------------------------------------------
*バージョン
  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}PCカメラキャプチャー{二重カッコ閉じ}{改行}   Version 2.00{改行}{改行}   by 雪乃☆雫」と言う。
#-----------------------------------------------------------

#-----ビデオキャプチャー------------------------------------
#https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
#---VFW定数-----
!WM_CAP_DRIVER_CONNECTとは整数=$400+10           # キャプチャウィンドウをキャプチャドライバに接続します。
!WM_CAP_DRIVER_DISCONNECTとは整数=$400+11        # キャプチャウィンドウからキャプチャドライバを切断します。
!WM_CAP_SET_PREVIEWとは整数=$400+50              # プレビューモード(オンオフ)
!WM_CAP_SET_PREVIEWRATEとは整数=$400+52          # プレビューモードのフレーム表示レート(ミリ秒)
!WM_CAP_SET_SCALEとは整数=$400+53                # 画像をキャプチャーウィンドウに合わせて拡縮(オンオフ)
!WM_CAP_SEQUENCEとは整数=$400+62                 # ストリーミングビデオおよびオーディオキャプチャをファイルに開始します。
!WM_CAP_FILE_SET_CAPTURE_FILEとは整数=$400+20    # ビデオキャプチャに使用されるファイルの名前を指定します。
#-----------------------------------------------------------
●カメラ接続(ハンドルに{数値=0}Noの)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0)  # カメラが1台ならNoは0で省略可。

●カメラ切断(ハンドルから)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_DISCONNECT,0,0)

●プレビューレート設定(ハンドルをmsに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEWRATE,ms,0)  # ms=ミリ秒単位

●プレビューモード設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEW,f,0)     # f=オンオフ

●キャプチャ開始(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_SEQUENCE,0,0)

●キャプチャファイル設定(ハンドルをaviファイル名に)
  メッセージ送信(ハンドル,WM_CAP_FILE_SET_CAPTURE_FILE,0,aviファイル名)

●スケーリングフラグ設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_SCALE,f,0)      # f=オンオフ
#-----------------------------------------------------------

#-----API---------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc428606.aspx
●キャプチャーウィンドウ作成(lpszWindowName,dwStyle,x,y,nWidth,nHeight,hWnd,nID) =DLL("avicap32.dll",
"HWND capCreateCaptureWindowA(
LPCSTR lpszWindowName,  // ウィンドウ名
DWORD dwStyle,          // ウィンドウスタイル
int x,                  // X
int y,                  // Y
int nWidth,             // W
int nHeight,            // H
HWND hWnd,              // 親ウィンドウのハンドル
int nID                 // ウィンドウ識別子…ってなんすか;
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411022.aspx
●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,  // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc410763.aspx
●ウィンドウ破棄(hWndを) =DLL("user32.dll",
"BOOL DestroyWindow(
HWND hWnd   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411206.aspx
●SetWindowPos(hWnd,hWndInsertAfter,X,Y,cx,cy,uFlags) =DLL("user32.dll",
"BOOL SetWindowPos(
HWND hWnd,             // ウィンドウのハンドル
HWND hWndInsertAfter,  // 配置順序のハンドル…?
int X,                 // 横方向の位置
int Y,                 // 縦方向の位置
int cx,                // 幅
int cy,                // 高さ
UINT uFlags            // ウィンドウ位置のオプション
)")

●窓ハンドル位置サイズ設定(ハンドルにX,Y,W,Hを)
  SetWindowPos(ハンドル,0,X,Y,W,H,0)
#-----------------------------------------------------------

めだかめだか2017/02/12 02:09ご無沙汰しております。

開いてびっくり!謎のコードがびっしりw
さすがです・・・!
自分で組んだコードでも、後から見返した時に何を書いているのかさっぱりなのに、人様が書いたコードとなるともうさっぱりですねw

ですが、なんとなく理解は...しているつもりですw


ところで、検出プログラムなんですが、なんとなくはできた・・・?のですが、その方法以外が思い浮かばないので、なんとも言えない状態です・・・w
さて、どうしませうか・・・

雪乃☆雫雪乃☆雫2017/02/15 00:53 めだかさんこんにちは。遅くなりましてスミマセン;

 VFW関係のメッセージ送信を、全部関数にして書き換えましたw
 もちろんナゾの呪文は使わず、例の数値を直接指定しても動くんだけど、まさにその、時間が経ってから見返したりするコトを考えると、この呪文で検索するとMSDNとかにたどり着けるので、結局のところ可視性が上がるのかなあと思い、基本英語は見てるだけでダメな人なんですが、使っとくことにしました;;;

 顔検出なんて、その方法もどの方法も、考えたこともないもねー。すごいなあと感心するばかりですよ~。
 是非頑張ってくださいぃ~☆

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

2017-02-10

フルスクリーンにしたい!

| 14:27

 ちょっとまたカメラに戻って、問題の、スタイル指定ですが・・・

 だんだんメッセージ送信だらけなのが、個人的にイヤになったのと、英語はイヤと言っても結局のところ定数は使った方が、後でケンサクするのに便利でしょってわけで、っくり書き換えていたら、なんだか分かんないケド、「枠固定」も、最大化ボタンや最小化ボタンの有効変更も、ふつーに通ったんだよね。

 気のせいだったのか?!・・っと思ったけれど、元のコードではやっぱり動かないんだよね。

 謎。なんだか、わけ分からん(?_?)

 しかも結局、フルスクリーンは出来なかったんですよ。

 カメラ接続前なら、「枠なし」もできたんだけど、カメラ接続後に「枠固定」から「枠なし」に変更すると、やっぱり切断されてしまうっぽい。

 むむむ~。


 それなら、ウィンドウのクライアント幅と高さをデスクトップWとHにして、位置を枠やタイトルバーの分マイナスに設定すれば、一見それっぽくなるだろう・・・と考えたんだけど、コレも出来なかった><

 ウィンドウの最大サイズには上限があるらしく、何を設定しても1370*753以上にはならないんだよね。(解像度が1366*768の場合)

 幅はいいけど、高さが足りない><

 でもまー、とりあえずコレでっ!!(えっ;)

 だって、APIを使えばなんとか出来そうな気もするけど、旧版のなでしこでは、んな苦労しなくても、ふつーに「枠なし」に変更ができるんだもん!


 それよりもっと重要なのが、キャプチャーウィンドウのサイズ変更です。

 これは、窓ハンドルサイズ設定でカンタンに出来るだろうとおもったら、出来なかった。

 これまた、切断(?)されてしまう。

 APIで作ったヤツっていうのは、何かっちゅうと、うまくできないんだねヽ(;´Д`)ノ

 さて、こで、発見してきたのが、SetWindowPosとゆうAPI。

 APIで作ったヤツは、APIで何とかするしかないってこったろう・・・

 「配列順序のハンドル」も、「ウィンドウ位置のオプション」も、なんだかよくわかんないけど、取りあえず無視する!

 そうすると、単にX,Y,W,Hを指定するだけ。

 ちなみに、窓ハンドルサイズ設定のX1,y1,x2,y2より、こっちのほうが、ワタシ的には感覚的に分かりやすくて助かる。

#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411206.aspx
●SetWindowPos(hWnd,hWndInsertAfter,X,Y,cx,cy,uFlags) =DLL("user32.dll",
"BOOL SetWindowPos(
HWND hWnd,             // ウィンドウのハンドル
HWND hWndInsertAfter,  // 配置順序のハンドル…?
int X,                 // 横方向の位置
int Y,                 // 縦方向の位置
int cx,                // 幅
int cy,                // 高さ
UINT uFlags            // ウィンドウ位置のオプション
)")

●窓ハンドル位置サイズ設定(ハンドルにX,Y,W,Hを)
  SetWindowPos(ハンドル,0,X,Y,W,H,0)
#-----------------------------------------------------------

 これで・・・

#-----------------------------------------------------------
母艦のクライアント幅はデスクトップW母艦のクライアント高さはデスクトップH。
CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
CWハンドルをオンにスケーリングフラグ設定。


!WM_CAP_SET_SCALEとは整数=$400+53                # 画像をキャプチャーウィンドウに合わせて拡縮(オンオフ)
●スケーリングフラグ設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_SCALE,f,0)      # f=オンオフ
#-----------------------------------------------------------

 できた~♪♪♪

 でも・・・

 分かってたけど、640*480の映像を1366*768のデスクトップに合わせてるので、横長にみょーんと引き延ばされてしまうのです;

 非HD時代のテレビの再放送みたいに、レターボックスにするか、幅をデスクトップ幅に合わせて、上下を切って表示(できるのかな?)する感じ?

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

2017-02-05

なでしこで、Juliusの音声認識結果を、とりあえず取得してみるよ!

| 18:04

 の後、マイクの設定をちょこっと変更してみたりしつつ、騒音源を全て停止冬の北海道で、ストーブを消すって何?!)させることによって、認識結果は格段に向上しましたwww

「衆院議員は,具体的にどう考えているのか」
  ↓ ↓ ↓
衆議院議員は、物体的になにを考えているのか。
衆院議員が具体的になにを考えているのか。
衆院議員は具体的になにを考えているのか。
衆議院議員は、具体的になにを考えているのか。
衆議院議員が物体的に何を考えているのか。
衆院議員は、具体的になにを考えているのか。

 ちなみに、GMM版です。DNN版は、速度的に・・・かなり厳しい;;;

 こっちの環境の問題も多いとは思うけど、色々、うまく認識出来ない言葉も結構あるようで、音声入力エディタみたいのにするのは、難しいかな?

 しかし、こーして考えると、スマホの音声認識ってすごいよね。まで、あんま使ったこと無かったケド、ふつーに文章打てるんだもんね(驚)

 でも、Juliusは他にも、「文法認識キット」をダウンロードすることで、自分で作成した単語リストによる孤立単語認識や、記述文法による小語彙での認識なども出来るらしいので、まだまだ遊べる余地はありそうです。


 とゆうわけで・・・

 とりあえず、認識結果をなでしこで取得してみました。

 Juliusに「-module」のパラメーターを付けて起動すると、Juliusがサーバーとなり、ポート番号10500で接続待ちとなるので、なでしこのTCPクライアントでこに接続するだけです。

 「run-win-gmm.bat」の内容に、「-module」を追加して、それを「起動」し「接続」してやります。

#-----------------------------------------------------------------------
#クライアントで接続
#-----------------------------------------------------------------------
# ネットワークプラグインを利用
!「nakonet.nako」を取り込む。
#-----------------------------------------------------------------------
母艦のテキストは「Juliusクライアント」
接続待時=10
再試行=0

#-----GUI------------------------------------------------
ログとはTエディタのレイアウトは「全体」

クライアントとはTCPクライアント。
クライアントについて
  ホストは「127.0.0.1」  # 「127.0.0.1」はローカル。
  ポートは10500。  # モジュールモードではJuliusがサーバーとなり、ポート番号10500で接続を待ちます。
  受信した時は~
    クライアントで受信。
    ログは「{ログ}{それ}」
  エラー時は~
    クライアントで切断。
    もし、再試行<接続待時ならば、
      1秒待つ。再試行=再試行+1
      Julius接続。
    違えば、
      クライアントのエラーメッセージ言う。
      終わる。
#-----------------------------------------------------------
# モジュールモードでJuliusを起動。
//「..\..\bin\windows\julius.exe -C main.jconf -C am-gmm.jconf -demo -charconv utf-8 sjis -module」を起動。
#バッチファイルを選択してJulius起動。
「*.bat」のファイル選択して起動もしそれならば終わる母艦最前面。
Julius接続。

*Julius接続
  ログは「{ログ}接続中...」。
  クライアントで接続。
#-----------------------------------------------------------

 音声認識が行われると、XMLで結果が返ってきます。

 こんなのw(゜o゜)w

<STARTPROC/>
.
<INPUT STATUS="LISTEN" TIME="1486283712"/> 
.
<INPUT STATUS="STARTREC" TIME="1486283717"/>
.
<STARTRECOG/>
.
<INPUT STATUS="ENDREC" TIME="1486283721"/>
.
<ENDRECOG/>
.
<INPUTPARAM FRAMES="442" MSEC="4420"/>
.
<RECOGOUT>
  <SHYPO RANK="1" SCORE="-11149.487305">
    <WHYPO WORD="" CLASSID="<s>" PHONE="silB" CM="0.273"/>
    <WHYPO WORD="衆院" CLASSID="衆院+名詞" PHONE="sh u: i N" CM="0.818"/>
    <WHYPO WORD="議員" CLASSID="議員+名詞" PHONE="g i i N" CM="0.079"/>
    <WHYPO WORD="は" CLASSID="は+助詞" PHONE="w a" CM="0.409"/>
    <WHYPO WORD="、" CLASSID="、+補助記号" PHONE="sp" CM="0.149"/>
    <WHYPO WORD="軍隊" CLASSID="軍隊+名詞" PHONE="g u N t a i" CM="0.031"/>
    <WHYPO WORD="的" CLASSID="的+接尾辞" PHONE="t e k i" CM="0.363"/>
    <WHYPO WORD="に" CLASSID="に+助動詞" PHONE="n i" CM="0.105"/>
    <WHYPO WORD="なに" CLASSID="なに+代名詞" PHONE="n a n i" CM="0.631"/>
    <WHYPO WORD="を" CLASSID="を+助詞" PHONE="o" CM="0.452"/>
    <WHYPO WORD="考え" CLASSID="考え+動詞" PHONE="k a N g a e" CM="0.897"/>
    <WHYPO WORD="て" CLASSID="て+助詞" PHONE="t e" CM="0.774"/>
    <WHYPO WORD="いる" CLASSID="いる+動詞" PHONE="i r u" CM="0.822"/>
    <WHYPO WORD="の" CLASSID="の+助詞" PHONE="n o" CM="0.762"/>
    <WHYPO WORD="か" CLASSID="か+助詞" PHONE="k a" CM="0.539"/>
    <WHYPO WORD="。" CLASSID="</s>" PHONE="silE" CM="1.000"/>
  </SHYPO>
</RECOGOUT>
.
<INPUT STATUS="LISTEN" TIME="1486283722"/>
.
<INPUT STATUS="STARTREC" TIME="1486283727"/>

 それ以外の部分の呪文の意味が全く分からないけど、認識結果部分を取り出すこと自体は、まあ簡単そうだね。

 少なくとも、プログラミング講座のHTMLから、キャラのセリフを抜いたのよりは!(爆)

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

2017-02-04

Juliusの音声認識を使ってみるよ!

| 12:39

 突然ですけど、ちょっと面白そうだったので、ダウンロードしてみたよ!

 Juliusとゆうのは、音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジン…だそうです。

http://julius.osdn.jp/index.php

 読みは、ユリウス? ジュリアス?? どっちだ???


 なんか色々難しいですが、取りあえず、動かしてみるだけなら、カンタンです。

 上の、URLから、ディクテーションキットをダウンロードしてくるだけです。

 ネット上の情報を検索すると、たいがい、まず「最新版」をダウンロードし、しかる後に、「ディクテーションキット」と「文法認識キット」を入手せよとゆうことになっていますが、ディクテーションキットには必要の実行ファイルも入っているので、ひとまずこれだけで問題ありません。

 ムシロ、最新版だけをダウンロードした場合、「・・・でっ?!」この先どーしたらいいんすかと、途方に暮れること請け合いですw

 よく分かんないんで、zipを直でダウンロードしましたが、なかなかのサイズでした;

 コレを解凍して・・・まずは、「00readme.txt」だの「LICENSE.txt」だのにもようく目を通した方がいいんでしょうが、とりあえず「HOWTO.txt」にやり方が書いています。

 マイクをセットアップしたあとに、「run-win-dnn.bat」または「run-win-gmm.bat」をダブルクリックするだけでOK☆

 GMM版はDNN版に比べて精度が下がりますが,の分処理は軽く,処理が高速な

バージョン…で、DNN版は高精度ですが,比較的処理が重く…なるそうです。


 がっ・・・

 ワタシがマイクの設定とゆうモノを全く分かっていないせいか、も、ノートPC内蔵のマイクがしょぼいからなのか、はたまた家の中がFF式ストーブのファンだの加湿器だのサーキュレーターだのメダカのブクブクのモーターだのといった騒音に満ちているせいか、なかなかうまく認識出来ないんだよね~ヽ(;´Д`)ノ

「衆院議員は,具体的にどう考えているのか」
  ↓ ↓ ↓
吸引議員が快適になにを考えているのか。
休眠人が具体的になにを案外いいのか。
衆院二幕は海域になにを考えているのか。
周囲にマグ帯域になにを考えにぴあ。
衆院議員が個体的になにを考えているのか。
衆院議員がふたり、一気になにを考えているのか。
衆院議員が食いたい、絶対的になにを考えているのか。

 こりゃひどい(爆)

 「具体的に」をワタシがしゃべれてナイとゆう可能性もあるが(爆2)


 でも・・・

「任意の読み上げ文発声(対象語彙数6万語)をほぼ実時で90%以上認識することができます」

 ・・・とうたっているのだからして、いかになんでも、まちっとマシにできるハズ。

 と言って、アマゾンでマイクなんか買って、やっぱりうまくいかなかった日にはショックだしぃ、だいたい旦那しゃんが色々買ってくれちゃったおかげでっ(`ヘ´)

 なななんと今月は、はやくも! お金が無いぃ~~Σ(゜д゜;えぇっ!!

 もっと認識精度を上げるべく頑張ってみるか、とりあえず、コレをなでしこから使えるよーにだけしてみるか、悩むね;;;

 なでしこも、TCP/IPの接続ができるから、この認識結果を取り込むことはできると思うんだよね。

めだかめだか2017/02/05 07:09こんにちは!(超早朝

雪乃さんが、僕がしてることと同じことしてて、ちょっと笑っちゃいましたw
一時期音声での、操作簡略化...とでも、言うべきでしょうか。そのようなことをしていましたw
例えば、「音楽を再生」というと、PC内から自動で音楽ファイルを開いてくれ
たり、「天気は」というと、天気をネットから引っ張ってきてくれたりと、色々ありますw(アイアンマンのジャービスに憧れてましたw


ただ、Windows標準搭載の音声認識はポンコツだったり、入力できるまでの過程が長かったりと絶望的でした。
ですが、スマホのGoogle音声認識を使えば、手軽に高精度の音声入力が出来たのですっ!スマホをPCのキーボードかわりにしてやれば、きちんと使えて、高精度な音声入力ができました。


ですが、なでしこを使うものとしてなるべく、外部ソフトに頼らず、なでしこを使って音声入力が出来たらいいなと思いながら、タイピングです( ; ; )

雪乃☆雫雪乃☆雫2017/02/05 16:36 めだかさん、こんにちは☆
 ウチは場合によっちゃ三時起きの日もあるので、七時は早朝のうちには入りませんよ~www

 Juliusは、今はやりの(?)raspberry Piで音声認識機能を組み込むのに使われている定番のソフトらしいんですが、なでしこからも使えそうだったので、ちょっとどうかなーと思ってダウンロードしてみたんですよ。
 とりあえず、なでしこで認識結果を取り込むまでは、成功しました。
 実用としてはどうだかなあと言ったところですが、なでしこを、おもちゃにしている者にとっては、まだまだ遊べる余地がありそうです♪

 こういった外部ソフトの音声認識をなでしこから使用するのではなく、なでしこでこういった音声認識プログラム自体を作りたいとゆうことなんですか?
 それはそれは、なかなかハードルの高い野望ですね!!
 ワタシなんか、Juliusのまにゅあるに書いてあるコトすら、いっこも理解出来ない。とても日本語とは思えん(*_*;
 しかしコレはオープンソースってコトですから(Cだそうですけど)なんらかの参考になるんじゃないですか?(@_@)

めだかめだか2017/02/06 16:56こんにちは~

3時起きですか・・・! 僕も一時期そんな時期がありましたー...w自分、朝苦手なんで、めっちゃきつかったですw

自分の場合は、ユリウス?を入れる時点で、めんどくさくなっちゃって、諦めました\(^o^)/


そうですねぇ・・・なでしこの命令のみでの作成をしてみたな~・・・とは思っていますwですが、以前ちょこっと音声認識のシステムを調べてみただけでも、頭がこんがらがっちゃう感じですぅ~(笑
果たして、これは作れるのだろうか・・・と、途方に暮れていましたw

雪乃さんのコードを拝見させていただいたところ、その方法があったか~と、悔しいというか、やられた思いです(笑


余談ですが、PCのスペックもそんなに高くないので、処理が遅くなったりしちゃうんで泣けてきます・・・
なので、はじめから完璧なコードを書かないと、出来ているはずのことも出来ないとなってしまうんですよねぇ~・・・

雪乃☆雫雪乃☆雫2017/02/07 16:44 めだかさんこんにちは。
 Juliusは、ワタシも当初、インストール・・めんどくさそう・・・。こっ、こんぱいる?!ヽ(;´Д`)ノ など思ってたんです。
 なにしろ、raspberryPiなところにばかり検索が引っかかるので、コマンドプロンプトだらけで、もーMS-DOSの時代のことなんか忘れたんだよ! 的な(爆)
 でも蓋を開けたら、ダウンロード→zip解凍→バッチファイルをダブルクリック・・・だけで行けましたw

 ディクテーションは正直、Windows標準の音声認識よりポンコツですwww
 でも、単語リストや文法辞書を使えば、(認識出来る語彙が少ないので当然っちゃあ当然ですが)なかなか良く認識するので、もう少し遊んでみる予定~☆

めだかめだか2017/02/07 18:16どうもです~

ラブベリーパイは、もともと知っていたのでそこで拒絶はおこらなかったのですが、その跡がめんどそうだったので、諦めました\(^o^)/

ネットにも、いくつかそういったファイルがあるそうですが、なんせめんごくさがりなんで、やめましたw


あ、それと軽い報告なのですが、画像から顔だけを検出するプログラムを考えていたのですが、やはり時間がかかってしまいます・・・
もう少し粘ってみてはみますが・・・

めだかめだか2017/02/07 20:49報告です!

無茶苦茶してなんとか1秒以内に処理をすることができましたw
ただし、検出精度が低い可能性がありそうですw

以上です!w

雪乃☆雫雪乃☆雫2017/02/08 21:27顔検出プログラムですか~、すごいですね!!

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

2017-02-01

動画を保存したい!

| 16:18

 さて、引き続きカメラです。

 折角、画面は動いているわけなんだから、静止画だけじゃなく、のまま動画で保存してみたいと思うのが人情ですよね~(?)

 調べてみると、「WM_CAP_SEQUENCE」が、ストリーミングビデオおよびオーディオキャプチャをファイルに開始…するラシイ。

 「WM_CAP_SEQUENCE」は「$400+62」とゆうことで、とりあえず、

メッセージ送信(CWハンドル,$400+62,0,0)

 のようにしてみたんだけど・・・

 一応、これだけで、出来たことは出来たんだけどね。

 デフォルトのファイル名は、「CAPTURE.AVI」のようなことが書いてあったんだけども、1が返ってきているのに、見当たらない

 一体、どこにあんのかと思ったら、検索しないとたどり着けないよーな深いところに「CAPTURE.AVI」が作られてました;

 これはよろしくないので、変更しなくては・・・

 っと、また具合わるくなりながら、ぐーぐる検索様のお力を借りて調べると、「WM_CAP_FILE_SET_CAPTURE_FILE」が、キャプチャーファイル名を設定するヤツらしい。

 これは、「$400+20」とゆうことで、

メッセージ送信(CWハンドル,$400+20,0,"{デスクトップ}CAPTURE.AVI")

 で行けるだろうと思ったら、行かなかった。

 これは、どうやら、最初に「WM_CAP_FILE_SAVEDIBA」が出来なかったのと同じ現象だね。

 ーとーうだうだ考えて、はまりまくった末にひらめいたのは、文字列が通ってないんじゃ? ってこと。

 本家のコードをようく眺めてみたら、「SendMessage」の引数は、wParamがShort、lParamがStringになってるんだね。

 なるほど。

 こうして置いて、数字的なヤツは最初のパラメーター、文字列は2番目のパラメーターで送ってるラシイ。

 とゆうわけで、メッセージ送信のパラメーターの引数の型を変えてみた。

●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,  // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")

 動いた!

 いや~、なんか、賢くなったんじゃないですか?

 でっ、いちおうこんな感じで、録画もできるようになりました♪

 ちなみに、[Esc]キーか、マウスボタンを押すことで保存終了です。

 終了ない限り、ディスクが一杯になるまで保存し続けますのでご注意ですw

キャプチャファイル設定とは整数=$400+20  # WM_CAP_FILE_SET_CAPTURE_FILE
シーケンスとは整数=$400+62     # WM_CAP_SEQUENCE

*動画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.avi」
  メッセージ送信(CWハンドル,キャプチャファイル設定,0,ファイル名)
  メッセージ送信(CWハンドル,シーケンス,0,0)

 ああぁ・・・メッセージ送信が増えてくると・・・(+_+)

 それぞれ関数にした方が見やすかったかな。

めだかめだか2017/02/01 21:01お久しぶりで御座います。
雪乃さんはすっかりAPIマスターですねw
そんな雪乃さんに質問なのですが、

>「WM_CAP_SEQUENCE」は「$400+62」とゆうことで、

これが、わからないんですが...(>_<)
初歩的な質問で申し訳ないですが、ご教授お願いします...!

雪乃☆雫雪乃☆雫2017/02/02 00:08 えっと・・・そんなにマスターはしてないんだけど、参考にしたのはここです。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
https://www.ecoop.net/coop/api/winmes.html

 最初のトコは、全部英語ですからご注意です。ワタシなんぞは、開いた瞬間めまいがして、次に具合わるくなりますwww
 しか~し、ガマンして、ぐーぐる翻訳さまに読んで頂くと、「WM_CAP_SEQUENCEメッセージは、ストリーミングビデオおよびオーディオキャプチャをファイルに開始…」するヤツだと言うことが分かります。
 コレを、SendMessageで送ってやれば、その機能が使えるよってコトです。
 でも、「WM_CAP_SEQUENCE」とゆう文字列を送るわけではなくって、定数として割り当てられてる数値があるので、今度はそれを探さなきゃならないんですよ~(´д`)(前のコードの場合は、参考にしたコードの中に宣言してあった数値を拾っただけなので、カンタンだったんですが)

 さてそこで、2番目のトコです。
 あんまよく分かんないケド、VFW的なメッセージの定義値が一覧表になっています。
 「WM_CAP_SEQUENCE」は「WM_CAP_START+62」となっています。
 この表には書いてないけど、参考にしたコードによると、なんか知らんけど、「WM_USER=WM_CAP_START=$400」とゆうことになるらしいんだよね。
 だから、「WM_CAP_SEQUENCE」は「$400+62」なのです。
(1086と書くことも出来るけど、$400+62のほうが見やすいでしょ? なんとなく)

めだかめだか2017/02/03 01:31返信有難う御座いますー

なるほどー...
WM_CAP_STARTは$400なんですねー...
確かに、1086よりもこっちの方がみやすいですねw

もち合わせでの知識だけでは、理解することが出来ない様な領域ですね...
時間さえあれば、ゆっくりと調べてながらも自力で理解も出来るのですが...


何はともあれ、有難うございます!

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