福山雅治の声をさだまさしにする


こんばんは。

私事ですが、今年は激動の年でして、そのなかでも一番の変化は7月の結婚でした。
実は私はさだまさしさんのことがまぁまぁ好きで、結婚式でも、親父の一番長い日やパンプキンパイとシナモンティーなど、さだまさしさんの曲を流して、いろいろな方に「なんで?」と言われたりしています。

そんな1年もほとんどおわり、今日はクリスマスイブ。
さだまさしxIT Advent Calendar 2015 24日目の今日は、さだまさしさんの声にチャレンジしたいと思います。

さださんの声に声質変換...を目指します。

## 結果

こんな感じです。

Before
[![魂リク 【 関白宣言 】 福山雅治](http://img.youtube.com/vi/Hhm6d9lVkec/0.jpg)](https://www.youtube.com/watch?v=Hhm6d9lVkec)

After
[![関白宣言](http://img.youtube.com/vi/bKFb5t7PtuY/0.jpg)]
(https://youtu.be/bKFb5t7PtuY)
(近日中に削除します)

## 福山雅治を選んだわけ

今回の(もともとの)ゴールは統計的な手法を使って声質を変換することです。
統計的声質変換の一般的な手順は以下の通りです

1. データの準備
   - 変換したいデータと、変換元の人と変換先の人が同じフレーズを喋っているデータを入手する
     (今回の場合、福山雅治さんとさだまさしさんのデータを使います)
2. 特徴量の抽出
   - 音声データからメルケプストラムやピッチといった特徴量を抽出します。 
3. データ間の同期をとる
   - たとえ同じフレーズを喋っているとしても、人によって喋り方の癖があるので、全く同時に同じ言葉を発するようなデータではありません。そこで、音声データから抽出した特徴量を元に同期を取ります。
     この同期を取ったデータのことをパラレルデータと呼びます。
4. 変換モデルの構築
   - 変換元の人の声にこういう特徴量がある時、変換先の人の声はこういう特徴がある、というルールを学習します。よく使われるのは GMM のようです。
5. 変換モデルの適用
   - 変換したいデータの特徴量に、上で構築したモデルを適用し、特徴量を変換します。
6. 音声合成
   - 変換された特徴量をもとに、音声を合成します。

今回は、変換先はさだまさしさん一択です。
なので、変換もとの人がさだまさしさんと同じフレーズを喋っているデータを入手しなければいけません。Youtubeをつらつらと見ていたところ、福山雅治さんが名曲「関白宣言」を歌っている動画がありましたので、こちらをパラレルデータとしたいと思います。

## 特徴量の抽出、その前に

さて、データが揃いましたので、特徴量の抽出に移ります。
今回は、[SPTK](http://sp-tk.sourceforge.net/) という音声解析用のツールキットを使います。音声合成には、SPTKの他には [WORLD](http://ml.cs.yamanashi.ac.jp/world/) というライブラリもよく利用されるようです。

### SPTK

SPTK のインストールは configure & make です。

```bash
$ ./configure
$ make && make install
```

SPTK をインストールすると、ピッチ (音程)を抽出するコマンド pitch やメルケプストラムを抽出するコマンド mcep など、音声解析でよく使う機能が複数のコマンドとして提供されます。

## 特徴量の抽出、その前に その2

普段さだまさしさんを聞いている人が今回の福山さんの歌声をきくと、幾分低音であることが気になります。
本格的な声質変換をする前に、ピッチを上げてみましょう。データはダウンロード済みで wavファイル(fukuyama.wav, シングルチャンネル, 16kH)に変換されているものとします。

```bash
$ mkdir output # 出力用ディレクトリを準備
$ wav2raw fukuyama.wav # ツールキットで扱える raw 形式に変換
$ raw2wav -s 19.2 -d output fukuyama.raw # ひとまず 16kH を 1.2倍の 19.2kH にしてみる
```

生成されたファイルを afplay などで再生してみましょう。

```bash
$ afplay output/fukuyama.wav
```

さだまさしさんぽくなってしまった。。。

実は冒頭で上げた変換例は再生速度を単に1.2倍にしただけでした。
統計的にいろいろやってやろうと張り切っていたのに。

## 話が飛んで

今回の実験で

```
さだまさし = 1.2 福山
```

であることがわかりました。では逆に

```
福山 = さだまさし / 1.2
```

は成り立つでしょうか?

```bash
$ wav2raw sada.wav
$ raw2wav sada.raw -s 13.3 -d output # 16.0/1.2 = 13.33...
```

としてみると、、、マツコデラックスっぽいふくよかな声になりました。

## 話を戻して統計的いろいろやってみたが

思いもかけず目標は達成されてしまったのですが、統計的声質変換を諦めたわけではありません。
しかし、そこには大きな壁がありました。それは、「伴奏」です。
統計的声質変換をするには、声同士の対応をつけたいのですが、今回の音源には伴奏が入り込んでおり、
単純に合成しようとすると、後ろでチャラチャラうるさくなっているような音になってしまいました。
そこで、方針を切り替え、機械学習で伴奏の除去に取り組んだので、簡単に紹介して終わろうと思います。

### 伴奏の除去とボーカルの除去

今回やりたいのは、伴奏を除去し、福山さんやさださんの声を抽出することです。
Google先生に「ボーカル 抽出」で聞いてみると、いろいろな情報が出てくるのですが、ほとんどは 「ボーカルのみを除去」する技術です。全てを調べたわけではありませんが、基本的には、

- 左右の音源を引き算すれば、両方から同じ音量で聞こえているボーカルの声は聞こえなくなる。

という手法を用いているようです。はじめ「ボーカルのみが除去されたデータが手に入るのであれば、元の音源から単純に引き算したらボーカルだけ抽出できるのでは?」と考えたのですが、そうはうまく行きませんでした。
おそらく、上記の方法でボーカル音を除去した場合、伴奏の左右対称成分も当然除去されており、元の音源から引き算すると、ボーカルだけでなく、伴奏の左右対称成分も復活してしまうためだろうと思います。

そこで、以下の方法でボーカルを抽出してみました。

- 上記の引き算の方法でボーカル音を除去 (伴奏の抽出)
- ボーカルを含む音源と含まない音源それぞれからスペクトログラムを抽出
- ボーカルを含む音源のスペクトログラムをNMFにかけ、特徴120個程度に分割
- 上記のNMFを用いて、ボーカルを含む/含まないそれぞれの音源でアクティベーションを計算
- ボーカルを含む音源の方が強く反応している特徴のみを使ってスペクトログラムと音声を再構成

いろいろ問題はあるのですが、ひとまず伴奏はある程度除去することはできました。(詳細は後日...)
さて、これを使って声質変換に取り組もう、といったところで24日になってしまいました。
時間切れですね。悔しいです。

## まとめ


さだまさしさん = 1.2*福山雅治さん
マツコデラックスさん = さだまさしさん/1.2

統計的な声質変換の方は、悔しいのでもうすこしチャレンジします。