ピッチを変更すると違和感を感じるが、どこが悪いのか

PSOLAといったピッチを変更するアルゴリズムがあるが、少し変更するだけで違和感が出てしまう。

合成音声の学習データをかさ増しする時にピッチを上げるデータを用意するとか、ボコーダーの後でピッチを調整するというのが考えられるが、もう少し自然にならないのか。

 

https://www.ieice.org/tokyo/gakusei/activity/kenkyuu-happyoukai/happyou-ronbun/17/pdf/102.pdf

ここを見ると、楽器のような一定間隔ピッチが一定の場合は違和感がなく、ピッチが変動するような場合は違和感を感じるとある。

 

VSTプラグインでフォルマントやピッチをいじるものが多くあるが、どうように違和感がある。

合成音声で声道の震えは関係ないのか

Speech production and acoustic properties - Introduction to Speech Processing - Aalto University Wiki

 

合成音声(Text-to-Speech)だと声道モデリングの知見は使われているものの、物理モデルから音を作るということはしてない。

 

F0/F1/F2などフォルマント推定だが、実際の声は微妙に震えているのではないだろうか。dbと周波数両方震えているのでは。

声の大きさによって震えの量も変えた方がいいのではないだろうか。

 

 

合成音声向けには、音素の分割を自動にしたほうがいいか

※下記は試したわけではなくメモ

 

機械学習向けでは、音を録音したあと、人の手で音素のラベリングが行われている。

そこでの問題点としては

  1. 音素の切れ目が明確ではない。ラベルごとに誤差が発生する
  2. データが多いため複数人でラベリングを行うと、判断基準が人によって異なる
  3. 「あ」と「お」の中間の音をどちらに割り振るかなど、音自体に曖昧さがあり、単語を知っているあまり、音素を推測してしまう
  4. IPA、CSJなど音素に付けられていない音もあるのではないか?
  5. ラベリングした音素では、音の高さなどの情報が失われてしまっている

 

音声の変化ポイントを検出し分割

時系列データの変化ポイントを検出するのには、Bayesian Online Changepoint Detectionといった方法が知られている。

An Evaluation of Change Point Detection Algorithmsという論文でオンラインベイジアン変化点検出の性能が良いと言われている。

 

matlabを使う場合、オンラインベイジアン変化点検出関数はなさそうで、githubなどにあるものを使うか、自前で作る必要がある。

てっとり早く分割だけ試すには、変化点を検出関数としてfindchangeptsというのがある。

findchangepts(y,'MaxNumChanges',10,'Statistic','rms')

ここで問題となるのが分割数を指定しており、上の"10"というのが領域を10分割するという引数にあたる。

 

音声データを大量にバッチ処理することを考えた場合、分割数はデータに応じて変化させたい。

 

ここで、音素の最初と最後の変化部分を分割できることを期待している。

子音から母音に変わり安定するまでの変化点を分割するといった具合だ。

既存のラベリング方法では、ここが丸め込まれてしまっているのではないか、という仮設による。

 

合成音声システムの場合は、入力した文字と音を対応づけしないといけないわけだが、対応付けできない変化点が出てくると想像しており、変化の方法も複数あるだろう。

機械学習に持っていくためには、何かしらかの対応した数字を付けてラベリングすれば解決するのではないだろうか。

 

分割後の有声音や無声音の分類の自動化

有声音と無声音の分類には、ゼロ交差率 (Zero-Crossing Rate)といった方法がある。

 

 

 

n Online Changepoint Detection

Bayesian Online Changepoint Detection

Bayesian Online Changepoint Detection

音声合成での思いついたことのメモ

学習に使う話者の音声データと、日本語のイントネーション学習に使うデータの分離

音声合成で問題なのは学習データをどうするかというのがある。

数時間分の声を録音するとして、話者の疲労度によって変わったり、日をまたいだ収録でのデータが異なるなどといったことから、学習データが足りない場合がある。

訛りという問題だったり、発声の癖という点を考慮すると、1人からデータを取るのが望ましいが、使う側が出したいイントネーションが色々あることから、イントネーションに関しては複数人のデータから取った方がいいのではないか。

 

1音素ではなく、音素間の遷移や、1音素を複数分離する方法も取ったほうがいいのでは

既存の音声合成ソフトでは音素ごとに音の高さを変更するようなUIになっている。

音素内での音の高さが変わるといった現象に対応できていない。

しかし遷移の種類は数種類に分類出来ると思われるので、ユーザーが数種類の中から選べるようにすればいいのではないか。

発生するときは口を閉じた状態から開くといった非線形の状態があり、それを再現する

 

長音の場合、1音素の長さを単純に伸ばすようにすると、高さが変わったり、震えがあるなど、再現できていない。

 

ボコーダの音の予測に位相を使った方がいいのでは

ボコーダーで前後関係のみから次の音を予想しているが、実際の音は位相がある。

今のボコーダーで吐き出した音を見ると位相がおかしい。

耳で聞く分には関係ないかもしれないが機械学習で意図せずノイズが出てくるのを抑制するのにはいいのでは。

 

 

CeVIO AI小春六花での調整に苦労していること

f:id:qpci32siekqd:20210323215507p:plain

VOICEROID2の場合だと、ナレーションのように単純に読み上げをすればいいだけの場合は、漢字の読み間違いくらいを直せばよかった。

CeVIO AI小春六花は、どうも1文のどこかに違和感があり、躓く頻度が多い。

 

全部が自動で出来るのは期待していないが、調整しようと思った時に簡単に修正できればいいが、おかしくならない調整範囲がかなり狭い。

 

ピッチで音素の長さを変えようとすると、音の大きさまで変わったり、音が濁ったりする。

音の高さも変えようとすると2mmほど上下させるだけで変な音になる。

 

音質の前に、単語や音素の長さを上手く出してくれないかなと思ってしまう。

 

f:id:qpci32siekqd:20210323221451p:plain

音質に関してだが、6kHzの所で一旦下がる。

eXボイスも似た傾向があるので録音環境に依るのかもしれない。

CeVIOAIで吐き出したスペクトラムを見ると6kHz以上は何かしらかは出ているが倍音が出ておらず潰れてしまっている。

 

Cevio AIトーク、機械学習での合成音声はクオリティ高くならなかったのか

f:id:qpci32siekqd:20210322095337p:plainCevioAIトーク小春六花のスペクトラムが上図になる。

 

f:id:qpci32siekqd:20210322095530p:plain

これが小春六花のexボイスの波形だ。比べればわかるが人の声の方が綺麗だ。

 

機械学習によってクオリティが上がったという話だったが、個人的にあまり良くならなかったというのが正直な感想だ。

 

スペクトラムを見ると、一番周波数が小さい部分は制御されているように見えるが、黒くなっている部分の高音部が削れてしまっている。

NEUTRINOのきりたんの歌声では安定して高音域まで出ていたので処理アルゴリズムによると思われる。

 

 

Cevio AIトークの小春六花のボソボソ感を無くしたい

小春六花がCevioAIで発売された。

Voiceroidと一緒に話すと、ボソボソ感というか、声がこもっているというか、鼻が詰まったような声が気になる。

とりあえずイコライザで調整する。

f:id:qpci32siekqd:20210319212520p:plain

高音側を上げればボソボソした感じは軽減できるかと思う。

1番低いピークの周波数部分を少し落としてやる。

 

Cevio AI ONE, Cevio AI IAも同様にボソボソした声なので、似たような処理が必要だと思う。

 

f:id:qpci32siekqd:20210319213115p:plain

他の部分を色々触ってみたが、あとはお好みといったところだ。

あと”し”の子音部分が気になるので、ディエッサーは別途かけた方がいいと思う。

 

 

f:id:qpci32siekqd:20210319213608p:plain

機械学習ベースだからなのか、高音側の周波数成分がなくなっている部分があり、どうも不安定に聞こえる。

低周波部分はあるが高音側が暗くなる)

 

VOICEROIDでは朗読のような抑揚を必要としないところでは素直に発声してくれたが、Cevio AIトークではそうもいかないらしい。