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