DNN音声合成について

引用は全て「深層学習に基づく統計的音声合成」(https://www.jstage.jst.go.jp/article/jasj/73/1/73_55/_pdf)から。

統計的音声合成とは

音声合成の問題をテキスト解析部と波形生成部に分解すると,テキストから音素,品詞,単語などを表現する離散値系列(言語特徴量系列)を推定する問題と,言語特徴量系列から音声の特徴を表す連続値系列(音響特徴量系列)を推定し,音響特徴量系列から波形を合成する問題へと分けることができる。

文字列から音声に変換する過程をテキスト解析とそれを元にした波形生成の2つに分けて考えている。

統計的音声合成は,言語情報量系列 l から音響特徴量系列 o が生成される確率P(o | l, λ) を音響モデルと呼ばれる統計モデルによってモデル化することで実現される。

波形生成をする際に、テキスト解析から得られる音素や品詞、単語といった特徴(言語特徴量)から波形のスペクトルのパラメータ、基本周波数といった特徴(音響特徴量)を推定するが、統計的音声合成とはその推定に学習データから得られる確率をモデル化したものを使うような音声合成法である。
同論文(https://www.jstage.jst.go.jp/article/jasj/73/1/73_55/_pdf)から引用した以下の図は統計的音声合成の全体像を理解するのに役に立った。

f:id:k17trpsynth:20180131183901p:plain

DNN音声合成における学習の特徴

DNN に基づく音声合成(DNN 音声合成)では,言語特徴量から音響特徴量を予測する回帰問題にDNN を利用する。

DNN 音声合成では,あらかじめフレーム単位の音響特徴量系列と音素単位の言語特徴量系列の対応(音素境界)を設定し,フレーム単位の音響特徴量と言語特徴量の対を用意する。

コンテクストに関する質問に対する二値(0/1),又は連続値での回答を連結し,数値データとして表現された言語特徴量を用意する。

決定木でしか分類できなかったHMMとは違い、DNNでは連続値で分類することができる。例えば、アクセント型を分類する際、HMMでは「0型か?→はい/いいえ」「1型か?→はい/いいえ」...と分類していたのに対してDNNでは「アクセント型は?→x型」と答えることができる。

DNN音声合成における合成の特徴

まず,継続長モデルを用いて音素継続長を推定し,テキストと音素継続長からフレーム単位の言語特徴量を抽出する。

文字列からは時間は読み取れないので別に用意したモデルを用いて文字列を話す長さを推定し、フレームごとに分割してそれぞれのフレームに言語特徴量のラベルづけをする。

次に,抽出された言語特徴量を DNN へと入力し,DNN からの出力を連結することで音響特徴量系列を得る。DNNはフレームごとに独立に音響特徴量の推定を行うため,得られる音響特徴量系列は合成音声の品質を低下させるような不連続がしばしば含まれる。このため,DNN 音声合成においても HMM 音声合成と同様に,動的特徴量を用いたパラメータ生成アルゴリズムを利用することで合成音声の品質が改善することが知られている。

DNNはフレーム単位で音響特徴量を推定するためその境目で基本周波数などが不連続だったりする場合がある。これでは合成音声は不自然なものになってしまうので、フレームごとのDNNの出力をまとめて1つの出力として考え、それらまとめた出力が、どの「動的特徴量までも含めた音響特徴量」に対応するかという確率を考えて、その確率が最大となるような静的特徴量から波形を作る。音響特徴量を選ぶ際に動的特徴量も考慮することにより、フレーム間の不連続さが解消され、合成音声の不自然さを減らすことができる。


音声認識と合成についてのまとめ

音声認識と合成について1日学んだことのまとめ。

音声認識について

音声認識とは音声を文字列に変換することで、Speech-to-Textとも呼ばれる。
音声認識の基本的な考え方はスペクトルから読み取れるパラメータには発音ごとに特有のパターンがあるとして、そのパターンを捉えようとするものである。
音声を窓関数で切り出した後にフーリエ変換でスペクトルにし、そのスペクトルを時々刻々記録したものはサウンドスペクトログラムと呼ばれる。音声波形では時間振幅のみ、スペクトルでは周波数強さのみが読み取れるが、時間周波数強さも読み取れるのがサウンドスペクトログラムである。
スペクトルから読み取れるパラメータというのは特徴量系列と呼ばれる数ベクトルで表される。その抽出方法は複数あるが、代表的なものとしてはMFCCと呼ばれるものがある。
音声認識はこの特徴量系列がどの単語列に対応するかを決定する問題に帰着する。HMMによってモデル化する場合では単語列と特徴量系列がモデル化され、確率的に対応づけられる。
単語列として認識された音声は単語の並びを制約する言語モデルにかけられる。言語モデルには文が文法的に正しいか正しくないかの2択で判断するものと、単語の並びがありうるかを確率的に評価するものがある。

音声合成について

音声の合成には

  • 文を全部録音する録音合成
  • 単語単位で録音する編集合成
  • 実際の声を元にパラメータを設定するパラメータ合成
  • 文字列から音声を合成するテキスト音声合成(Text-to-Speech)

などがある。
このうち、テキスト音声合成の手順をまとめたものが下図である。(音声合成の基礎より)


f:id:k17trpsynth:20180130182747j:plain

形態素解析

形態素解析とは

  • 文を単語に分割すること。
  • 単語の読みと品詞を推定すること。

単語アクセント

アクセントは音の強さによるもの(英語など)と音の高さによるもの(日本語など)がある。アクセントの単位は音節である場合とモーラ(拍)である場合があり、多くの言語では音節であるが、日本語はモーラを単位とする。
高音から低音に移るモーラをアクセント核と呼ぶ。日本語のアクセントの種類はアクセント核の位置によって分類できる。
助詞のアクセントは前後に接続する単語のアクセント型に依存する。また、単語と単語が合わさって複合語となるときにアクセント型が変わる場合がある。

音素列から波形へ

音素列から波形へ変換する方法としては

  • 人間の発声器官を模倣したロボットによる発音
  • 声帯の振動、声道の物理的特性のシミュレーション
  • 人間の声を使用せずに基本周波数・音色などのパラメータを設定して人工的に合成をするフォルマント合成
  • 波形素片接続合成
  • HMMが生成モデルであることを利用したHMM音声合成

などがある。

波形素片接続合成

波形素片接続合成とは録音した人間の声を適宜取り出してつなぐもので、編集合成の高度なものである。適切な素片を選んだ後に長さとピッチを調節し、接続する。素片の長さやピッチを変える技術としては、波形を基本周期で切り出して重ね合わせるTD-PSOLAなどが用いられている。

ターミナルでのWi-fi経由のインターネット接続のトラブルシューティング方法について

Wi-fi経由でうまくインターネットに接続できない時のトラブルシューティング方法

そもそもWi-fiに接続できているかどうかの確認

ターミナルで

$ ifconfig

と入力すると

Kota[02:02:45]:documents $ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
	inet 127.0.0.1 netmask 0xff000000 
	inet6 ::1 prefixlen 128 
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
	nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
XHC20: flags=0<> mtu 0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 08:6d:41:c2:18:d4 
	inet6 fe80::8cb:a5e:68fa:6be8%en0 prefixlen 64 secured scopeid 0x5 
	inet 192.168.3.9 netmask 0xffffff00 broadcast 192.168.3.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
	ether 0a:6d:41:c2:18:d4 
	media: autoselect
	status: inactive
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
	ether 1a:46:bf:a5:da:31 
	inet6 fe80::1846:bfff:fea5:da31%awdl0 prefixlen 64 scopeid 0x7 
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
	options=60<TSO4,TSO6>
	ether 9a:00:07:9a:cb:00 
	media: autoselect <full-duplex>
	status: inactive
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=63<RXCSUM,TXCSUM,TSO4,TSO6>
	ether 9a:00:07:9a:cb:00 
	Configuration:
		id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
		maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
		root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
		ipfilter disabled flags 0x2
	member: en1 flags=3<LEARNING,DISCOVER>
	        ifmaxaddr 0 port 8 priority 0 path cost 0
	nd6 options=201<PERFORMNUD,DAD>
	media: <unknown type>
	status: inactive
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
	options=6403<RXCSUM,TXCSUM,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
	inet6 fe80::26cf:58ce:145:3b02%utun0 prefixlen 64 scopeid 0xa 
	nd6 options=201<PERFORMNUD,DAD>
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
	options=6403<RXCSUM,TXCSUM,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
	inet6 fe80::a4d5:2253:8d2e:5ca4%utun1 prefixlen 64 scopeid 0xb 
	nd6 options=201<PERFORMNUD,DAD>

このようにずらずらと現在接続しているWi-fiの情報が出てくる。一方で

$ ifconfig | grep broad

と入力すると

Kota[02:08:19]:documents $ ifconfig | grep broad
	inet 192.168.3.9 netmask 0xffffff00 broadcast 192.168.3.255

このように先ほどの情報の内、自分のPCのIPアドレスと接続しているWi-fiIPアドレスだけが抽出されて表示される。これでそもそもWi-Fiに接続できているか、接続しているならどのWi-Fiに接続しているのかが分かる。

Wi-Fi経由でインターネットに接続できているかの確認

さらに

$ ping 8.8.8.8

と入力すると

Kota[02:10:34]:documents $ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=58 time=117.653 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=59.169 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=42.861 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=58 time=42.504 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=58 time=71.117 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=58 time=60.194 ms

このように、ごく小さい64バイトの情報量をやり取りするのにかかる時間をリアルタイムで表示してくれ、「controlキー+C」で次のように結果をまとめて終了する。

^C
--- 8.8.8.8 ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 42.504/65.583/117.653/25.367 ms