音声認識がしたいです。
このような要望にお応えします。
今回は、特定の単語が発声されたときに音声を認識する仕組みを作成しようと思います。
これが実現すれば、特定の単語の音声を認識したとき、その単語に従いデバイスを制御するなどができそうですね。
音声認識ツールは、音声認識ソフトウェアjuliusを使用します。osはwindows 10です。
juliusについては、下記の記事において導入方法をまとめています。
特定の単語が発声されたとき、それを認識するために辞書を作成します。
今回は、簡単な例として、挨拶されたときに認識できるように辞書を作成してみます。
juliusでは、辞書を作成する際に、はじめにyomiファイルとgrammarファイル、vacaファイルを用意します。
yomiファイル greeting.yomi
1 2 3 4 |
おはよう おはよう ございます ございます こんにちは こんにちわ こんばんは こんばんわ |
vocaファイル greeting.voca
1 2 3 4 5 6 7 8 9 |
% GREET おはよう o h a y o u ございます g o z a i m a s u こんにちは k o N n i ch i w a こんばんは k o N b a N w a % NS_B <s> silB % NS_E </s> silE |
grammerファイル greeting.grammer
1 |
S : NS_B GREET NS_E |
それでは、ファイルを作成します。
yomiファイルには、認識させたい単語を定義します。 左側に単語、右側にその単語の読み方を定義します。 今回は挨拶に関連する単語として”おはよう”, “ございます”, “こんにちは”, “こんばんは”を定義しました。
vocaファイルは、juliusに付属されているyomi2voca.plを使用することで出力されます。入力はyomiファイルです。
拡張子がplとなっていますので、perl実行環境が必要です。本稿では、perlの実行環境として、ActivaPerlを導入しました。
ActivaPerl導入後、コマンドプロンプトを開き、下記のコマンドを実行してバージョン表示されるとインストール成功しています。
1 |
perl -v |
下記のコマンド実行することでvocaファイルを生成できます。
1 |
perl yomi2voca.pl greeting |
これで作成されると思うのですが、本稿の環境では作成できませんでした。
そのため、下記のページを参考にpythonを用いてvocaファイルを作成しました。
- http://radiumproduction.blog.shinobi.jp/python/python%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6windows%E3%81%A7julius%E3%82%92%E5%8B%95
vocaファイル生成プログラムは、以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 |
# -*- coding: utf-8 -*- # Copyright (c) 1991-2011 Kawahara Lab., Kyoto University # Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology # Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology # Julius for python convert by radiumproduction # Copyright (c) 2007-2017 RadiumProduction import sys import os import re args = sys.argv error=0 lineno=0 yomi = open(os.path.dirname(os.path.abspath(__file__))+"/"+args[1]+".yomi", 'r') voca = open(os.path.dirname(os.path.abspath(__file__))+"/"+args[1]+".voca", 'w') for line in yomi: if re.match(u"^%",line): voca.write(line)#+"\n") continue; word=line.split() word[1]=word[1].rstrip(os.linesep) # 3文字以上からなる変換規則(v a) word[1]=word[1].replace("う゛ぁ","b a ") word[1]=word[1].replace("う゛ぃ","b i ") word[1]=word[1].replace("う゛ぇ","b e ") word[1]=word[1].replace("う゛ぉ","b o ") word[1]=word[1].replace("う゛ゅ","by u ") # 2文字からなる変換規則 word[1]=word[1].replace("ぅ゛","b u ") word[1]=word[1].replace("あぁ","a a ") word[1]=word[1].replace("いぃ","i i ") word[1]=word[1].replace("いぇ","i e ") word[1]=word[1].replace("いゃ","y a ") word[1]=word[1].replace("うぅ","u: ") word[1]=word[1].replace("えぇ","e e ") word[1]=word[1].replace("おぉ","o: ") word[1]=word[1].replace("かぁ","k a: ") word[1]=word[1].replace("きぃ","k i: ") word[1]=word[1].replace("くぅ","k u: ") word[1]=word[1].replace("くゃ","ky a ") word[1]=word[1].replace("くゅ","ky u ") word[1]=word[1].replace("くょ","ky o ") word[1]=word[1].replace("けぇ","k e: ") word[1]=word[1].replace("こぉ","k o: ") word[1]=word[1].replace("がぁ","g a: ") word[1]=word[1].replace("ぎぃ","g i: ") word[1]=word[1].replace("ぐぅ","g u: ") word[1]=word[1].replace("ぐゃ","gy a ") word[1]=word[1].replace("ぐゅ","gy u ") word[1]=word[1].replace("ぐょ","gy o ") word[1]=word[1].replace("げぇ","g e: ") word[1]=word[1].replace("ごぉ","g o: ") word[1]=word[1].replace("さぁ","s a: ") word[1]=word[1].replace("しぃ","sh i: ") word[1]=word[1].replace("すぅ","s u: ") word[1]=word[1].replace("すゃ","sh a ") word[1]=word[1].replace("すゅ","sh u ") word[1]=word[1].replace("すょ","sh o ") word[1]=word[1].replace("せぇ","s e: ") word[1]=word[1].replace("そぉ","s o: ") word[1]=word[1].replace("ざぁ","z a: ") word[1]=word[1].replace("じぃ","j i: ") word[1]=word[1].replace("ずぅ","z u: ") word[1]=word[1].replace("ずゃ","zy a ") word[1]=word[1].replace("ずゅ","zy u ") word[1]=word[1].replace("ずょ","zy o ") word[1]=word[1].replace("ぜぇ","z e: ") word[1]=word[1].replace("ぞぉ","z o: ") word[1]=word[1].replace("たぁ","t a: ") word[1]=word[1].replace("ちぃ","ch i: ") word[1]=word[1].replace("つぁ","ts a ") word[1]=word[1].replace("つぃ","ts i ") word[1]=word[1].replace("つぅ","ts u: ") word[1]=word[1].replace("つゃ","ch a ") word[1]=word[1].replace("つゅ","ch u ") word[1]=word[1].replace("つょ","ch o ") word[1]=word[1].replace("つぇ","ts e ") word[1]=word[1].replace("つぉ","ts o ") word[1]=word[1].replace("てぇ","t e: ") word[1]=word[1].replace("とぉ","t o: ") word[1]=word[1].replace("だぁ","d a: ") word[1]=word[1].replace("ぢぃ","j i: ") word[1]=word[1].replace("づぅ","d u: ") word[1]=word[1].replace("づゃ","zy a ") word[1]=word[1].replace("づゅ","zy u ") word[1]=word[1].replace("づょ","zy o ") word[1]=word[1].replace("でぇ","d e: ") word[1]=word[1].replace("どぉ","d o: ") word[1]=word[1].replace("なぁ","n a: ") word[1]=word[1].replace("にぃ","n i: ") word[1]=word[1].replace("ぬぅ","n u: ") word[1]=word[1].replace("ぬゃ","ny a ") word[1]=word[1].replace("ぬゅ","ny u ") word[1]=word[1].replace("ぬょ","ny o ") word[1]=word[1].replace("ねぇ","n e: ") word[1]=word[1].replace("のぉ","n o: ") word[1]=word[1].replace("はぁ","h a: ") word[1]=word[1].replace("ひぃ","h i: ") word[1]=word[1].replace("ふぅ","f u: ") word[1]=word[1].replace("ふゃ","hy a ") word[1]=word[1].replace("ふゅ","hy u ") word[1]=word[1].replace("ふょ","hy o ") word[1]=word[1].replace("へぇ","h e: ") word[1]=word[1].replace("ほぉ","h o: ") word[1]=word[1].replace("ばぁ","b a: ") word[1]=word[1].replace("びぃ","b i: ") word[1]=word[1].replace("ぶぅ","b u: ") word[1]=word[1].replace("ふゃ","hy a ") word[1]=word[1].replace("ぶゅ","by u ") word[1]=word[1].replace("ふょ","hy o ") word[1]=word[1].replace("べぇ","b e: ") word[1]=word[1].replace("ぼぉ","b o: ") word[1]=word[1].replace("ぱぁ","p a: ") word[1]=word[1].replace("ぴぃ","p i: ") word[1]=word[1].replace("ぷぅ","p u: ") word[1]=word[1].replace("ぷゃ","py a ") word[1]=word[1].replace("ぷゅ","py u ") word[1]=word[1].replace("ぷょ","py o ") word[1]=word[1].replace("ぺぇ","p e: ") word[1]=word[1].replace("ぽぉ","p o: ") word[1]=word[1].replace("まぁ","m a: ") word[1]=word[1].replace("みぃ","m i: ") word[1]=word[1].replace("むぅ","m u: ") word[1]=word[1].replace("むゃ","my a ") word[1]=word[1].replace("むゅ","my u ") word[1]=word[1].replace("むょ","my o ") word[1]=word[1].replace("めぇ","m e: ") word[1]=word[1].replace("もぉ","m o: ") word[1]=word[1].replace("やぁ","y a: ") word[1]=word[1].replace("ゆぅ","y u: ") word[1]=word[1].replace("ゆゃ","y a: ") word[1]=word[1].replace("ゆゅ","y u: ") word[1]=word[1].replace("ゆょ","y o: ") word[1]=word[1].replace("よぉ","y o: ") word[1]=word[1].replace("らぁ","r a: ") word[1]=word[1].replace("りぃ","r i: ") word[1]=word[1].replace("るぅ","r u: ") word[1]=word[1].replace("るゃ","ry a ") word[1]=word[1].replace("るゅ","ry u ") word[1]=word[1].replace("るょ","ry o ") word[1]=word[1].replace("れぇ","r e: ") word[1]=word[1].replace("ろぉ","r o: ") word[1]=word[1].replace("わぁ","w a: ") word[1]=word[1].replace("をぉ","o: ") word[1]=word[1].replace("う゛","b u ") word[1]=word[1].replace("でぃ","d i ") word[1]=word[1].replace("でぇ","d e: ") word[1]=word[1].replace("でゃ","dy a ") word[1]=word[1].replace("でゅ","dy u ") word[1]=word[1].replace("でょ","dy o ") word[1]=word[1].replace("てぃ","t i ") word[1]=word[1].replace("てぇ","t e: ") word[1]=word[1].replace("てゃ","ty a ") word[1]=word[1].replace("てゅ","ty u ") word[1]=word[1].replace("てょ","ty o ") word[1]=word[1].replace("すぃ","s i ") word[1]=word[1].replace("ずぁ","z u a ") word[1]=word[1].replace("ずぃ","z i ") word[1]=word[1].replace("ずぅ","z u ") word[1]=word[1].replace("ずゃ","zy a ") word[1]=word[1].replace("ずゅ","zy u ") word[1]=word[1].replace("ずょ","zy o ") word[1]=word[1].replace("ずぇ","z e ") word[1]=word[1].replace("ずぉ","z o ") word[1]=word[1].replace("きゃ","ky a ") word[1]=word[1].replace("きゅ","ky u ") word[1]=word[1].replace("きょ","ky o ") word[1]=word[1].replace("しゃ","sh a ") word[1]=word[1].replace("しゅ","sh u ") word[1]=word[1].replace("しぇ","sh e ") word[1]=word[1].replace("しょ","sh o ") word[1]=word[1].replace("ちゃ","ch a ") word[1]=word[1].replace("ちゅ","ch u ") word[1]=word[1].replace("ちぇ","ch e ") word[1]=word[1].replace("ちょ","ch o ") word[1]=word[1].replace("とぅ","t u ") word[1]=word[1].replace("とゃ","ty a ") word[1]=word[1].replace("とゅ","ty u ") word[1]=word[1].replace("とょ","ty o ") word[1]=word[1].replace("どぁ","d o a ") word[1]=word[1].replace("どぅ","d u ") word[1]=word[1].replace("どゃ","dy a ") word[1]=word[1].replace("どゅ","dy u ") word[1]=word[1].replace("どょ","dy o ") word[1]=word[1].replace("どぉ","d o: ") word[1]=word[1].replace("にゃ","ny a ") word[1]=word[1].replace("にゅ","ny u ") word[1]=word[1].replace("にょ","ny o ") word[1]=word[1].replace("ひゃ","hy a ") word[1]=word[1].replace("ひゅ","hy u ") word[1]=word[1].replace("ひょ","hy o ") word[1]=word[1].replace("みゃ","my a ") word[1]=word[1].replace("みゅ","my u ") word[1]=word[1].replace("みょ","my o ") word[1]=word[1].replace("りゃ","ry a ") word[1]=word[1].replace("りゅ","ry u ") word[1]=word[1].replace("りょ","ry o ") word[1]=word[1].replace("ぎゃ","gy a ") word[1]=word[1].replace("ぎゅ","gy u ") word[1]=word[1].replace("ぎょ","gy o ") word[1]=word[1].replace("ぢぇ","j e ") word[1]=word[1].replace("ぢゃ","j a ") word[1]=word[1].replace("ぢゅ","j u ") word[1]=word[1].replace("ぢょ","j o ") word[1]=word[1].replace("じぇ","j e ") word[1]=word[1].replace("じゃ","j a ") word[1]=word[1].replace("じゅ","j u ") word[1]=word[1].replace("じょ","j o ") word[1]=word[1].replace("びゃ","by a ") word[1]=word[1].replace("びゅ","by u ") word[1]=word[1].replace("びょ","by o ") word[1]=word[1].replace("ぴゃ","py a ") word[1]=word[1].replace("ぴゅ","py u ") word[1]=word[1].replace("ぴょ","py o ") word[1]=word[1].replace("うぁ","u a ") word[1]=word[1].replace("うぃ","w i ") word[1]=word[1].replace("うぇ","w e ") word[1]=word[1].replace("うぉ","w o ") word[1]=word[1].replace("ふぁ","f a ") word[1]=word[1].replace("ふぃ","f i ") word[1]=word[1].replace("ふぅ","f u ") word[1]=word[1].replace("ふゃ","hy a ") word[1]=word[1].replace("ふゅ","hy u ") word[1]=word[1].replace("ふょ","hy o ") word[1]=word[1].replace("ふぇ","f e ") word[1]=word[1].replace("ふぉ","f o ") # 1音からなる変換規則 word[1]=word[1].replace("あ","a ") word[1]=word[1].replace("い","i ") word[1]=word[1].replace("う","u ") word[1]=word[1].replace("え","e ") word[1]=word[1].replace("お","o ") word[1]=word[1].replace("か","k a ") word[1]=word[1].replace("き","k i ") word[1]=word[1].replace("く","k u ") word[1]=word[1].replace("け","k e ") word[1]=word[1].replace("こ","k o ") word[1]=word[1].replace("さ","s a ") word[1]=word[1].replace("し","sh i ") word[1]=word[1].replace("す","s u ") word[1]=word[1].replace("せ","s e ") word[1]=word[1].replace("そ","s o ") word[1]=word[1].replace("た","t a ") word[1]=word[1].replace("ち","ch i ") word[1]=word[1].replace("つ","ts u ") word[1]=word[1].replace("て","t e ") word[1]=word[1].replace("と","t o ") word[1]=word[1].replace("な","n a ") word[1]=word[1].replace("に","n i ") word[1]=word[1].replace("ぬ","n u ") word[1]=word[1].replace("ね","n e ") word[1]=word[1].replace("の","n o ") word[1]=word[1].replace("は","h a ") word[1]=word[1].replace("ひ","h i ") word[1]=word[1].replace("ふ","f u ") word[1]=word[1].replace("へ","h e ") word[1]=word[1].replace("ほ","h o ") word[1]=word[1].replace("ま","m a ") word[1]=word[1].replace("み","m i ") word[1]=word[1].replace("む","m u ") word[1]=word[1].replace("め","m e ") word[1]=word[1].replace("も","m o ") word[1]=word[1].replace("ら","r a ") word[1]=word[1].replace("り","r i ") word[1]=word[1].replace("る","r u ") word[1]=word[1].replace("れ","r e ") word[1]=word[1].replace("ろ","r o ") word[1]=word[1].replace("が","g a ") word[1]=word[1].replace("ぎ","g i ") word[1]=word[1].replace("ぐ","g u ") word[1]=word[1].replace("げ","g e ") word[1]=word[1].replace("ご","g o ") word[1]=word[1].replace("ざ","z a ") word[1]=word[1].replace("じ","j i ") word[1]=word[1].replace("ず","z u ") word[1]=word[1].replace("ぜ","z e ") word[1]=word[1].replace("ぞ","z o ") word[1]=word[1].replace("だ","d a ") word[1]=word[1].replace("ぢ","j i ") word[1]=word[1].replace("づ","z u ") word[1]=word[1].replace("で","d e ") word[1]=word[1].replace("ど","d o ") word[1]=word[1].replace("ば","b a ") word[1]=word[1].replace("び","b i ") word[1]=word[1].replace("ぶ","b u ") word[1]=word[1].replace("べ","b e ") word[1]=word[1].replace("ぼ","b o ") word[1]=word[1].replace("ぱ","p a ") word[1]=word[1].replace("ぴ","p i ") word[1]=word[1].replace("ぷ","p u ") word[1]=word[1].replace("ぺ","p e ") word[1]=word[1].replace("ぽ","p o ") word[1]=word[1].replace("や","y a ") word[1]=word[1].replace("ゆ","y u ") word[1]=word[1].replace("よ","y o ") word[1]=word[1].replace("わ","w a ") word[1]=word[1].replace("ゐ","i ") word[1]=word[1].replace("ゑ","e ") word[1]=word[1].replace("ん","N ") word[1]=word[1].replace("っ","q ") word[1]=word[1].replace("ー",": ") # ここまでに処理されてない ぁぃぅぇぉ はそのまま大文字扱い word[1]=word[1].replace("ぁ","a ") word[1]=word[1].replace("ぃ","i ") word[1]=word[1].replace("ぅ","u ") word[1]=word[1].replace("ぇ","e ") word[1]=word[1].replace("ぉ","o ") word[1]=word[1].replace("ゎ","w a ") word[1]=word[1].replace("ぉ","o ") # その他特別なルール word[1]=word[1].replace("を","o ") word[1]=re.sub(r"^ ","",word[1]) word[1]=re.sub(r":+",":",word[1]) word[1]=re.sub(r" :",":",word[1]) lineno+=1 if re.match(r"^[a-zA-Z:]+$",word[1]): if error==0: error=1 print("Error: (they were also printed to stdout)"+"\n") print("line "+str(lineno)+":"+word[0]+"\t"+word[1]+"\n") voca.write(word[0]+"\t"+word[1]+"\n") if len(args)==3: if args[2]=="-n": voca.write(r"% NOISE"+"\n") voca.write(r"<sp>"+"\tsp"+"\n") voca.write(r"% NS_B"+"\n") voca.write(r"<s>"+"\tsilB"+"\n") voca.write(r"% NS_E"+"\n") voca.write(r"</s>"+"\tsilE"+"\n") yomi.close() voca.close() |
Pythonは、python3.x系を使用しています。
プログラム実行後、下記内容のvocaファイルが作成されます。
1 2 3 4 5 6 7 8 |
おはよう o h a y o u ございます g o z a i m a s u こんにちは k o N n i ch i w a こんばんは k o N b a N w a % NS_B <s> silB % NS_E </s> silE |
続いて、grammerファイルを作成します。こちらは手作業で作成しました。
1 |
S : NS_B GREET NS_E |
Sは認識する文書(構文定義)、NS_B, NS_Eはそれぞれ開始と終端を表します。
GREETが認識させたい単語になります。
GREETの定義が何を指しているのかをvocaファイルにて明確にします。具体的には、生成したvocaファイルに対して、「% GREET」を追加します。
1 2 3 4 5 6 7 8 9 |
% GREET おはよう o h a y o u ございます g o z a i m a s u こんにちは k o N n i ch i w a こんばんは k o N b a N w a % NS_B <s> silB % NS_E </s> silE |
これで辞書を作成するための準備ができました。
juliusに付属されているmkdfa.plを使用することで辞書ファイル一式が生成されます。
1 |
perl mkdfa.pl greeting |
これを実行することで、dfaファイル、dictファイル、termファイルが生成されます。
それでは、作成した辞書で音声認識を行います。
下記のコマンドを実行することで作成した辞書を用いて音声認識できます。
juliusの実行環境はディクテーション実行キットを使用しています。作成した辞書一式をdicフォルダを新規作成し格納しています。
1 |
bin\windows\julius.exe -C am-gmm.jconf -nostrip -gram dic\greeting -input mic |
実行結果は、以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
pass1_best: <s> おはよう </s> pass1_best_wordseq: 1 0 2 pass1_best_phonemeseq: silB | o h a y o u | silE pass1_best_score: -2693.859863 ### Recognition: 2nd pass (RL heuristic best-first) STAT: 00 _default: 6 generated, 6 pushed, 4 nodes popped in 106 sentence1: <s> おはよう </s> wseq1: 1 0 2 phseq1: silB | o h a y o u | silE cmscore1: 1.000 1.000 1.000 score1: -2693.860840 pass1_best: <s> ございます pass1_best_wordseq: 1 0 pass1_best_phonemeseq: silB | g o z a i m a s u pass1_best_score: -1995.536743 ### Recognition: 2nd pass (RL heuristic best-first) STAT: 00 _default: 6 generated, 6 pushed, 4 nodes popped in 76 sentence1: <s> ございます </s> wseq1: 1 0 2 phseq1: silB | g o z a i m a s u | silE cmscore1: 1.000 1.000 1.000 score1: -2010.729126 pass1_best: <s> こんにちは </s> pass1_best_wordseq: 1 0 2 pass1_best_phonemeseq: silB | k o N n i ch i w a | silE pass1_best_score: -3051.449219 ### Recognition: 2nd pass (RL heuristic best-first) STAT: 00 _default: 6 generated, 6 pushed, 4 nodes popped in 121 sentence1: <s> こんにちは </s> wseq1: 1 0 2 phseq1: silB | k o N n i ch i w a | silE cmscore1: 1.000 1.000 1.000 score1: -3051.448242 pass1_best: <s> こんばんは </s> pass1_best_wordseq: 1 0 2 pass1_best_phonemeseq: silB | k o N b a N w a | silE pass1_best_score: -2383.364258 ### Recognition: 2nd pass (RL heuristic best-first) STAT: 00 _default: 6 generated, 6 pushed, 4 nodes popped in 91 sentence1: <s> こんばんは </s> wseq1: 1 0 2 phseq1: silB | k o N b a N w a | silE cmscore1: 1.000 1.000 1.000 score1: -2383.364990 |
作成した辞書に定義されている単語が発声されたとき、認識されていることを確認しました。
今回は、音声認識用の辞書を作成して、特定の単語を音声認識してみました。
これにより、rasperry pi等のエッジデバイスに対して音声による制御が実現可能だと思いますので試してみるのもいいかもしれませんね。
下記を参考にさせていただきました。
- https://qiita.com/mininobu/items/322a49856e6665bc8a30
- http://sap.ist.i.kyoto-u.ac.jp/members/kawahara/paper/RI-HIS09.pdf
- https://www.activestate.com/products/perl/
- http://radiumproduction.blog.shinobi.jp/python/python%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6windows%E3%81%A7julius%E3%82%92%E5%8B%95
- http://blog.kamabokonet.com/2014/10/19/julius%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98%E3%81%A7%E9%81%8A%E3%81%BC%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89%E5%A4%A7%E5%A4%89%E3%81%A0%E3%81%A3%E3%81%9F/