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

音声認識と合成について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