歴史的な音声合成ソフト「XKL」で遊ぶ(4) ~仕組み編~

XKLで遊ぶ記事の第4弾。

前々回・前回で XKL の基本操作を追っていきました。これでいろいろな音声が生成できそうです。


もっと音声合成で遊ぶために、各パラメータの意味を把握しておきたいところです。そのまえに、Klatt Synthesizerの歴史と構造についてざっと調べてみました。



おおまかな歴史

1. 初期の Klatt Synthesizer (1980年)

Dennis Klatt氏が最初に Klatt Synthesizer を発表したのは、1980年の "Software for a cascade/parallel formant synthesizer" という論文のようです。

https://www.fon.hum.uva.nl/david/ma_ssp/doc/Klatt-1980-JAS000971.pdf

この1980年版の Klatt Synthesizer は以下のような構成です。

[Klatt, 1980] より引用

これが最もベーシックな Klatt Synthesizer です(細かい部分は以降で見ていきます)。その後のバージョンで細かな変更や拡張が行われるものの、大まかにはこの時点ですでに完成されています。


この1980年の論文のなかで、「HANDSY.FOR」というFORTRAN のプログラムが掲載されています。このプログラムは当時のコンピュータである DEC PDP-11 向けに書かれたものでした。以下のリポジトリでは、gcc の GNU Fortran でコンパイルできるように整備されています。

https://github.com/jh4xsy/klatt80


すこし脱線しますが、初期のKlatt Synthesizerをベースに作られたのが DECtalk です。

車椅子の理論物理学者であるスティーヴン・ホーキング博士の機械音声は DECtalk で合成されたものです。

また、テクノミュージックの巨匠である Kraftwerk が「Music Non Stop」で使った合成音声も DECtalk だそう。

ちなみに DECtalk は、現在はオープンソースで公開されています。各プラットフォーム向けのバイナリも配布されているので手軽に試せます。

https://github.com/dectalk/dectalk


2. KLSYN (1983~1988年頃)

初期の Klatt Synthesizer は FORTRAN で書かれていましたが、その後Klatt氏の手によって、C言語版が実装されます。これが KLSYN と呼ばれるプログラムです。

この頃のソースコードが rsprouse/klsyn というGitHubリポジトリにあります。

https://github.com/rsprouse/klsyn/tree/master/c

しかし1988年、長年のガンとの闘病の末、Dennis Klatt氏は亡くなってしまいます。


3. KLSYN88 (1988年)

Klatt氏が亡くなったのち、1990年に発表された論文(おそらく遺稿?)である "Analysis, synthesis, and perception of voice quality variations among female and male talkers" のなかで述べられているのが、KLSYN88 です。

https://www.fon.hum.uva.nl/david/ma_ssp/doc/Klatt-1990-JAS000820.pdf

[Klatt and Klatt, 1990] より引用

パラメータ数も全部で60個まで増え、様々な音声研究の知見を取り入れて拡張されています。


4. KLSYN93 (1993年)

この記事で使っている XKL は「KLSYN93 Version 2.1」です。これは上述の KLSYN88 のソースコードを引き継いで、MITの研究室にてわずかに拡張されたバージョンのようです。

KLSYN93 は、ほとんど KLSYN88 と同じですが、新たに3つのパラメータが追加されています(つまりパラメータは全63個)。



合成部の構造とパラメータ

KLSYN93 の出自がわかったところで、合成の仕組みとパラメータを見ていきます。

論文に書かれているブロック図を、XKLのソースコードを見つつアップデートしてみました。
赤太字が時変パラメータ、青太字が固定値パラメータです。

大きく「声帯音源」「声道フィルタ」「摩擦音」の3つの部分に分かれます。これらを順に説明していきます。


1. 声帯音源

いわゆる喉ぼとけの場所にある「声帯」での空気振動をつくります。

  • SS (source switch)
    • 0 : インパルス列。シンプルですが品質は良くありません。
    • 1: KLGLOTT88モデル。とりあえずはこれにしておくとよいです。
    • 2: 修正LFモデル。音声研究でよく使われる音源で、自由度が高いです。
  • F0 (fundamental frequency) : 基本周波数、声の高さをコントロールします。
  • AV (amplitude of voice) : 声の音量です。
  • TL (spectral tilt) : 声の丸さ (高域減衰) です。大きいほど丸くなります。
  • OQ (open quotient) : 声帯の張り具合です。大きいほど張らなくなります。
  • SQ (speed quotient) : 振動パターンの非対称さ。地声と裏声の特徴が再現できます。
  • FL (flutter) : 声のふるえです。大きくすると音程が不安定にゆらぎます。
  • DI (diplophonia) : 1オクターブ下の音を混ぜます。発声の最後で声帯振動が不安定になっている状態が再現できます。

また、声帯から漏れ出る空気の音 (aspiration noise) も再現可能です。AHの値を上げるといわゆるハスキーボイスになります。

  • AH (amplitude of aspiration) : 漏れ出る空気の音量です。


2. 声道フィルタ

気管・咽頭腔・口腔・鼻腔などの空洞による音の共鳴を再現します。

合成方式として「直列フィルタ」と「並列フィルタ」の2パターンが用意されていますが、基本的に「直列フィルタ」を使います。

  • NF (number of cascaded formants) : フォルマントの個数です。
  • CP (cascade / parallel) : 直列フィルタと並列フィルタを切り替えます。
  • F1 ~ F6 : 第1~6フォルマントの周波数 (Hz) です。
  • B1 ~ B6 : 第1~6フォルマントのバンド幅 (Hz) です。小さくすると急峻になります。
  • DF1, DB1 : 声門の開閉によって第1フォルマントがズレる現象を再現します。実験的な機能なので通常はゼロでも問題ありません。
  • FNP (frequency of nasal pole) : 鼻腔によってできるピークの周波数です。
  • BNP (bandwidth of nasal pole) : 鼻腔によってできるピークのバンド幅です。
  • FNZ (frequency of nasal zero) : 鼻腔によってできる谷の周波数です。
  • BNZ (bandwidth of nasal zero) : 鼻腔によってできる谷のバンド幅です。
  • FTP (frequency of tracheal pole) : 気管によってできるピークの周波数です。
  • BTP (bandwidth of tracheal pole) : 気管によってできるピークのバンド幅です。
  • FTZ (frequency of tracheal zero) : 気管によってできる谷の周波数です。
  • BTZ (bandwidth of tracheal zero) : 気管によってできる谷のバンド幅です。
  • FSF (formant spacing filter on/off) : フォルマント周波数の偏り具合に応じてスペクトルの補正をおこなうフィルタだと思われますが、詳細は不明です。デフォルトで有効なので、KLSYN88と同じにするには無効化する必要があります。KLSYN93で追加された機能です。


3. 摩擦音

「さしすせそ」「はひふへほ」などに含まれる、息から作られる子音(摩擦音)を合成する部分です。

摩擦音も声道を通るためフォルマントがあります。一方、母音と比べるとスペクトルがゆるやかな傾向があります。そのためフォルマントのバンド幅が独立して決められるようになっています(B2F~B6F)。また、摩擦音は高めの周波数帯であることが多いため、周波数が低い第1フォルマントの共振器は省略されています。

  • B2F ~ B6F : 摩擦音における第2~6フォルマントのバンド幅です。
  • A2F ~ A6F : 摩擦音における第2~6フォルマントの振幅です。
  • AB : バイパスしたノイズの振幅です。
  • AI : 摩擦音の先頭に加えるパルスの振幅です。KLSYN93で追加された機能です。


4. 全体設定

合成全体を制御するためのパラメータもあります。
  • DU (duration) : 合成する音声の長さ (ミリ秒) です。
  • UI (update interval) : 時変パラメータを変更する間隔 (ミリ秒) です。
  • SR (sampling rate) : 音声のサンプリング周波数 (Hz) です。通常は10000に設定します。
  • OS (output select) : 合成途中の信号が取り出せます。通常は0に設定します。
  • RS (random seed) : 乱数生成器のシード値を設定します。
  • SB (same burst) : ノイズ音量がゼロになるたびに乱数リセットする機能です。



この記事ではKlatt Synthesizerの歴史、そしてXKLの合成部である KLSYN93 の概要を述べました。

いったんこのあたりで区切りとしますが、私の余力があればより実践的な音声合成の記事も書いてみようと思っています。

(5) ~実践編~ へ続く?

コメント

このブログの人気の投稿

基本波形の生成

(1)C言語で音声合成もどき ~WAVファイルを生成する~

(2)C言語で音声合成もどき ~母音の生成~