Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

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っぽく会話に柔軟性を持たせようとするなら、断然記述文法だろうね。

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

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

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

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

トラックバック - 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

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/05 (日)

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

| 18:04 | なでしこで、Juliusの音声認識結果を、とりあえず取得してみるよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - なでしこで、Juliusの音声認識結果を、とりあえず取得してみるよ! - 雪乃☆雫のなでしこ日和 なでしこで、Juliusの音声認識結果を、とりあえず取得してみるよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 の後、マイクの設定をちょこっと変更してみたりしつつ、騒音源を全て停止冬の北海道で、ストーブを消すって何?!)させることによって、認識結果は格段に向上しました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の音声認識を使ってみるよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - Juliusの音声認識を使ってみるよ! - 雪乃☆雫のなでしこ日和 Juliusの音声認識を使ってみるよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

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

 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