次のページ     目次     ホームページ
ENGLISH



<音声の波形の生成を理解する>


その1: 声門波形と2管声道モデルによる音声波形の生成 と 数値計算ソフトのSCILABプログラム


人間の声の発生の過程を単純化した模型をつかって、音声の波形の生成を理解してみよう。
声の発生は、まず、のどの下にある声門で声帯が振動することで、下図の左側の青色のような形の波形が発生する。そして、声帯から喉そして口の中から唇まで の間を下図の真中のように2つの管(チューブ)がつなぎ合わさった物で置き換えてみる。先ほどの青色の波形がこの2つの管に入力されるとある特定の音の組 み合わせで共鳴しよく響く。そして、口から出てくる空気の流れ、つまり音声を、音圧を検出するマイクで音を拾うと、下図の右側の赤色のような波形になる。


実際の声門の波形はもっと複雑だし、声帯から喉そして口の中から唇までは途中曲がっていて歯も舌も鼻もあるのに、たった2つの管(チューブ)のつなぎ合わ せで置き換えるのはちょっと 飛躍しすぎている感があるが、こんな簡単化した模型でも、何となく「あ」とか「え」とか聞こえるのである。「あ」 の音(発音記号の/a/)と、「え」の音(発音記号の/ae/)と、「う(い)」の音(発音記号の/ui/)の.wavサンプルをリンクしておこう。この2つの管(チューブ)のつな ぎ合わせた模型で生成できるのは、「あ」と「え」と「う」の3つの音に限られる。 (「お」の生成のページ  「い」の生成のページ


この模型では、主に、2つの管(チューブ)の長さと断面積を変化させて、「あ」とか「え」などの音の調整を行う。管(チューブ)と言っても想像がつかない かもしれないが、例えば、水道管、ガス管、または車やバイクについているマフラーも長い管である。下の右側の図は、長さがL1 cmで断面積がA1 cm2の 管に、長さがL2 cmで断面積がA2 cm2の管をつなぎ合わせたイメージ図を示している。このつなぎ合わせた第1の管の左側 (声門側に相当)から、声門からの空気の流れが入ると、2つの管でその長さ分の流れの遅延が生じる、また、断面積の違う2つの管のつなぎ目で音が反射す る、その結果、いろいろな音の共鳴が起きる。そして、第2の管の右側(口または唇に相当)から出て行く。
入力となる声門の波形は、声門が閉鎖しているとき、声門が開くとき(つまり肺からの空気が出てくるとき)、また、声門が閉じるとき(肺からの空気の流れが 止めようとするとき)、の3つの時間を可変できる。この3つの時間を足し合わせたもの(1区間)が、音の高さを決める、いわゆるピッチ周期に相当する。 ピッチ周期が短いと高い音に聞こえ、ピッチ周期が長いと低い音(低音)に聞こえる。そして、声門の閉鎖そして開いて閉じるを繰り返して、下図の左側の青色 のように山の形が幾つか続く波形となる。





「あ」の音(発音記号の/a/)と「え」の音(発音記号の/ae/)と「い」の音(発音記号の/i/)を生成するための2管(チューブ)の例として は、下記の形状のような寸法がある。(後述する理由で「い」の音は「う」に近い音になっている。) これが唯一の寸法と言うわけではなく、多の 中のひとつの例である。


そして、下図が、この単純化した模型で生成した波形の例である。青色が声門の波形を、赤色が音声に相当する音圧の波形をしめしている。





ちょっと専門的な内容になるが、それぞれの、2管声道モデルの周波数と位相の特性(ボード線図)を参考にのせておこう。周波数にピークがある特定の音の組み合わせが共鳴する可能性がある。但し、共鳴するためには、その周波数の成分が入力されることが条件である。共鳴する可能性があっても、入力にその成分が欠けていると、無いのと同じである。一番下の「い」の音(発音記号の/i/)は、「う」の音に更に およそ2KHz以上とかの高い周波数の帯域の成分があ ることが特徴であるが、残念ながらこの単純化した模型では、2KHz以上の高い周波数の帯域が欠けているので、「う」に近い音に聞こえてしまうのである。声門の波形の変化をより急進に鋭くして、入力である声門の波形の2KHz以上の高い周波数の帯域の成分をおおく含むようにしてはいるのであるが、まだ、不十分な状態だ。ここでは2KHzと書いたが、実際には、発声する人によって周波数とその帯域の値はちがってくる。
また、「お」を生成するためいは、2つの管(チューブ)では足りない。3つの管(チューブ)による「お」の生成のこころみを別のページにのせておこう。また、ノイズもつかって生成する「い」についてはこちらのページを見てほしい。






参考までに、管による声道モデルを計算するpythonプログラムをおいておきます。 これは、以前scilabで作成したものを見直し、Pythonで作り直したものです。 使い方は解凍した中にあるREADME.txtを見てください。
また、5管模型まで計算できるプログラムをgithubに上げておきます。

以下は、フランス発の数値演算ライブラリ SCILAB を使った、この擬似的に人の音声のような波形を生成するSCILABのサンプルプログラムの説明です。

このSCILABのサンプルの中で設定可能なパラメーターの内容

区間の数を記入する。これで作る波形の長さを設定する。
D_QTY=7;            // set dimension of list. This defines length of generated wave
                    // Generated wave's length will be around D_QTY * (N1+N2+N3).

L1が第1管の長さで、A1が断面積、L2が第2管の長さで、A2が断面積。それぞれの区間の値を記入する。
// sample length & area for /a/ from problems 3.8 in Digital Processing of Speech Signals by L.R.Rabiner and R.W.Schafer
L1=[9, 9, 9, 9, 9, 9, 9];     // set list of 1st tube's length by unit is [cm]
A1=[1, 1, 1, 1, 1, 1, 1];      // set list of 1st tube's area by unit is [cm^2]
L2=[8, 8, 8, 8, 8, 8, 8];     // set list of 2nd tube's length by unit is [cm]
A2=[7, 7, 7, 7, 7, 7, 7];      // set list of 2nd tube's area by unit is [cm^2]

声門の波形の各区間の、声門閉鎖時間、声門開く時間、声門閉じる時間を記入する。
tclosed=[5, 5, 5, 5, 5, 5, 5] ;      // set glottis closed duration (off time) by unit is millisecond [ms]
trise=  [6, 6, 6, 6, 6, 6, 6];     // set glottis opening duration (rise time) by unit is millisecond [ms]
tfall=  [2, 2, 2, 2, 2, 2, 2]; // set glottis closing duration (fall time) by unit is millisecond [ms]

声門の波形の各区間の振幅の大きさを記入する。
amplitude=[1, 1, 1, 1, 1, 1, 1];   // set value of multiplier

声門と第1管との反射係数。声門開く、声門閉じる、声門閉鎖のそれぞれを、各区間記入する。
// reflection coefficient between glottis and 1st tube
rg_rise=0.9;    //  set some value (1. or less) when glottis is opening
rg_fall=0.95;   //  set some value (1. or less) when glottis is closing
rg_closed=1;   // When glottis is closed,
               // reflection coefficient between glottis and 1st tube is 1
              //  because glottis's gate is closed and vocal tract is free from glottis's influence

音圧変換に使っている、IIR型のハイパスフィルターのカットオフ周波数を設定する。
声門開閉時に生じる音圧の波形のバウンドの状態を調整できる。
fc=1000;   // set cut off frequency of High Pass Filter by unit is [Hz]

第2管と外側(口に相当)での反射係数。 音圧の波形の振動の減衰度合いを調整することができる。
// reflection coefficient between 2nd tube and mouth
rl=0.9;   // set adjust reduction response. rl is variable, however use one constant in this.

サンプリング周波数を設定する。音速35000cm/secで1cm進む時間は、サンプリング周波数44.1KHzのときに1.26サンプルである。
管の長さの計算上の分解能をあげるにはサンプリング周波数をもっと高くすることが必要である。
fs=44100;   // set sampling frequency by unit is [Hz]



その他、補助的につかえる関数は、
other functions

声門の波形のボード線図(周波数と位相)を描く関数。
yg_bode(1)    // plot yg (Glottal Volume Velocity) frequency-phase response


2管モデルのボード線図(周波数と位相)を描く関数。
two_tubes_model_bode(1)  // plot Two Tubes Model's frequency-phase response

音圧変換に使用しているハイパスフィルターのボード線図(周波数と位相)を描く関数。
hpf_bode()     // plot high pass filter's frequency-phase response


声門の波形を .wav ファイルとして保存する関数。
save_as_sound_file_yg( 'yg.wav' )  // save yg (Glottal Volume Velocity) as one .wav file

音圧の波形を .wav ファイルとして保存する関数。
save_as_sound_file( 'y3out.wav' )  // save y3out (Sound Pressure) as one .wav file

2管モデルの管の長さと断面積を描く関数。
plot_area(1)  // plot sqrt(area) vs length




「あ」(発音記号/a/)の2管(チューブ)の模型における位置


 2管(チューブ)の模型を使って生成できる波形はいろいろあるが、その中で、2管声道モデルで作成した「あ」(発音記号の/a/)が、どの位置にあるかを見て みよう。 このページの前の方でふれた「あ」(発音記号の/a/)の例は下図に示される長さと断面積をもつ2つの管(チューブ)を組み合わせたものであっ た。



2管(チューブ)の模型で生成される波形の世界を考えるため、上図の様に定義される r1 と l1 の2つのパラメーターを考えてみよう。r1は、2つ の管(チューブ)の断面積の関係をあらわすもので、ラッパに例えると、r1の値が1に近いほど先端が大きく開いていることを意味する。逆に、r1が-1に 近いほど、先が閉じている。また、l1は、2つの管の長さの関係を示すもので、l1が0であると、2つの管の長さは同じとなる。
この「あ」(発音記号の/a/)の一例では、r1が 0.75で先が開きぎみで、  l1が -0.059でほぼ管の長さは同じとなっている。 先が閉じているより、拡声器のように、先が開いている方が、つまり、r1が1に近い方が、音量が大きくな ることが予想されるであろう。また、管の長さが同じとき、つまり、l1がだいたい0のときは、2管(チューブ)の中の共鳴で生じた大きな2つの波の、振動 数がいちばん近づくのである。これを見るため、声門の体積速度を音源として2管声道モデルをとうして音圧変換したあとの波形の周波数応答を理論的に計算し てみた。ここでは、下図のように、それぞれの周波数特性をかけあわせることによって、音圧の波形の周波数特性を求めている。(但し、計算精度はおおざっぱ である。)特に、大きな2つの波である、周波数f1と周波数f2の関係を見てみよう。



ちょっと分かりにくいが、下図の中で、r1とl1をパラメーターとし、各々-1から1までの範囲の世界の中で、赤い丸が、この「あ」(発音記号の/a/) の一例の位置を示している。rate は、大きな2つの波の振動数(周波数)の関係を示している。rate が0の時に、2つの波はもっとも近くなり一致する。この「あ」(発音記号の/a/)の一例では、2つの振動数(周波数)がもっとも近づくあたり にあることが分かる。また、次の制約条件下で、それは、2つのピーク大きさの平均値dBが最大になる付近にある。


ここでは、2管の全長を17cm、断面積の和を10cm2、一定として、計算している。また、r1は -0.9から0.9まで0.1ステップで、  l1は -0.8から0.8まで 0.1 ステップで計算している。 参考に、上図を作成するのに使ったSCILABのプログラムをのせておこう。計算には不完全 な部分もある。ファイル名を 2tubemodelmax.sci に変更して使用する。


さて、音声波形の生成模型(モデル)の、音声の認識への利用の可能性を考えてみよう。
下の図は、ヒトが話した「あ」の波形の一部分の周波数特性と、音声波形の生成模型(モデル)による周波数特性との比較である。ヒトが話した「あ」に、特徴 が似るように(下図の紫色の丸で囲ったところ)、生成模型(モデル)のパラメータを調整してみた。下の図を見るとわかるとうり、生成模型(モデル)でつ くった特徴が、実際の音声にも含まれていることがわかる。周波数特性の4KHz以上では、生成模型(モデル)のピークとヒトのピークでは違いがある。ヒト の口の中の肌は柔らかいので、高い音はそんなに響かないが、生成模型(モデル)は高い周波数の音でも十分に鳴る理想的な管を使っているのでこの違いもひと つの理由と思われる。

調整は、

生成模型(モデル)のパラメーターの調整値の例

管の全長(L1+L2)   18.5cm
l1=0
r1=0.8

音圧変換用のハイパスフィルターのカットオフfc 1000Hz
声門波形の trise=6ms と tfall=0.7ms


「あ」なので、l1は理想値である0を初期値とする。
管の全長(L1+L2)を変化させることで、ピーク周波数の絶対値を調整する。
1に近い方がよいr1(またはl1)を調整することで、二つの山のピークの周波数の差(ratio)を調整する。
音圧変換用のハイパスフィルターと、声門波形のパラメーターは、周波数特性のエンベロープのカーブの傾斜にも関係するもので、ここでは、合わせこんでいない。

ヒトの音声波形と、音声波形の生成模型(モデル)を比較することにより、パラメーターの種類として、

(1)個人で差があるパラメーター  管の全長(L1+L2)。管の全長は物理的な解釈では声門から口(唇)までの長さに相当するが、この解釈は正確では ない。
(2)音韻に関連するパラメーター  l1、r1
(3)音の伝送系に関連するパラメーター  fc
(4)その他   trise, tfall

などが推定できるかもしれない。







もう一つの例として、「え」を見てみよう。
下の図は、ヒトが話した「え」の波形の一部分の周波数特性と、2管による音声波形の生成模型(モデル)による周波数特性との比較である。上図の「あ」とち がって「え」は、周波数が低い方の山は一つであるが、高い周波数で山々が、”近 接するように”、立っているのがミソのようだ。このようになるr1とl1の解は、2管による模型では、下図の左右に示すように2種類ある。 物理的に解釈すると、下図の左側は、舌を口の奥でまげていることに相当し、右側は、舌を手前でまげていることに相当する。「あ」の舌のまげ位置が、丁度真 ん中に相当するので、「あ」に対して後方と前方の2種類となる。



どこが「え」に聞こえるの?と疑問に思われるかもしれないが、参考に、2管模型で作った2つの波形(後方の解.wav と 前方の解.wav) をリンクしておこう。


また、「う」は「あ」とか「え」の様な 近接するピークをもつ特徴を作るのではなく、下図の様に、 単に音を伝える伝送管(単管模型)を基礎としてその管が 実際の現場に応じて多少変形したものと解釈できるかもしれない。



そもそも、1倍(基本波)と2倍と3倍の高調波の波形をそれぞれ適当な比でミックス(MIX)すると、「う」の様に聞こえるようになる。

管の断面積と長さの比を一定に保ったまま、全長をLength1からLenght2に変化させると、(ホルマント相当する)ピーク周波数は Lenght1/Length2  倍に変化する。よって、ピーク周波数の比は保存される。
下図は、3管モデルで、全長を0.8倍に変化させたときの、ピーク周波数がどのように変化するのかを示した例である。


ご参考までに、上図の計算に使ったpythonプログラムもおいておきます。



(保存庫)
管の個数と同じ数のピーク周波数の組から管模型の長さと面積を推定するプログラムをgithubに上げておきます。実際の音声波形は、2管3管模型では簡単すぎて上手くフィッティングできないので、5管以上が望ましいのではないかと考えています。但し、4管から5管になると管模型を推定するのが一段と難しくなります。



www.scilab.org www.dtn.jp validator.w3.org
数値演算ライブラリ
SCILAB
ディレクトリ型
検索エンジン

W3CによるHTMLの
Web文法チェッカー




No.45   2019年4月4日
No.46   2022年6月6日
No.47   2022年6月21日
No.48   2022年6月30日
since 2007.11