Juliusで遊んでみる

Juliusとラズベリーパイを上手く使えば、Alexaを作れるのでは？

と思ったので、試験運用がてらJuliusで遊んでみました。

@fishkiller 氏の [Raspberry piで音声認識(julius)を使用して特定の言葉に反応](https://qiita.com/fishkiller/items/c6c5c4dcd9bb8184e484)

~~まるぱく~~ げふん、参考に色々としてみました。

```muripo.py
# coding:utf-8
#Juliusを起動するプログラム
import socket
import subprocess
import time
import xml.etree.ElementTree as ET

HOST = "XXXXXXXXXXX"
PORT = 10500

def tell(sentence):
  map_sentense = map(str, sentence)
  text=''.join(map_sentence)
  f = open('say_word.txt','a')
  f.write('text\n')
  f.close()

def main():
  p = subprocess.Popen(
    ["start_julius.bat"],
    stdout=subprocess.PIPE
    )
  pid = p.stdout.read() #標準出力からJuliusのプロセスIDを取得
  time.sleep(4)
  
  client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  client.connect((HOST, PORT))

  try:
    sentence=[]
    data=""
    while 1:
      if "</RECOGOUT>\n." in data:
        root = ET.fromstring('<?xml version="1.0"?>\n' + data[data.find("<RECOGOUT>"):].replace("\n.", ""))
        for whypo in root.findall("./SHYPO/WHYPO"):
          sentence.append(whypo.get("WORD"))
        
        tell(sentence)
        data = ""
      else:
        data = data + client.recv(1024)
  except KeyboardInterrupt:
    # CTRL+Cで終了
    print("KeyboardInterrupt occured.")
    p.kill() #このプログラムを停止
    subprocess.call(["kill " + pid], shell=True) # juliusを停止
    client.close() #全体を停止

if __name__ == "__main__":
  main()

```

```muri.bat
cd X:XXXXXXX\dictation-kit-v4.4
.\bin\windows\julius.exe -C main.jconf -C am-dnn.jconf -demo -charconv utf-8 sjis -dnnconf julius.dnnconf -module
```
とこんな感じで書いてみたんですが、無理でした

errorの内容的にbatの処理がうまくできてないっぽいです

で、batファイルは手動でしようと思い、サブプロセスを削除したんですが、またerror

どうもelse部分の所で"utf-8"じゃデコードできないんだよ！とのこと

Juliusのサイトで情報あさったら、"Shift-JIS"らしい

というわけで、次は"Shift-JIS"でデコードじゃ！としたら今度は、

"ET.fromstring()"が"utf-8"にしか対応してねぇよ！とerrorを吐いた

"Shift-JIS" ⇒ "Unicode" ⇒ "utf-8" という流れをしようとするも、3系の記事を見つけられず、あぼん

"ET.fromstring()"を使わないことと 'muri.bat' 内の"-charconv utf-8 sjis"をひっくり返したこと

どうしてこの二つをしたのか覚えてない・・・

```nextmuripo.py
import socket

def tell(text):
  f = open('XXXX\\XXXX\\voice\\say_word.txt','w')
  text = text.replace("CLASSID=","")
  text = text.replace("E","")
  f.write(text)
  f.close()

def main():
  host = "XXXXX"
  port = 10500

  client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  client.connect((host, port))
  data=''
  try:
    while(1):
      if '</RECOGOUT>\n.' in data:
        text=''
        for line in data.split('\n'):
          index = line.find('WORD="')
          if index != -1:
            line = line[index+6:line.find('"',index+6)]
            text += str(line)
            print(text)       
        tell(text)
        text=''
        data=''
      else:
        data=data + str(client.recv(1024).decode('utf-8'))

  except KeyboardInterrupt:
    # CTRL+Cで終了
    print("KeyboardInterrupt occured.")
    client.close() #全体を停止

if __name__ == "__main__":
  main()
```
こんな感じで書き換えたものの、txtファイルに変な文字が混ざるので、

それを消すために "replace()" をねじ込むも、文字化けぱないの！になる

やってられねぇぜ！となったので、その辺りで **[The Julius book](https://julius.osdn.jp/juliusbook/ja/index.html)** を改めて確認して、

バッチファイルが全て悪かったという結論に・・・~~DNNだからダメなんだな！と思ってたやつwww私です~~

```revision.bat
cd X:XXXXXXX\dictation-kit-v4.4
.\bin\windows\julius.exe -C main.jconf -C am-gmm.jconf -demo -module
```
こうすれば、"replace()"は用済みでした

んー、バージョンによって違いがあるのかもしれないけれど、デフォルトは "utf-8" ぽいですね・・・

"-charconv" のコマンドが文字変更しますネ、を表しているので、

それを付けずとも普通に表示されたところを見るに、そんな感じがしますね

[付録 B. オプション一覧](https://julius.osdn.jp/juliusbook/ja/desc_options.html) を見ると、

txtファイルじゃなくてlogファイルで保存すればいいのでは？

とか色々と思う所はあるのですが、最終的にはこんな感じ

```Interim.py
import socket

def tell(text):
  f = open('XXXX\\XXXX\\voice\\say_word.txt','w')
  f.write(text)
  f.close()

def main():
  host = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
  port = 10500

  client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  client.connect((host, port))
  data=''
  try:
    while(1):
      if '</RECOGOUT>\n.' in data:
        text=''
        for line in data.split('\n'):
          index = line.find('WORD="')
          if index != -1:
            line = line[index+6:line.find('"',index+6)]
            text += str(line)
            print(text)       
        tell(text)
        text=''
        data=''
      else:
        data=data + str(client.recv(1024).decode('utf-8'))

  except KeyboardInterrupt:
    # CTRL+Cで終了
    print("KeyboardInterrupt occured.")
    client.close() #全体を停止

if __name__ == "__main__":
  main()
```
一応はtxtに保存できるようになりました

元々は保存したテキストをソフトークに流して復唱させようとしたんですが、

いまいちコマンドからの操作が分からないんですよね・・・誰か教えてクレメンス
<br>
以上!