研究で音声合成を始めたいと考えている人「何でもいいから音声合成の始め方を知りたい。」
趣味で音声合成を始めたいと考えている人「好きな声優・キャラの声で名前を呼ばれたい。音声合成を用いたシステムを作りたい。けど、始め方すら分からない、とりあえず音声合成を動かしてみたい」
こういった疑問に答えます
本記事のテーマ
【完全初心者向け】
音声分析変換合成システム「WORLD」のインストールと声質変換
必要なもの
・MacOSのパソコン
WORLDとは
WORLDは,Vocoderのアイディアを発展させた音声分析変換合成システムです. 発達した計算機能力を駆使し,高品質で柔軟な音声分析・変換・合成の実時間処理を目的としています. UTAUの合成エンジン,また音声創作ソフトウェアCeVIOの音声分析の一部にもWORLDが使われています.[1]から引用
インストール方法
WORLDはC++で作成されていますが、Pythonで使用できるようにしたライブラリも用意してくれているので今回はこちらをインストールします。
C++のGit
PythonのGit
まずは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倍にする
これで声質変換が出来ます。
ソースコードの全体は記事の最後に貼っておきます。
声質変換の評価
・original.wav
・original-resynth.wav
インストール〜テスト実行(動画)
動画を見ながら一緒に実行して頂いたらわかりやすいと思います。
音声合成・分析・変換システム「WORLD」のインストールと声質変換してみた!【MacOS編】
引用元
[1]
ソースコード
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))