音声認識

音声認識の基礎知識を紹介します。

線形予測分析

線形予測分析(LPC)」を参照しました。

レビンソン・ダービン再帰法を用いてLPC係数を求める

「レビンソン・ダービン」ライブラリ(levinson_durbin.py)

#coding:utf-8
import numpy as np
from pylab import *

def autocorr(x, nlags=None):
    """自己相関関数を求める
    x:     信号
    nlags: 自己相関関数のサイズ(lag=0からnlags-1まで)
           引数がなければ(lag=0からlen(x)-1まですべて)
    """
    N = len(x)
    if nlags == None: nlags = N
    r = np.zeros(nlags)
    for lag in range(nlags):
        for n in range(N - lag):
            r[lag] += x[n] * x[n + lag]
    return r

def LevinsonDurbin(r, lpcOrder):
    """Levinson-Durbinのアルゴリズム
    k次のLPC係数からk+1次のLPC係数を再帰的に計算して
    LPC係数を求める"""
    # LPC係数(再帰的に更新される)
    # a[0]は1で固定のためlpcOrder個の係数を得るためには+1が必要
    a = np.zeros(lpcOrder + 1)
    e = np.zeros(lpcOrder + 1)

    # k = 1の場合
    a[0] = 1.0
    a[1] = - r[1] / r[0]
    e[1] = r[0] + r[1] * a[1]
    lam = - r[1] / r[0]

    # kの場合からk+1の場合を再帰的に求める
    for k in range(1, lpcOrder):
        # lambdaを更新
        lam = 0.0
        for j in range(k + 1):
            lam -= a[j] * r[k + 1 - j]
        lam /= e[k]

        # aを更新
        # UとVからaを更新
        U = [1]
        U.extend([a[i] for i in range(1, k + 1)])
        U.append(0)

        V = [0]
        V.extend([a[i] for i in range(k, 0, -1)])
        V.append(1)

        a = np.array(U) + lam * np.array(V)

        # eを更新
        e[k + 1] = e[k] * (1.0 - lam * lam)

    return a, e[-1]

if __name__ == "__main__":
    original = np.zeros(128)
    for i in range(len(original)):
        original[i] = np.sin(i * 0.01) + 0.75 * np.sin(i * 0.03) + 0.5 * np.sin(i * 0.05) + 0.25 * np.sin(i * 0.11)

    lpcOrder = 16  # LPC係数の次数

    # 自己相関関数を計算
    # r[0]からr[lpcOrder]までlpcOrder+1個必要
    r = autocorr(original, lpcOrder + 1)
    for i in range(lpcOrder + 1):
        print("r[%d]: %f" % (i, r[i]))

    # Levinson-Durbinアルゴリズムを用いてLPC係数と最小誤差を計算
    a, e = LevinsonDurbin(r, lpcOrder)
    print("*** result ***")
    print("a:", a)
    print("e:", e)

    # LPCで前向き予測した信号を求める
    predicted = np.copy(original)
    # 過去lpcOrder分から予測するので開始インデックスはlpcOrderから
    # それより前は予測せずにオリジナルの信号をコピーしている
    for i in range(lpcOrder, len(predicted)):
        predicted[i] = 0.0
        for j in range(1, lpcOrder):
            predicted[i] -= a[j] * original[i - 1 - j]

    # オリジナルの信号をプロット
    plot(original)
    # LPCで前向き予測した信号をプロット
    plot(predicted)
    show()

①オリジナルデータを生成
    original = np.zeros(128)
    for i in range(len(original)):
        original[i] = np.sin(i * 0.01) + 0.75 * np.sin(i * 0.03) + 0.5 * np.sin(i * 0.05) + 0.25 * np.sin(i * 0.11)

    lpcOrder = 16  # LPC係数の次数
②自己相関関数を計算

r[0]からr[lpcOrder]までlpcOrder+1個必要

    r = autocorr(original, lpcOrder + 1)
    for i in range(lpcOrder + 1):
        print("r[%d]: %f" % (i, r[i]))
③Levinson-Durbinアルゴリズムを用いてLPC係数と最小誤差を計算
    a, e = LevinsonDurbin(r, lpcOrder)
    print("*** result ***")
    print("a:", a)
    print("e:", e)
④LPCで前向き予測した信号を求める
    predicted = np.copy(original)
⑤過去lpcOrder分から予測するので開始インデックスはlpcOrderから

# それより前は予測せずにオリジナルの信号をコピーしている

    for i in range(lpcOrder, len(predicted)):
        predicted[i] = 0.0
        for j in range(1, lpcOrder):
            predicted[i] -= a[j] * original[i - 1 - j]
⑥オリジナルの信号をプロット
    plot(original)
⑦LPCで前向き予測した信号をプロット
    plot(predicted)
⑧プロットを表示する
    show()

LPCスペクトル包絡

LPCスペクトル包絡を求めるアプリ
#coding:utf-8
import wave
import numpy as np
import scipy.io.wavfile
import scipy.signal
import scipy.fftpack
from pylab import *
from levinson_durbin import autocorr, LevinsonDurbin

"""LPCスペクトル包絡を求める"""

def wavread(filename):
    wf = wave.open(filename, "r")
    fs = wf.getframerate()
    x = wf.readframes(wf.getnframes())
    x = np.frombuffer(x, dtype="int16") / 32768.0  # (-1, 1)に正規化
    wf.close()
    return x, float(fs)

def preEmphasis(signal, p):
    """プリエンファシスフィルタ"""
    # 係数 (1.0, -p) のFIRフィルタを作成
    return scipy.signal.lfilter([1.0, -p], 1, signal)

if __name__ == "__main__":
    # 音声をロード
    wav, fs = wavread("test.wav")
    t = np.arange(0.0, len(wav) / fs, 1/fs)

    # 音声波形の中心部分を切り出す
    center = len(wav) / 2  # 中心のサンプル番号
    cuttime = 0.04         # 切り出す長さ [s]
    s = wav[int(center) - int(cuttime/2*fs) : int(center) + int(cuttime/2*fs)]

    # プリエンファシスフィルタをかける
    p = 0.97         # プリエンファシス係数
    s = preEmphasis(s, p)

    # ハミング窓をかける
    hammingWindow = np.hamming(len(s))
    s = s * hammingWindow

    # LPC係数を求める
    lpcOrder = 32
    r = autocorr(s, lpcOrder + 1)
    a, e  = LevinsonDurbin(r, lpcOrder)
    print("*** result ***")
    print("a:", a)
    print("e:", e)

    # LPC係数の振幅スペクトルを求める
    nfft = 2048   # FFTのサンプル数

    fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:int(nfft/2)]

    # オリジナル信号の対数スペクトル
    spec = np.abs(np.fft.fft(s, nfft))
    logspec = 20 * np.log10(spec)
    plot(fscale, logspec[:int(nfft/2)])

    # LPC対数スペクトル
    w, h = scipy.signal.freqz(np.sqrt(e), a, nfft, "whole")
    lpcspec = np.abs(h)
    loglpcspec = 20 * np.log10(lpcspec)
    plot(fscale, loglpcspec[:int(nfft/2)], "r", linewidth=2)

    xlim((0, 10000))
    show()
① 音声をロード

    wav, fs = wavread("test.wav")
    t = np.arange(0.0, len(wav) / fs, 1/fs)
② 音声波形の中心部分を切り出す

    center = len(wav) / 2  # 中心のサンプル番号
    cuttime = 0.04         # 切り出す長さ [s]
    s = wav[int(center) - int(cuttime/2*fs) : int(center) + int(cuttime/2*fs)]
③プリエンファシスフィルタをかける

    p = 0.97         # プリエンファシス係数
    s = preEmphasis(s, p)
④ハミング窓をかける

    hammingWindow = np.hamming(len(s))
    s = s * hammingWindow
⑤LPC係数を求める

    lpcOrder = 32
    r = autocorr(s, lpcOrder + 1)
    a, e  = LevinsonDurbin(r, lpcOrder)
    print("*** result ***")
    print("a:", a)
    print("e:", e)
⑥LPC係数の振幅スペクトルを求める

    nfft = 2048   # FFTのサンプル数
    fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:int(nfft/2)]
⑦オリジナル信号の対数スペクトル

    spec = np.abs(np.fft.fft(s, nfft))
    logspec = 20 * np.log10(spec)
    plot(fscale, logspec[:int(nfft/2)])
⑧LPC対数スペクトル

    w, h = scipy.signal.freqz(np.sqrt(e), a, nfft, "whole")
    lpcspec = np.abs(h)
    loglpcspec = 20 * np.log10(lpcspec)
    plot(fscale, loglpcspec[:int(nfft/2)], "r", linewidth=2)

    xlim((0, 10000))
    show()

音声認識

工事中

SYSCLK

システム・クロック。システム全体の基本となるクロック。

HCLK

Julius

What's Julius?

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです. 数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持っています.

言語モデルとして単語N-gram,記述文法,ならびに単語辞書を用いることができます.また音響モデルとしてトライフォンのGMM-HMMおよびDNN-HMMを用いたリアルタイム認識を行うことができます.DNN-HMMの出力計算にnumpyを用いた外部モジュールを利用することも可能です.複数のモデルや複数の文法を並列で用いた同時認識も行うことができます.

Juliusの最大の特徴はその可搬性にあります.単語辞書や言語モデル・音響モデルなどの音声認識の各モジュールを組み替えることで,小語彙の音声対話システムからディクテーションまで様々な幅広い用途に応用できます.

Julius はオープンソースソフトウェアです.プログラムはC言語で書かれており、さまざまなプラットフォームへの移植や改造が容易です.ライセンスはオープンライセンスで,商用利用への制限もありません.

Juliusディクテーション実行キット

Julius を動かしてみるために必要なキットです. 日本語のディクテーション(自動口述筆記)に必要な最小限のモデル(不特定話者音響モデル + 汎用言語モデル)および Julius の実行バイナリが含まれていますので,これだけでとりあえず Julius を動かしてみることができます.

動作環境は Windows/Linux/MacOSX です.実行バイナリを入れ替えればその他のOSでも動作します.

ディクテーションキットの最新版は 4.4 です.

am-gmm.jonf
##
## ディクテーションキット GMM-HMM版音響モデル・入力設定
##

# 音響モデル: GMM-HMM
-h model/phone_m/jnas-tri-3k16-gid.binhmm

# 入力: マイク
-input mic

## EOF
main.jonf
#
# Julius 設定ファイル サンプル for rev.4.3
#
# 1) 重要: 相対パスは,*このファイルを起点に*指定してください.
# 2) 空行および # から行末まではコメントとみなします.
#    `#'をコマンドに含めたい場合は '\#' としてください.
# 3) 1行の長さは 512 バイト以内に収めてください.
# 4) 各オプションの書式は,コマンドラインで与える場合と同一です.
# 5) このファイル内の各値は Julius のデフォルト値です.
#

######################################################################
#### ファイル指定
######################################################################
##
## 単語2-gram,3-gramファイル
##
# ARPA標準形式
#-nlr /cdrom/lang_m/20k/MNP.111.20k.1.arpa.gz		# 2-gram
#-nrl /cdrom/lang_m/20k/MNP.111.20k.rev.1-1.10p.arpa.gz	# 逆向き 3-gram
# もしくは
# mkbingramで作成したバイナリ形式
-d model/lang_m/bccwj.60k.bingram

##
## 単語辞書ファイル
##
-v model/lang_m/bccwj.60k.htkdic

##
## 音響HMM定義ファイル
##
# asciiフォーマット,もしくは "mkbinhmmで" 作成したバイナリ形式
# (自動判別される)
#-h model/phone_m/jnas-tri-3k16-gid.binhmm

## triphoneモデルの場合,さらに
##     論理的に出現しうる triphone -> 定義されている triphone
## の対応を指定した「HMMListファイル」が必要です.
-hlist model/phone_m/logicalTri

######################################################################
#### 言語モデル詳細設定
######################################################################
##
## 言語重みと挿入ペナルティ
##
## 例えば, "-lmp 8.0 7.0" のとき,言語確率の対数尤度 'log p(w)' は
## (log p(w)) * 8.0 + 7.0' として適用されます.
##
##デフォルト値
##monophone向け
#-lmp 5.0 -1.0		# 第1パス(2-gram)
#-lmp2 6.0 0.0		# 第2パス(3-gram)
##triphone向け
#-lmp 8.0 -2.0
#-lmp2 8.0 -2.0
##triphone向け(v2.1設定):単語間triphoneを第1パスで扱わない場合
#-lmp 9.0 8.0
#-lmp2 11.0 -2.0
-lmp 8.0 -2.0
-lmp2 8.0 -2.0

##
## 透過単語の追加ペナルティ
##
#-transp 0.0

######################################################################
#### 単語辞書詳細設定
######################################################################
##
## 文頭単語の名前 (単語辞書では無音の読みを付与する)
## 
#-silhead ''

##
## 文末単語の名前 (同上)
##
#-siltail ''

##
## エラー単語を無視して続行する
##
#-forcedict

######################################################################
#### 音響モデル詳細設定
######################################################################
##
## Julius が triphone/monophone の自動判別に失敗する場合,
## 以下を試してみてください.
##
#-no_ccd		# 音素環境依存性を(強制的に)考慮しない
#-force_ccd		#	 〃	  (強制的に)考慮する

##
## 特徴パラメータの型チェックをスキップしたい場合は,
## 以下を試してみてください.
##
#-notypecheck
#

##
## PTM/triphone 使用時,第1パスの単語間triphoneの音響尤度計算方法を指定する.
##
#-iwcd1 best 3	# 同コンテキストtriphoneの上位N個の平均値 (default, N=3)
#-iwcd1 max	# 同コンテキストtriphoneの最大値
#-iwcd1 avg	# 同コンテキストtriphoneの平均値

######################################################################
#### Gaussian Pruning パラメータ
######################################################################
## コードブックあたり計算するガウス分布計算数(上位N個)
## 以下のデフォルト値は IPA99 の PTM モデル(1コードブックあたり64混合)
## に合わせた値
#-tmix 2

## Gaussian pruning 法の選択
## 高速版ではbeam,それ以外ではsafeがデフォルトです
#-gprune safe		# safe pruning 上位N個が確実に求まる.正確.
#-gprune heuristic	# heuristic pruning
#-gprune beam		# beam pruning 次元ごとに足切り.高速.
#-gprune none		# pruning を行わない

######################################################################
#### Gaussian Mixture Selection パラメータ
######################################################################
#-gshmm hmmdefs		# GMS 用モノフォン音響モデルを指定
			# 指定なし = GMS OFF
#-gsnum 24		# GMS使用時の選択状態数

######################################################################
#### 探索パラメータ
######################################################################
#-b 400			# 第1パスのビーム幅(ノード数) monophone
#-b 800			# 第1パスのビーム幅(ノード数) triphone,PTM
#-b 1000		# 第1パスのビーム幅(ノード数) triphone,PTM,engine=v2.1
#-b2 30			# 第2パスの仮説数ビームの幅(仮説数)
#-sb 80.0		# score beam envelope threshold
#-s 500			# 第2パスの最大スタック数 (仮説数)
#-m 2000		# 第2パスの仮説オーバフローのしきい値
#-lookuprange 5		# 第2パスで単語展開時のトレリス制約緩和幅(フレーム数)
#-n 1			# 第2パスで見つける文の数(文数)
#-n 10			#   ('standard' 設定時のデフォルト)

-b 1500
-b2 100
-s 500
-m 10000
-n 30
-output 1		# 第2パスで見つかった文のうち出力する数 (文数)

### "./configure --enable-lowmem" 時に有効
#-iwcache 10		# 単語間言語確率キャッシュの大きさ比率
			# (100でオプションなしと同等)

### "./configure --enable-lowmem2" 時に有効
#-sepnum 150		# 第1パスで単語木から独立させる高頻度語の数(単語数)

######################################################################
#### 単語グラフ出力 (--enable-graphout)
######################################################################
##
## 同じ単語をマージする
##  -1: マージしない(同じ場所の同じ単語でもスコアが異なれば別の候補)
##   0: 同じ位置の同じ単語をマージ
##  >0: 始端・終端の差が指定されたフレーム幅以下の同じ単語をマージ
## 
#-graphrange 0

##
## 指定以上の深さの単語をカットする (-1: 無効化)
##
#-graphcut 80

##
## 単語境界調整ループ回数の上限
##
#-graphboundloop 20

##
## "-graphsearchdelay" を指定すると,Julius は第2パスで
## グラフ単語のマージによる仮説中断を,最初の文候補が得られるまで
## 行わないようになる.
##
## このオプションは非常に大きいビーム幅を指定してグラフを生成している
## ときに,性能を少し改善する効果がある.
##
#-graphsearchdelay
#-nographsearchdelay  # this is default (off)

######################################################################
#### 単語間ショートポーズ
######################################################################
##
## ショートポーズ音響モデルの名前
##
#-spmodel "sp"		# ショートポーズ音響モデルの名前

##
## 単語間のポーズに対応する sp 単語を辞書に自動追加する
##
#-iwspword
#-iwspentry " [sp] sp sp"	# 追加される単語エントリのデフォルト値

##
## 単語末尾にコンテキスト独立なショートポーズを付加(multipath版のみ)
##
#-iwsp			# コンテキスト独立な単語間ショートポーズを付与
#-iwsppenalty 0.0	# ショートポーズへの遷移ペナルティ

######################################################################
#### ショートポーズセグメンテーション (--enable-sp-segment 時有効)
######################################################################
#-spdur 10		# 第1パス sp 継続フレーム数
			# sp単語が最尤のフレームがこの時間以上継続したら,
			# 第1パスを中断→第2パス実行

######################################################################
#### 音声入力ソース
######################################################################
## どれかを選んでください(デフォルト:mfcfile)
#-input mfcfile		# HTK形式のパラメータファイル(MFCC) 
#-input rawfile		# 音声波形データファイル(フォーマット自動判別)
			# 形式:WAV(16bit) または
			#	RAW(16bit(signed short),mono,big-endian) 
			#	16kHz以外のファイルは -smpFreq で周波数指定
#-input mic		# マイクから直接入力
			# デバイス名は環境変数 "AUDIODEV" でも指定可能 (OSS)
#-input netaudio -NA host:0    # host上のDatLink(NetAudio)から入力
#-input adinnet -adport portnum # adinnet クライアントからの入力
#-input stdin		# 標準入力からの入力

#-filelist filename	# 認識対象ファイルのリスト

#-nostrip		# ゼロ続きの無効な入力部の除去をOFFにする
			# (default: 無効な入力部分は除去される)
#-zmean			# DC成分の除去を行う (-input mfcfile時無効)
-zmeanframe		# フレーム単位のDC成分除去を行う (HTKと同処理)

######################################################################
#### 音声録音
######################################################################
#-record directory	# 認識した音声データを連続したファイルに自動保存

######################################################################
#### GMMに基づく入力音検証と棄却
######################################################################
#-gmm gmmdefs		# GMM定義ファイル(HTK形式)
#-gmmnum 10		# mixtureごとに計算する上位ガウス分布数
#-gmmreject "noise,laugh,cough" # 検証の結果誤入力として棄却すべきGMMのモデル名

######################################################################
#### 短時間瞬時入力の棄却
######################################################################
-rejectshort 800	# 指定ミリ秒以下の長さの入力を棄却する

######################################################################
#### 音声区間検出
######################################################################
#-pausesegment		# レベル・零交差による音声区間検出の強制ON
#-nopausesegment	# レベル・零交差による音声区間検出の強制OFF
			# (default: mic または adinnet は ON, file は OFF)
#-lv 2000		# レベルのしきい値 (0-32767)
#-headmargin 300	# 音声区間開始部のマージン(単位: msec)
#-tailmargin 400	# 音声区間終了部のマージン(単位: msec)
#-zc 60			# 1秒あたりの零交差数のしきい値

######################################################################
#### 音響分析
######################################################################

#-htkconf ConfigFile	# HTK Configファイルを読み込みパラメータをセットする

#-smpFreq 16000		# サンプリング周波数(Hz)
#-smpPeriod 625		# サンプリング周期(ns) (= 10000000 / smpFreq)
#-fsize 400		# 窓サイズ(サンプル数)
#-fshift 160		# フレームシフト幅(サンプル数)
#-preemph 0.97		# pre-emphasis coef.
#-fbank 24		# フィルタバンクチャンネル数
#-ceplif 22		# cepstral liftering coef.
#-rawe			# use raw energy する
#-norawe		# use raw energy しない(こちらがデフォルト)
#-enormal		# normalize log energy する
#-noenormal		# normalize log energy しない(こちらがデフォルト)
#-escale 1.0		# scaling log energy for enormal
#-silfloor 50.0		# energy silence floor in dB for enormal
#-delwin 2		# デルタウィンドウ幅 (フレーム数)
#-accwin 2		# デルタデルタウィンドウ幅 (フレー無数)
#-hifreq -1		# 高域カットオフの周波数(Hz) (-1: disable)
#-lofreq -1		# 低域カットオフの周波数(Hz) (-1: disable)

######################################################################
#### Cepstral Mean Normalization (CMN)
######################################################################
#-cmnsave filename	# CMNパラメータをファイルに保存(1入力毎に上書き)
#-cmnload filename	# 開始時に初期CMNパラメータをファイルから読み込む
#-cmnmapweight 100.0	# MAP-CMNの初期CMNの重み
#-cmnnoupdate		# 発話開始時の初期CMNを,過去の入力から更新せずに,
			# -cmnload で読み込んだ初期CMNを保持する

######################################################################
#### スペクトルサブトラクション (SS)
######################################################################
#-sscalc		# 先頭の無音部を利用して SS を行う(ファイル入力のみ)
#-sscalclen 300		# SSに用いる先頭の無音部の長さ (msec)
#-ssload filename       # ファイルからノイズスペクトルを読み込む
#-ssalpha 2.0		# アルファ係数
#-ssfloor 0.5		# フロアリング係数

######################################################################
#### Forced alignment
######################################################################
#-walign		# 認識結果の単語ごとのアラインメント結果を出力
#-palign		# 認識結果の音素ごとのアラインメント結果を出力
#-salign		# 認識結果のHMM状態ごとのアラインメント結果を出力

######################################################################
#### 単語信頼度計算
######################################################################
#-cmalpha 0.05		# スムージング係数を指定

######################################################################
#### 出力スタイル
######################################################################
#-separatescore		# 言語スコアと音響スコアを分けて出力する
#-progout		# 第1パスで解析途中から漸次的に結果を出力
#-proginterval 300	# -progout 時の出力のインターバル(単位:msec)
#-quiet			# 第1パス・第2パスの認識結果のみ出力
#-demo			# "-progout -quiet" と同じ
#-debug			# 探索中の内部状態を出力させる(デバッグ用)
#-charconv from to	# 出力文字コード変換を行う
			# from, to で指定できるコード名はマニュアルを参照のこと

######################################################################
#### サーバーモジュールモード
######################################################################
#-module		# サーバーモジュールモードで起動
#-module 5530		# (ポート番号を指定する場合)
#-outcode WLPSC		# モジュールに出力する情報を選択 (WLPSCwlps)

######################################################################
#### その他
######################################################################
#-help			# ヘルプを出力して終了(jconf内では無効)
#-setting		# コンパイル時エンジン設定を出力して終了(jconf内無効)
#-C jconffile		# 他の jconf ファイルを展開

################################################################# end of file

Julius記述文法音声認識実行キット

Julius で記述文法音声認識を動かしてみるためのキットです. 日本語の不特定話者音響モデル,およびサンプル文法が含まれています. これだけでとりあえずJuliusを動かしてみることができます.

主要動作環境は Windows/Linux です.実行バイナリを入れ替えればその他のOSでも動作します.

hmm_mono.jonf
# Copyright (c) 1991-2004 Kyoto University
# Copyright (c) 2000-2004 NAIST
# All rights reserved
#
# Julian 設定ファイル (モノフォン音響モデル使用)   2004/11/2 by ri
#
# このファイルで指定するのは文法以外の指定(音響ファイル・パラメータ等)のみ.
# 文法については,別の jconf あるいはコマンドラインで指定すること.
#
# 使用例1:文法ファイル(.dfa, .dict)をコマンドライン上で指定
#    % ./bin/julian -dfa SampleGrammar/railroad/railroad.dfa \
#      -v SampleGrammar/railroad/railroad.dict -C ../../hmm_mono.jconf
#
# 使用例2:文法ファイルを指定した jconf ファイルを指定
#    % ./bin/julian -C SampleGrammar/railroad.jconf -C hmm_mono.jconf
#
#
######################################################################
#
# 1) 重要: 相対パスは,*このファイルを起点に*指定してください.
# 2) 空行および # から行末まではコメントとみなします.
#    `#'をコマンドに含めたい場合は '\#' としてください.
# 3) 1行の長さは 512 バイト以内に収めてください.
# 4) 各オプションの書式は,コマンドラインで与える場合と同一です.
# 5) このファイル内の各値は Julius のデフォルト値です.
#

######################################################################
#### ファイル指定
######################################################################
##
## DFA ファイル:文法から生成
## これは別途指定のこと(ヘッダの例を参照)
##
#-dfa /cdrom/julius/julian-kit/sample_grammars/vfr.dfa

##
## 単語辞書ファイル
## これは別途指定のこと(ヘッダの例を参照)
##
#-v /cdrom/julius/julian-kit/sample_grammars/vfr.dict

##
## 音響HMM定義ファイル
##
# asciiフォーマット,もしくは "mkbinhmmで" 作成したバイナリ形式
# (自動判別される)
-h model/phone_m/hmmdefs_monof_mix16_gid.binhmm   # monophone

## triphoneモデルの場合,さらに
##     論理的に出現しうる triphone -> 定義されている triphone
## の対応を指定した「HMMListファイル」が必要です.
#-hlist model/phone_m/logicalTri

######################################################################
#### 言語モデル詳細設定
######################################################################
##
## 単語挿入ペナルティを指定
##
#-penalty1 0.0		# 第1パス
#-penalty2 0.0		# 第2パス

######################################################################
#### 単語辞書詳細設定
######################################################################
##
## エラー単語を無視して続行する
##
#-forcedict

######################################################################
#### 音響モデル詳細設定
######################################################################
##
## Julius が triphone/monophone の自動判別に失敗する場合,
## 以下を試してみてください.
##
#-no_ccd		# 音素環境依存性を(強制的に)考慮しない
#-force_ccd		#	 〃	  (強制的に)考慮する

##
## 特徴パラメータの型チェックをスキップしたい場合は,
## 以下を試してみてください.
##
#-notypecheck
#

##
## PTM/triphone 使用時,第1パスの単語間triphoneの音響尤度計算方法を指定する.
##
#-iwcd1 best N	# 同コンテキストtriphoneの上位N個の平均値
#-iwcd1 max	# 同コンテキストtriphoneの最大値
#-iwcd1 avg	# 同コンテキストtriphoneの平均値 (default)

######################################################################
#### Gaussian Pruning パラメータ(tied-mixture, PTMでのみ有効)
######################################################################
## コードブックあたり計算するガウス分布計算数(上位N個)
## 以下のデフォルト値は IPA99 の PTM モデル(1コードブックあたり64混合)
## に合わせた値
#-tmix 2

## Gaussian pruning 法の選択
## 高速版ではbeam,それ以外ではsafeがデフォルトです
#-gprune safe		# safe pruning 上位N個が確実に求まる.正確.
#-gprune heuristic	# heuristic pruning
#-gprune beam		# beam pruning 次元ごとに足切り.高速.
#-gprune none		# pruning を行わない

######################################################################
#### Gaussian Mixture Selection パラメータ
######################################################################
#-gshmm hmmdefs		# GMS 用モノフォン音響モデルを指定
			# 指定なし = GMS OFF
#-gsnum 24		# GMS使用時の選択状態数

######################################################################
#### 探索パラメータ
######################################################################
#-b 400			# 第1パスのビーム幅(ノード数) monophone
#-b 800			# 第1パスのビーム幅(ノード数) triphone,PTM
#-b 1000		# 第1パスのビーム幅(ノード数) triphone,PTM,engine=v2.1
#-b2 30			# 第2パスの仮説数ビームの幅(仮説数)
#-sb 80.0		# score beam envelope threshold
#-s 500			# 第2パスの最大スタック数 (仮説数)
#-m 2000		# 第2パスの仮説オーバフローのしきい値
#-lookuprange 5		# 第2パスで単語展開時のトレリス制約緩和幅(フレーム数)
#-n 1			# 第2パスで見つける文の数(文数)
#-n 10			#   ('standard' 設定時のデフォルト)
#-output 1		# 第2パスで見つかった文のうち出力する数 (文数)
#-looktrellis		# 単語仮説を完全にトレリス内の単語だけに絞る

######################################################################
#### 単語間ショートポーズ
######################################################################
##
## (マルチパス版のみ)
##
#-iwsp			# コンテキスト独立な単語間ショートポーズを付与
#-iwsppenalty 0.0	# ショートポーズへの遷移ペナルティ
#-spmodel "sp"		# ショートポーズ音響モデルの名前

######################################################################
#### 音声入力ソース
######################################################################
## どれかを選んでください(デフォルト:mfcfile)
#-input mfcfile		# HTK形式のパラメータファイル(MFCC) 
#-input rawfile		# 音声波形データファイル(フォーマット自動判別)
			# 形式:WAV(16bit) または
			#	RAW(16bit(signed short),mono,big-endian) 
			#	16kHz以外のファイルは -smpFreq で周波数指定
#-input mic		# マイクから直接入力
#-input netaudio -NA host:0    # host上のDatLink(NetAudio)から入力
#-input adinnet -adport portnum # adinnet クライアントからの入力
#-input stdin		# 標準入力からの入力

#-filelist filename	# 認識対象ファイルのリスト

#-nostrip		# ゼロ続きの無効な入力部の除去をOFFにする
			# (default: 無効な入力部分は除去される)
#-zmean			# DC成分の除去を行う (-input mfcfile時無効)

######################################################################
#### 音声録音
######################################################################
#-record directory	# 認識した音声データを連続したファイルに自動保存

######################################################################
#### 入力の棄却
######################################################################
#-rejectshort 800	# 指定ミリ秒以下の長さの入力を棄却する

######################################################################
#### 音声区間検出
######################################################################
#-pausesegment		# レベル・零交差による音声区間検出の強制ON
#-nopausesegment	# レベル・零交差による音声区間検出の強制OFF
			# (default: mic または adinnet は ON, file は OFF)
#-lv 2000		# レベルのしきい値 (0-32767)
#-headmargin 300	# 音声区間開始部のマージン(単位: msec)
#-tailmargin 400	# 音声区間終了部のマージン(単位: msec)
#-zc 60			# 1秒あたりの零交差数のしきい値

######################################################################
#### 音響分析
######################################################################
#-smpFreq 16000		# サンプリング周波数(Hz)
#-smpPeriod 625		# サンプリング周期(ns) (= 10000000 / smpFreq)
#-fsize 400		# 窓サイズ(サンプル数)
#-fshift 160		# フレームシフト幅(サンプル数)
#-delwin 2		# デルタウィンドウ幅 (フレーム数)
#-hifreq -1		# 高域カットオフの周波数(Hz) (-1: disable)
#-lofreq -1		# 低域カットオフの周波数(Hz) (-1: disable)
#-cmnsave filename	# CMNパラメータをファイルに保存(1入力毎に上書き)
#-cmnload filename	# 初期CMNパラメータを起動時ファイルから読み込む

######################################################################
#### スペクトルサブトラクション (SS)
######################################################################
#-sscalc		# 先頭の無音部を利用して SS を行う(ファイル入力のみ)
#-sscalclen 300		# SSに用いる先頭の無音部の長さ (msec)
#-ssload filename       # ファイルからノイズスペクトルを読み込む
#-ssalpha 2.0		# アルファ係数
#-ssfloor 0.5		# フロアリング係数

######################################################################
#### Forced alignment
######################################################################
#-walign		# 認識結果の単語ごとのアラインメント結果を出力
#-palign		# 認識結果の音素ごとのアラインメント結果を出力
#-salign		# 認識結果のHMM状態ごとのアラインメント結果を出力

######################################################################
#### 単語信頼度計算
######################################################################
#-cmalpha 0.05		# スムージング係数を指定

######################################################################
#### 出力スタイル
######################################################################
#-separatescore		# 言語スコアと音響スコアを分けて出力する
#-progout		# 第1パスで解析途中から漸次的に結果を出力
#-proginterval 300	# -progout 時の出力のインターバル(単位:msec)
#-quiet			# 第1パス・第2パスの認識結果のみ出力
#-demo			# "-progout -quiet" と同じ
#-debug			# 探索中の内部状態を出力させる(デバッグ用)

######################################################################
#### サーバーモジュールモード
######################################################################
#-module		# サーバーモジュールモードで起動
#-module 5530		# (ポート番号を指定する場合)
#-outcode WLPSC		# モジュールに出力する情報を選択 (WLPSCwlps)

######################################################################
#### その他
######################################################################
#-help			# ヘルプを出力して終了(jconf内では無効)
#-setting		# コンパイル時エンジン設定を出力して終了(jconf内無効)
#-C jconffile		# 他の jconf ファイルを展開

################################################################# end of file
railroad.xml
<?xml version="1.0" encoding="UTF-8"?>
<GRAMMAR>
<RULE name="S" toplevel="ACTIVE">
  <L>
    <P>
      <RULEREF name="EKI"/>
    </P>
    <P>
      <RULEREF name="EKI"/>
      <RULEREF name="MADE"/>
    </P>
    <P>
      <RULEREF name="EKI"/>
      <RULEREF name="KARA"/>
      <RULEREF name="EKI"/>
      <RULEREF name="MADE"/>
    </P>
    <P>
      <RULEREF name="FILL_B"/>
      <RULEREF name="EKI"/>
    </P>
    <P>
      <RULEREF name="FILL_B"/>
      <RULEREF name="EKI"/>
      <RULEREF name="MADE"/>
    </P>
    <P>
      <RULEREF name="FILL_B"/>
      <RULEREF name="EKI"/>
      <RULEREF name="KARA"/>
      <RULEREF name="EKI"/>
      <RULEREF name="MADE"/>
    </P>
  </L>
</RULE>
<RULE name="MADE" toplevel="INACTIVE">
  <L>
    <P>まで</P>
  </L>
</RULE>
<RULE name="KARA" toplevel="INACTIVE">
  <L>
    <P>から</P>
  </L>
</RULE>
<RULE name="EKI" toplevel="INACTIVE">
  <L>
    <P>/かみのやま温泉/かみのやまおんせん;</P>
    <P>/くりこま高原/くりこまこーげん;</P>
    <P>/さくらんぼ東根/さくらんぼひがしね;</P>
    <P>/がーら湯沢/がーらゆざわ;</P>
    <P>/安中榛名/あんなかはるな;</P>
    <P>/一の関/いちのせき;</P>
    <P>/宇都宮/うつのみや;</P>
    <P>/浦佐/うらさ;</P>
    <P>/越後湯沢/えちごゆざわ;</P>
    <P>/燕三条/つばめさんじょー;</P>
    <P>/岡山/おかやま;</P>
    <P>/角館/かくのだて;</P>
    <P>/掛川/かけがわ;</P>
    <P>/岐阜羽島/ぎふはしま;</P>
    <P>/京都/きょーと;</P>
    <P>/熊谷/くまがい;</P>
    <P>/郡山/こーりやま;</P>
    <P>/軽井沢/かるいざわ;</P>
    <P>/古川/ふるかわ;</P>
    <P>/厚狭/あさ;</P>
    <P>/広島/ひろしま;</P>
    <P>/高崎/たかさき;</P>
    <P>/高畠/たかはた;</P>
    <P>/佐久平/さくだいら;</P>
    <P>/三河安城/みかわあんじょー;</P>
    <P>/三原/みはら;</P>
    <P>/三島/みしま;</P>
    <P>/山形/やまがた;</P>
    <P>/雫石/しずくいし;</P>
    <P>/秋田/あきた;</P>
    <P>/小郡/おごーり;</P>
    <P>/小山/おやま;</P>
    <P>/小倉/こくら;</P>
    <P>/小田原/おだわら;</P>
    <P>/上田/うえだ;</P>
    <P>/上毛高原/じょーもーこーげん;</P>
    <P>/上野/うえの;</P>
    <P>/新横浜/しんよこはま;</P>
    <P>/新下関/しんしものせき;</P>
    <P>/新花巻/しんはなまき;</P>
    <P>/新潟/にーがた;</P>
    <P>/新岩国/しんいわくに;</P>
    <P>/新庄/しんじょー;</P>
    <P>/新神戸/しんこーべ;</P>
    <P>/新倉敷/しんくらしき;</P>
    <P>/新大阪/しんおーさか;</P>
    <P>/新白河/しんしらかわ;</P>
    <P>/新尾道/しんおのみち;</P>
    <P>/新富士/しんふじ;</P>
    <P>/水沢江刺/みずざわえさし;</P>
    <P>/盛岡/もりおか;</P>
    <P>/西明石/にしあかし;</P>
    <P>/静岡/しずおか;</P>
    <P>/赤湯/あかゆ;</P>
    <P>/仙台/せんだい;</P>
    <P>/相生/あいおい;</P>
    <P>/村山/むらやま;</P>
    <P>/大宮/おーみや;</P>
    <P>/大曲/おーまがり;</P>
    <P>/大石田/おーいしだ;</P>
    <P>/長岡/ながおか;</P>
    <P>/長野/ながの;</P>
    <P>/天童/てんどー;</P>
    <P>/田沢湖/たざわこ;</P>
    <P>/東京/とーきょー;</P>
    <P>/東広島/ひがしひろしま;</P>
    <P>/徳山/とくやま;</P>
    <P>/那須塩原/なすしおばら;</P>
    <P>/熱海/あたみ;</P>
    <P>/博多/はかた;</P>
    <P>/白石蔵王/しろいしざおー;</P>
    <P>/姫路/ひめじ;</P>
    <P>/浜松/はままつ;</P>
    <P>/福山/ふくやま;</P>
    <P>/福島/ふくしま;</P>
    <P>/米原/まいばら;</P>
    <P>/米沢/よねざわ;</P>
    <P>/豊橋/とよはし;</P>
    <P>/北上/きたかみ;</P>
    <P>/名古屋/なごや;</P>
    <P>/品川/しながわ;</P>
  </L>
</RULE>
<RULE name="FILL_B" toplevel="INACTIVE">
  <L>
    <P>えー</P>
    <P>えーと</P>
    <P>/えーと/えーっと;</P>
    <P>あのー</P>
  </L>
</RULE>
</GRAMMAR>

Julius 音素セグメンテーションキット

Julius を使って音声データを音素単位にラベル付けするキットです. 書き下し (Transcription) ファイルと音声ファイルを与えることで,書き下しの内容に従ってセグメンテーションを行います.

主要動作環境は Windows/Linux です.実行バイナリを入れ替えればその他のOSでも動作します.



紅葉3