深層学習 学習まとめ: 音声処理

# 音声処理

## 音声認識
- 音声とは空気の振動というアナログ信号であり、これをパルス符号変調(PCM: Pulse Code Modulation)という方法でデジタルデータに変換する
    - PCMの3ステップ
        1. 標本化(サンプリング): 連続的な信号を一定時間ごとに観測する離散時間信号に変換する
        1. 量子化: 観測された波の強さを予め決められた値に近似する(当分した振幅にサンプルの振幅を合わせる)
        1. 符号化: 量子化された値をビット列で表現する
        - サンプリング周波数： 1秒間で処理することができるサンプルの個数
        - サンプリングの法則(標本化定理)
            - アナログ信号をデジタル信号に正確に変換するには、元の信号の最大周波数の2倍のサンプリング周波数が必要
                - 周波数h[kHz]の離散時間信号を測るには，最低2h[kHz] のサンプリング周波数が必要
                - 16kHzのサンプリング周波数で8kHzの標本化ができる
- フーリエ変換(Fourier Transform)
    - あらゆる波形(周期的でも非周期的でも)は正弦波(sine wave)・余弦波(cosine wave)の組み合わせとして表現できる
        - 振幅h, 角周波数wの正弦波: $ h\sin w $
        - 振幅h, 角周波数wの余弦波: $ h\cos w $
        - 振幅が大きいと大きい音、周波数が低い(波長が大きい)と低い音
    - フーリエ変換とは、ある波形$ f(t) $から振幅・角周波数を表す関数$ F(w) $に変換する作業
        - フーリエ変換によって、横軸に含まれる波の角周波数、縦軸に各波の振幅で描かれるスペクトルを得ることができる
            - 周期的な波形は離散スペクトルに、非周期的な波形は連続スペクトルになる(現実は基本的に非周期的な波)
- 音声データを分析する際には、波形を特定の時間区間(窓)で区切る必要がある
    - この際に、非周期的がゆえに窓の繋ぎ目が非連続的になるのが問題
    - これを解消するために、ハミング窓などの窓関数をかける
- 離散フーリエ変換(DFT, Discrete Fourier Transform)
    - フーリエ変換に類似したものであり、信号処理などで離散化されたデジタル信号を三角関数の和に分解する変換
        - デジタル信号の周波数解析などによく使われる
- 高速フーリエ変換(FFT, Fast Fourier Transform）は、離散フーリエ変換を計算機上で高速に計算するアルゴリズム
    - 窓のサンプルのうち，偶数番目と奇数番目を別々に測定
    - 窓に含まれるサンプルN個(Nは2の冪乗： 8, 16, 32, …, 1024, 2048, …)のうちN/2個のサンプルを測定することによって高速化が実現する
- その他の技術
    - メル尺度: 人間の聴覚に基づいた尺度
        - 周波数の低い音の違いに対して敏感(分解能が高い)で、周波数の高い音に対して鈍感(分解能が低い)であるという性質がある
    - 逆フーリエ変換
        - 振幅・周波数から元の波形を構築する作業
    - ケプストラム(メル周波数ケプストラム係数、MFCC)
        - フーリエ変換したものの絶対値の対数を逆フーリエ変換して得られるもの
            - 音声認識の特徴量として利用される

## CTC(Connectionist Temporal Classification)
- 音声認識モデルの一つ
- 音声認識モデルは三つの要素が直列につながっている
    - 入力は音声特徴量、出力は認識結果
    1. 音響モデル: 音声特徴量と音素列の間の確率を計算するモデル
    1. 発音辞書: 音素列と単語との対応を扱うモデル
    1. 言語モデル: ある単語に対して、その単語が発話される確率を計算する
    - 音響モデルについては、2010年頃までは隠れマルコフモデルと混合正規分布と呼ばれるモデルの組み合わせが一般的だった
    - 深層学習技術の発展に伴い、混合正規分布がDNNに置き換えられるようになった
    - しかし、三つの要素で構成するのは実装が難しい
    - 2015年頃からは、音響モデル、発音辞書、言語モデルを1つのDNNで表現する、いわゆるEnd-to-Endモデル(E2Eモデル)の研究が進んできた
        - CTCもその一種
- CTCにおける重要な発明
    - ブランク(blank)と呼ばれるラベルの導入
        - 同一ラベルが連続するテキスト系列を表現する
        - 厳密にアライメントを決定させない
    - 前向き・後向きアルゴリズム(forward-backward algorithm)を用いたDNNの学習
        - DNNとしては、RNNやLSTMのような時系列を考慮したDNNを用いる
- CTCでの処理
    - RNNに音声系列を入力すると、フレーム数だけ出力値(確率)が最も高いラベル(音素)を出力する
    - フレーム単位のラベル系列を以下の手順で最終的なテキスト系列に変換(縮約)する
        - 連続して出現している同一ラベルを一つのラベルにまとめる
        - ブランク「-」を削除する
        - 例: [a,-,-,b,b,-,c,c]→[a,-,b,-,c]→[a,b,c]
    - 入力音声系列$\boldsymbol{x}$に対して縮約後の出力テキスト系列が$\boldsymbol{l}=[a,b,c]$となる事後確率$P(\boldsymbol{l} \vert \boldsymbol{x})$を求め、正解テキスト系列$\boldsymbol{l}^*　$における確率$P(\boldsymbol{l}^* \vert \boldsymbol{x})$が最大となるように学習を行う
    - この際に、全てのパスを計算するのは非効率的であるため、より効率的な計算方法である前向き・後ろ向きアルゴリズム(forward-backward algorithm)を用いる
- 学習されたネットワークを用いてCTCでどのように音声認識(デコーディング)が行われるか
    - 推論時には、学習時とはことなり正解ラベル系列$\boldsymbol{l}^*$は与えられていないため、仮説ごとに尤度を計算して比較を行うことになるが、これは計算量が多い
    - このため、best path decoding では、各フレームで最も出力値(確率)が高い頂点を通るパス(best path)のみに注目し、このbest pathを縮約して得られるテキスト系列を認識結果として出力する
    - より改善されたbeam search decodingという方法も存在する

## WaveNet
- 音声の生成モデル
    - 時系列データに対してコーザル畳み込み(Causal convolution)とダイレイト畳み込み(Dilated convolution)を組み合わせたダイレイト・コーザル畳み込み(Dilated causal convolution)を適用するCNNモデル
    - Causal convolution
        - 入力層から層ごとに、隣の情報と畳み込む
            - モデルがデータの時間順序を破らないことを保証できる
            - 再帰結合を持たないため、RNNよりも計算が高速
    - Dilated convolution
        - 層が深くなるにつれて、畳み込むリンクを離す(飛び飛びに畳み込む)
            - 受容野を簡単に増やすことができる