C3:音声信号処理

C3:音声信号処理
1
概略・目的
本実験では,録音した音声信号に対し,パソコンを使った簡単な加工を行うことにより,
デジタル信号処理の基礎を修得する.なお,処理を施すためのプログラムは C 言語を使用
する.
2
信号処理
信号処理の概略を以下の図に示す.
図 1: 信号処理の概略
I. 音声をマイクを使って電気信号に変換する. II. 連続的に変化する電気信号をデジタル信号(離散的なデータの系列)に変換する.(サ
ンプリング,量子化といった操作を行う.2.1,2.2 節参照.)
III. 得られたデジタル信号を加工し,新たなデジタル信号を作る.
1
IV. デジタル信号を連続的に変化する電気信号に変換する.
V. 電気信号をスピーカを通して音声に変換する.
以上から,デジタル信号処理の本質的な部分は,III. の部分が担っていることがわかる.
III. の周辺をもう少し詳しくみてみよう.上の図からわかるように,II. の操作で得られた
デジタル信号は,単なる数字の並び,すなわち,データの系列である.III. の部分では,得ら
れたデータ系列をもとに,新たなデータ系列を作成している.データ系列 u[0], u[1], u[2], · · ·
から新しいデータ系列 y[0], y[1], y[2], · · · をどう作るか,これがデジタル信号処理のキーポイ
ントとなる.
2.1
サンプリングとは
コンピュータは,連続的に変化する信号をそのまま扱うことができない.そこで,そのよ
うな信号を扱う際には,一定の間隔で信号の値をサンプルし,離散的なデータとして扱うこ
とが必要となる.この操作をサンプリングと呼ぶ.
図 2: サンプリング
上の図において,T はサンプリング周期,1/T はサンプリング周波数と呼ばれている.つま
り,サンプリング周波数とは,1 秒間にサンプルする回数を表す(単位は [Hz]).ちなみに,
音楽 CD のサンプリング周波数は 44.1 [kHz],すなわち,1 秒間に 44100 回サンプルされた信
号を使用している.この実験で使う音声処理のサンプルプログラムは,それより少ない 8000
[Hz] の信号を扱うように書かれているので注意されたい.
2.2
量子化とは
コンピュータは,ある時刻にサンプルした値をメモリに蓄えるとき,その値を有限個の 0
と 1 からなるデータとして記録する.この操作を量子化という.コンピュータは,ひとつの
値を蓄えるのに有限個の 0 と 1 しか使用できないため,もともとの値を正確に表現すること
はできない.したがって,何らかの近似を行ってデータを蓄えることになる.データの値を
表現するのに使える 0 と 1 の個数を量子化ビット数というが,この数が多いほど,より正確
にデータを表現できる.例えば,量子化ビット数が 2 ビットの場合,値を 00,01,10,11 の
4 段階でしか表現できないが,16 ビットの場合,2 の 16 乗=65536 段階で表すことができる.
2
ちなみに,音楽 CD は 16 ビットの量子化を採用している.実験で使う音声処理のサンプ
ルプログラムは 8 ビット (256 段階) で量子化された信号を扱うように書かれているので注意
されたい. [ 課題 ]
1. ノートパソコンにマイクをつなぎ,Cool Edit で実際にマイクを通した自分の声
を録音してみよう.録音方法については付録を参照すること.次に,onsei フォル
ダ中に入っている rev.c というプログラムを Cygwin 上で
gcc -o rev rev.c
のようにコンパイルして
./rev
で実行してみよう.入力ファイル,出力ファイル名をそれぞれ入力し,出力され
たファイルを Cool Edit で開いて,どのような処理が加えられたか確認せよ. さ
らにこのような処理をどうやって実現したか,ソースコードを見て調べ,以降の
プログラミングにおいて参考にすること.
2. 入力のデータ系列を u[n],出力のデータ系列を y[n] とする.このとき,
y[n] = u[2n]
(1)
を施す操作をダウンサンプリングと呼ぶ.これを実装したプログラムを作成せよ.
また,適当な音声に対し,ダウンサンプリングを施した信号の音声がどのように
聞こえるか調べよ.
レポート:
• 結果
3. 入力 u[n] に対し,出力 y[n] を以下の式に基づいて生成することをアップサンプリ
ングと呼ぶ.
y[2n] = u[n], y[2n + 1] = 0
これを実装したプログラムを作成し,1. と同様に動作を確認せよ.
レポート:
• 結果
4. 3. で作成したプログラムを音声に対して使用すると,高周波域で雑音が生じる.
この原因について考察し,その雑音を低減するようプログラムを修正せよ.
レポート:
3
• 原因に関する考察
• 処理方法の説明
• 結果
5. カラオケなどで使われるエコーの原理について考察し,この効果をかけるための
プログラムを作成せよ.
レポート:
• 原理に関する考察
• 処理方法の説明
• 結果
3
AR モデルによる音声の分析・合成
信号の過去の p 個の値 x[n − 1], · · · , x[n − p] をもとに,現在の値 x[n] を予測することを考
える.このための最も簡単な方法の一つとして,現在の信号の予測値 x̂[n] を,過去の信号の
線形結合によって計算する方法が考えられる.この手法は線形予測と呼ばれており,信号の
予測値 x̂[n] は次の式によって求められる.
x̂[n] = −a1 x[n − 1] − a2 x[n − 2] − · · · − ap x[n − p].
(2)
ただし,a1 , · · · , ap は,予測器の係数である.以下では,式 (2) による予測値 x̂[n] と実測値
x[n] の誤差の 2 乗の期待値が最小となるような a1 , · · · , ap を求める手法について述べる.
h
i
信号 x[n] は弱定常過程,すなわち,x[n] の期待値 E x[n] は時刻 n によらず一定であり,
h
i
自己相関関数 E x[n]x[n − k] は時刻 n によらず信号の時間差 k のみに依存するものと仮定
する.予測誤差 e[n] は,
e[n] = x[n] − x̂[n] = x[n] + a1 x[n − 1] + a2 x[n − 2] + · · · + ap x[n − p]
= x[n] + aT x̄n = x[n] + x̄Tn a
と書ける.ただし,
h
x̄n = x[n − 1] x[n − 2] · · ·
(3)
iT
x[n − p] ,
h
a = a1 a2 · · ·
ap
iT
である.このとき,信号 e[n] の 2 乗の期待値 E[e[n]2 ] は,
h
i
h
i
h
i
E[e[n]2 ] = E[x[n]2 ] + E x[n]x̄Tn a + aT E x̄n x[n] + aT E x̄n x̄Tn a
h
i
2
= E[x[n] ] + E[x[n]x[n − 1]] · · · E[x[n]x[n − p]] a




E[x[n − 1]x[n − 1]] · · · E[x[n − 1]x[n − p]]
E[x[n − 1]x[n]]



..
..
..
T 
...
+ aT 
a
+a 
.
.
.
E[x[n − p]x[n]]
E[x[n − p]x[n − 1]] · · ·
4
E[x[n − p]x[n − p]]
(4)
(5)
h
i
となる.ここで,x[n] が弱定常過程であるという仮定から,自己相関関数 E x[n − i]x[n − j]
を r|i−j| とおき,さらに

h
i h
q = E x̄[n]x̄Tn = r1 r2 · · ·
rp
iT
,
h
i 

R = E x̄n x̄Tn = 

r0
r1
..
.
r1
r0
..
.
rp−1 rp−2

· · · rp−1
· · · rp−2 

.. 
..
.
. 
· · · r0
とおくと,式 (5) は次のように書ける.
E[e2 [n]] = r0 + q T a + aT q + aT Ra = J(a).
(6)
ここで,行列論の知識を思い出しておこう.任意のベクトル a に対し,aT Aa ≥ 0 となる
行列 A を半正定行列という.また,0 でない任意のベクトル a に対し,aT Aa > 0 となる行
列 A を正定行列という.A を正定対称行列とすると,A の固有値は全て 0 より大きい実数と
なる.このとき,A は 0 固有値を持たないため正則行列となる.
さて,式 (6) において R が正定対称行列である場合,任意のベクトル a に対して (aT +
q T R−1 )R(a + R−1 q) ≥ 0 となる.したがって,J(a) は (aT + q T R−1 )R(a + R−1 q) = 0 を満た
す a において最小値をとる.この等式が満たされるのは a + R−1 q = 0,すなわち,予測器の
係数が a = −R−1 q を満たすときであり,このとき最も誤差の小さい予測が実現される.
a = −R−1 q を用いて予測器の係数を求めるためには,相関関数 rk を求める必要がある.こ
こで x[n] はエルゴード過程,すなわち,時間平均が標本によらず一定で集合平均と等しい確
率過程であると仮定し,rk を時間平均を用いて以下のように求める.
N −1
1 X
x[n]x[n − k].
r̂k =
N n=0
(7)
ただし,x[n] = 0 (n < 0, n ≥ N ) とする.
最後に,行列 R がほとんど全ての場合に正定対称行列となることを確認しておこう.まず,
対称行列となることは明らかである.正定性に関しては,R が次のように表現できることに
着目する.


x[0] x[1] · · · x[N − 2] x[N − 1]
0
···
1


... ...
...
...
...
R = QQT , Q = 
(8)
.
N
···
0 x[0]
x[1]
···
x[N − 2] x[N − 1]
ただし,Q は p 行 (p + N − 1) 列の行列である.式 (8) より,R が正定行列となるために
は,Q を構成する行ベクトルが 1 次独立であることが必要十分であることがわかる.この
条件は x[n] (n = 0, · · · , N − 1) のうち少なくとも一つが 0 でないことと等価であるため,
x[0] = x[1] = · · · = x[N − 1] = 0 で無い限り R は常に正定行列となる.
以上のように実現される線形予測を音声信号に適用することで,フォルマント(音声スペ
クトルのピーク)に代表される音声の特徴パラメータを抽出することができる.また,次式
5
で表される線形予測に基づいた AR モデルにおいて,抽出した特徴パラメータを利用するこ
とで,音声を合成することができる.
x̂[n] = −a1 x[n − 1] − a2 x[n − 2] − · · · − ap x[n − p] + ²n .
(9)
ここで,²n は,出力 x[n] における過去の出力の線形結合で表現しきれない要素を表してお
り,予測誤差と呼ばれる.これは,実際にはシステムの出力が過去 m 個の (m > p) の出力
の線形結合であるのに対し,これをモデル化するときに過去 p 個の線形結合としたために生
じる誤差である.別の見方をすると,出力 x[n] は,過去 p 個の出力と時刻 n における入力 ²n
の線形結合として得られると考えられる.なお,AR モデルにおいては ai を AR 係数,p を
AR 次数といい,²n の分散が σ²2 であるとき,x[n] のパワースペクトル Sx (Ω) は
Sx (Ω) =
|1 + a1 e−jΩT
σ²2
.
+ · · · + ap e−jpΩT |2
(10)
で与えられる.
[ 第 2 週目課題 ]
1. 3 章を踏まえ,母音の分析・合成を行う.以下に実験の手順を示す.
(a) 「あ,い,う,え,お」を録音し保存する.
(b) 音声の分析 (bunseki.c)
bunseki.c に,相関関数,AR 係数を求める部分を追加し,録音した各母音に
対し相関関数,及び AR 係数を求める.ただし,bunseki.c は,分析開始点,
入力音声ファイル名,AR 係数出力ファイル名,スペクトル出力ファイル名を
入力としている.求めた AR 係数は,指定された AR 係数出力ファイルに保
存すること.
(c) 各母音に対して (b) で推定されたスペクトルを表示し,formant.jpg に示され
た各母音の一般的なフォルマント(スペクトルのピーク.周波数の低い順に
第一フォルマント,第二フォルマント.
.
.と呼ばれる)特徴と比較する.ただ
し,各母音のスペクトルは bunseki.c において推定され,入力時に指定された
ファイルに保存される.
0Hz から 4000Hz まで,500Hz のグリッド表示で a spec.txt に保存された波形
のスペクトルを表示する場合のコマンド:
./showspec 0 4000 500 a spec.txt
(d) 音声の合成 (gousei.c)
gousei.c に,(b) で求めた AR 係数に基づき音声を合成する部分を追加し,実
際に各母音を合成する.予測誤差は,一般に有声音では周期的で,1 周期ご
とにパルス状の信号となる.よってここでは各母音の周期に合わせたパルス
信号を入力 ²n とする.ただし,gousei.c は,パルス信号を入れる間隔 (各母
音の波形の 1 周期分のサンプル数.録音した信号から人手で確認すること),
6
大きさ (およそ 20∼40 とする),AR 係数を保存したファイル名,合成された
音声データを保存するファイル名を入力としている.合成した音声データは,
入力時に指定されたファイルに保存すること.
(e) Cool Edit で合成された音声を聞く.パラメータを変更してみてもよい.
レポート:
• 結果
• 考察
2. sin8k.c を使って,2000 [Hz] の離散正弦波と 7000 [Hz] の離散正弦波を生成し,そ
れらを Cool Edit を使って聞くと 7000 [Hz] の音の方が低く聞こえる.この理由
について考察せよ.また,この結果を一般化し,周波数 f [Hz] の正弦波をサンプ
リング周波数 fs [Hz] でサンプルした信号はどのような周波数の音に聞こえるか
考察せよ.
レポート:
• 理由に関する考察
• 一般化した際の考察
各課題について,
“ レポート:”として書いてあるものに加え,付録としてプログラムリスト
を載せてレポートとして提出すること.
締め切り: 1 週間後の木曜日 17:00 まで
提出先: E3-511 新田まで
学籍番号,氏名などを忘れずに書くこと.
7
付録: アプリケーションの基本操作
本実験では以下のアプリケーションを使用する.
アプリケーション
Cygwin
Cool Edit 96
目的
Windows 上で動作する UNIX
(C を使うため)
声の録音・再生
注:以下の説明で掲載するPCの画面は,本実験で使用するPCとはディレクトリやファイ
ルの構成が異なるので注意されたい.
[ Cool Edit 96 の基本操作(音声の録音,保存) ]
1. ノートパソコンにマイクをつないだことを確認し,Cool Edit 96 を起動する.
Record をクリックすると,Sample Rate(サンプリング周波数),Channels (ステ
レオかモノラルか),Resolusion(解像度.量子化ビット数は 8-bit か 16-bit か) を
聞かれるので,サンプルプログラムを使用する場合は,それぞれ,8000,Mono,
8-bit を選択する.
図 3: 音声の録音
2. 上の図で OK をクリックすると,録音が始まり,Stop をクリックすると録音が
終了する.
3. 録音した音声を保存するには,File –> Save as をクリックする.保存する場所
は,処理用のCのプログラムが置いてあるフォルダを指定する.ファイルの種類
は,ASCII Text Data を選び,txt 形式で保存すること.
8
図 4: 音声データの保存
[ Cygwin の使い方 ]
以下では,サンプルプログラムの使用法をとおして,Cygwin の基本的な使い方を説明
する.
• UNIX のコマンドについて
まず,よく使う UNIX のコマンドについて簡単に説明する.
ls 今いるディレクトリ (フォルダ) の中に,どんなファイルやディレクトリがあ
るかを調べるときに使う.
cd 今いるディレクトリから別のディレクトリに移るときに使用する.例えば,今
いるディレクトリの中に onsei というディレクトリがあるとき,cd onsei と
すれば onsei ディレクトリの下に移ることができる.ひとつ上のディレクト
リに移りたいときは, cd .. とする.
cp ファイルのコピーをするときに使用する.例えば,cp hehehe.txt hohoho.txt
とすると,hehehe.txt が,hohoho.txt にコピーされる.
rm ファイルを消去するのに使用する.例えば,rm hohoho.txt とすると,hohoho.txt が消去される.
他にも様々なコマンドがある.mv,less,mkdir,rmdir なども知っていると大変
便利である.これらがどんなコマンドか知りたいときには,man mv などとする.
ただし,説明は英語で書かれている.
• 実行形式のファイルを作るには
1. onsei ディレクトリで ls すればわかるように,最初は Makefile と,***.c ,***.h
というファイルしか存在しない.プログラムを動かすためには,***.exe とい
うような実行形式のファイルを作る必要がある.
9
2. 一つの実行ファイルを作成する場合は,”gcc -o 実行ファイル ソースファイル”
を実行すればよいが,音声処理実験では, 実行形式のファイルを作るため
に,make を実行する.これを実行すると,Makefile に書かれた手順に従って,
コンパイルとリンクが行われ,実行形式のファイルが作成される.(***.exe
以外にも,***.o も作成される.) 以下に例を示す.
図 5: 実行形式ファイルの作成
3. プログラムを変更した場合は,その結果を実行形式ファイルに反映させるた
めに再度 make する必要がある.また,自分で新しい C のプログラムを書い
たときには,どのように実行形式のファイルを作るかを,Makefile に書く必
要がある.書き方については Makefile の中身を参考にすること.
• プログラムを実行するには rev.exe を実行したいときには,./rev.exe(または単
に./rev) とする.入力ファイルと出力ファイルが必要な場合はそれらを入力する.
10