人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

global navigation menu page top

音声合成・分析・変換システム「WORLD」のインストールと声質変換してみた!【MacOS編】

f:id:hiro-htm877:20190819160014p:plain





f:id:hiro-htm877:20190525105012p:plain

 

研究で音声合成を始めたいと考えている人「何でもいいから音声合成の始め方を知りたい。」

 

f:id:hiro-htm877:20190525105027p:plain

 

趣味で音声合成を始めたいと考えている人「好きな声優・キャラの声で名前を呼ばれたい。音声合成を用いたシステムを作りたい。けど、始め方すら分からない、とりあえず音声合成を動かしてみたい」

 

こういった疑問に答えます

 

本記事のテーマ 

【完全初心者向け】

音声分析変換合成システム「WORLD」のインストールと声質変換

 

必要なもの

MacOSのパソコン

 

WORLDとは

WORLDは,Vocoderのアイディアを発展させた音声分析変換合成システムです. 発達した計算機能力を駆使し,高品質で柔軟な音声分析・変換・合成の実時間処理を目的としています. UTAUの合成エンジン,また音声創作ソフトウェアCeVIOの音声分析の一部にもWORLDが使われています.[1]から引用

 

 

 

インストール方法

WORLDはC++で作成されていますが、Pythonで使用できるようにしたライブラリも用意してくれているので今回はこちらをインストールします。

 

C++のGit

github.com

 

PythonのGit

github.com

 

まずはPython-WORLDをダウンロードしてください。

 

その後は環境をセットアップします。

githubに書かれている通りに以下のコマンドを実行します。

pip install -r requirements.txt

 

 しかし、エラーが大量に出てきました。

詳しいことは分かりませんでしたが、MacOSをMojaveにアップデートするとClang?というものが使えなくなるらしいです。どうやらそのへんが原因でインストールできないようです。

 

pip installのエラー対処

そこで、いろんな方法を試すためにとりあえず、condaで仮想環境を用意し、pipじゃなくcondaでインストールしてみました。なぜかこちらではうまくインストール出来たので同様のエラーが出た場合は試してみてください。

 

anacondaで仮想環境の構築 

conda info -e

これで自分が作成したanacondaの仮想環境を調べれます

conda create -n world

-n以降の名前で仮想環境を構築できます

source activate world

使用するときはsource activateまたは、conda activateを使用します

conda list

現在使用している環境内にインストールしたライブラリを確認できます

ここに必要なライブラリをインストールしいきます。

必要なものはreqirement.txt内に書かれています。

 

 

次に必要なライブラリのインストールをしていきます

pipで入れようとしたら案の定エラーをはきました

なのでcondaでインストールしたら、なんかわからんけど出来ました

ただし、他のライブラリもついでにインストールされますのでご了承ください!

pip install numpy==1.14.2

 

conda install numpy=1.14.2

conda list

conda scipy==1.1.0

 

conda list

conda install numba==0.37.0

conda install cython==0.27.3

conda install simpleaudio==1.0.2

pip install simpleaudio==1.0.2

simpleaudioはpipじゃないとインストール出来ませんでした。Anacondaの中に用意されていないものはcondaでインストール出来ないようです

 

 

WORLDで声質変換

実行方法

普通にpython ~.pyでも実行できるのですが、最近見た-mを使った方法で実行してみました。するとmatplotlibがインストールされていないと言われるのでインストールしましょう!

python -m example.prosody

pip install matplotlib

 

声質変換

今回は男性の声を女性の声に変換します。

以下のサイトを参考に行いました。

元となる声は以下のサイトのoriginal.wavをダウンロードし、女性声に変換性ました。

このサイトを見てみると、どうやら女性声に変換するには

 

1. 1オクターブ高い声に変換するためにF0(基本周波数)を2倍にする

2. スペクトル包絡を2倍にする

 

これを、Python-WORLDでも実行していきます。

 

datというクラスに音声の情報が格納されています。

 

1. dat = vocoder.scale_pitch(dat, 2) #周波数を2倍に変更する

2. dat = vocoder.warp_spectrum(dat, 1.2) #スペクトル包絡を2倍にする

これで声質変換が出来ます。

ソースコードの全体は記事の最後に貼っておきます。

 

qiita.com

  

 声質変換の評価

 ・original.wav

 

・original-resynth.wav

 

 

インストール〜テスト実行(動画)

動画を見ながら一緒に実行して頂いたらわかりやすいと思います。


音声合成・分析・変換システム「WORLD」のインストールと声質変換してみた!【MacOS編】

 

 

 

引用元

[1]

www.kki.yamanashi.ac.jp

 

ソースコード

from pathlib import Path

import sys
import numpy as np
from scipy.io.wavfile import read as wavread
from scipy.io.wavfile import write as wavwrite
from scipy import signal
from world import main
import matplotlib.pyplot as plt

# wav_path = Path('test/test-mwm.wav')
wav_path = Path('test/original.wav')
print(wav_path)
fs, x_int16 = wavread(wav_path)
x = x_int16 / (2 ** 15 - 1)

if 0:  # resample
    fs_new = 16000
    x = signal.resample_poly(x, fs_new, fs)
    fs = fs_new

if 0:  # low-cut
    B = signal.firwin(127, [0.01], pass_zero=False)
    A = np.array([1.0])
    if 0:
        import matplotlib.pyplot as plt
        w, H = signal.freqz(B, A)

        fig, (ax1, ax2) = plt.subplots(2, figsize=(16, 6))
        ax1.plot(w / np.pi, abs(H))
        ax1.set_ylabel('magnitude')
        ax2.plot(w / np.pi, np.unwrap(np.angle(H)))
        ax2.set_ylabel('unwrapped phase')
        plt.show()
    x = signal.lfilter(B, A, x)

vocoder = main.World()

# analysis
dat = vocoder.encode(fs, x, f0_method='harvest') 

dat = vocoder.warp_spectrum(dat, 1.2)

if 1:  # global pitch scaling
    dat = vocoder.scale_pitch(dat, 2)
if 0:  # global duration scaling
    dat = vocoder.scale_duration(dat, 1.2)
if 0:  # fine-grained duration modification
    vocoder.modify_duration(dat, [1, 1.5], [0, 1, 3, -1])  # TODO: look into this

# synthesis
dat = vocoder.decode(dat)
if 0:  # audio
    import simpleaudio as sa
    snd = sa.play_buffer((dat['out'] * 2 ** 15).astype(np.int16), 1, 2, fs)
    snd.wait_done()
if 0:  # visualize
    vocoder.draw(x, dat)

wavwrite(wav_path.with_name(wav_path.stem + '-resynth.wav'), fs, (dat['out'] * 2 ** 15).astype(np.int16))