SlideShare a Scribd company logo
1 of 22
Download to read offline
Common Lispで音声合成
Satoshi Imai / 今井 悟士
Twitter: @masatoi0 Github: masatoi
これまでの発表
● #29: 線形分類器cl-online-learningの実装
– http://www.slideshare.net/masatoi0/lispmeetup29-c
lonlinelearning
● #39: ディープラーニング用ライブラリMGLの紹介
– http://www.slideshare.net/masatoi0/lispmeetup-39
-mgl
今回の目標
●
ディープラーニングの応用として音声合成(テキスト読
み上げ)を試みる → 未完!
– ここまでの成果物: https://github.com/masatoi/cljtalk
● DNN音声合成の全体の流れを把握する
– Common Lispで実装するために必要な道具を揃える
● 音素アライメント → Julius、segmentation-kit
●
音声分析合成 → WORLD、cl-libworld
● メル周波数ケプストラム(MFCC) → libfftw3
色々なTTSシステム
●
波形接続型音声合成 (VOICEROID (結月ゆかり etc))
– 小さい音声の素片を連結して合成する
●
統計的音声合成
– HMM (CeVIO (さとうささら etc)、 Open JTalk)
● HMM(隠れマルコフモデル)を使うもの
– DNN
● 単純なFFNNを音声に適用 (簡単!)
– LSTM-RNN (Googleテキスト読み上げ)
●
再帰型ニューラルネット
– Wavenet (DeepMind) ← new!
色々なTTSシステム
●
統計的音声合成
– HMM
– DNN
– LSTM-RNN
– Wavenet
●
ボコーダーを介さず直接音声を予測する
●
畳み込みニューラルネットで自己回帰(自分の予測を入力の一
部として与える)
●
ボコーダーを使う
生の音声ではなく、音声を少数のパラメータ
に変換してそれを予測する
再合成時に劣化する
ボコーダー(音声分析合成)
●
生の音声からパラメータを取り出したり再合成したりする
● WORLD
– C++の音声分析合成ライブラリ
● cl-libworld
– https://github.com/masatoi/cl-libworld
– Common Lisp用のラッパーをCFFIで実装した
– WORLDのコードを丸抱えして、require時にLakeでビルドする
基本周波数(F0)
音の高さ
パワースペクトル
周波数毎の強さ
声道(口の形)を表す
非周期性指標
声のかすれ具合
メル周波数ケプストラム
●
まだパラメータ数が多いのでもっと圧縮したい
●
メルフィルタバンク
– 人間の耳にとって重要な周波数帯のスペクトルを重点的に
取るためのフィルタ
メル周波数ケプストラム
●
まだパラメータ数が多いのでもっと圧縮したい
●
メルフィルタバンク
●
スペクトルにメルフィルタバンクを掛けて対数変換する
かけてから
対数変換
メル周波数ケプストラム
● 離散コサイン変換(DCT)する
– 低周波帯に情報が集まる
● 上の方は切ってもいい! → 13次元でカット
● ここまでやったもの: メル周波数ケプストラム係数(MFCC)
– DCTはCのライブラリFFTWを使う(CFFIでラップ)
DCT
DCT
の逆変換
MFCCから音声まで戻す
● DCTの逆変換は無劣化でできる (上を切らなければ)
● それからexpをかける
●
元のスケールに戻して、スプライン補間をかける
スケール変換
スプライン補間
exp
MFCCから音声まで戻す
●
スプライン補間
– データ点の間を三次曲線で滑らかに繋ぐ
– データ数のサイズの逆行列を計算する必要があるが、三重対角行
列なのでO(N)でできる
DNNの出力データを作る
● 非周期性指標はDCTで5次元まで圧縮する
● F0が1次元、スペクトルが13次元、非周期性指標が5次元で1フレーム当たり19
次元の特徴量になる
入力データを作る
●
音素アライメント
– テキストデータと音声から音素の開始時間と終了時間を
推定する
– Juliusのsegmentation-kitが使える
0.0000000 0.0925000 silB
0.0925000 0.2625000 a
0.2625000 0.4125000 i
0.4125000 0.5225000 u
0.5225000 0.5825000 e
0.5825000 0.7525000 o
0.7525000 0.7825000 silE
あいうえお
入力データを作る
●
音素アライメント
– テキストデータと音声から音素の開始時間と終了時間を
推定する
0.0000000 0.0925000 silB
0.0925000 0.2625000 a
0.2625000 0.4125000 i
0.4125000 0.5225000 u
0.5225000 0.5825000 e
0.5825000 0.7525000 o
0.7525000 0.7825000 silE
入力データを作る
●
音素をフレームに割り当てる
– 一つのフレーム毎の特徴量
● どの音素に属しているか? → 38次元のバイナリ特徴
● その音素の継続時間(duration) 1→ 次元の実数
●
その音素が割り当てられているフレームの中で何番目か
→ 1次元の整数
DNNの構造
“Deep Learning in Speech Synthesis” [H.Zen, 2013]
T個のフレームの特徴量を一列に並べてDNNの入出力とする
MGLとは
● Common Lisp用の機械学習ライブラリ
●
ディープラーニングの割と最近の手法までカバー
● MGL-MATという行列演算ライブラリを使う
– cl-cuda、LLA(Lisp Linear Algebra)によって高速化
● cl-cudaがQuicklispに入ったことによりMGL-MATもQuicklispから入
るようになった!
MGLで回帰問題を解く
● 回帰のやり方はドキュメントが無いのでMGLのソースと格闘する
● まず簡単な2次元→1次元の関数を近似する
元の関数 近似結果
(defun rastrigin (x­list)
  (let ((n (length x­list)))
    (+ (* 10 n)
       (loop for xi in x­list summing
 (­ (* xi xi) (* 10 (cos (* 2 pi xi))))))))
MGLで回帰問題を解く
● build-fnnマクロでネットワークの構造を指定してオブジェクトを生成
– 入力層2次元、1200次元の隠れ層が3層、出力層1次元
– 隠れ層の活性化関数はReLU、出力層の活性化関数は恒等写像、誤差関数は
二乗誤差
(defparameter fnn­regression
  (build­fnn (:class 'regression­fnn :max­n­stripes 100) ; バッチサイズ100
    ;; Input Layer 2次元
    (inputs (­>input :size 2))
    (f1­activations (­>activation inputs :name 'f1 :size 1200))
    (f1 (­>relu f1­activations))
    (f2­activations (­>activation f1 :name 'f2 :size 1200))
    (f2 (­>relu f2­activations))
    (f3­activations (­>activation f2 :name 'f3 :size 1200))
    (f3 (­>relu f3­activations))
    (prediction­activations (­>activation f3 :name 'prediction :size 1))
    ;; Output Lump:  squared­difference 1→ 次元
    (prediction (­>loss (­>squared­difference (activations­output prediction­activations)
                                              (­>input :name 'targets :size 1))
                        :name 'prediction))))
DNN音声合成のためのモデルを作る
● 一度にDNNに与えるフレーム数Tを20とする
● 入力40*20=800次元、出力19*20=380次元
●
しかしこれで学習してみると数値計算エラー!
(defparameter fnn
  (build­fnn (:class 'regression­fnn :max­n­stripes 100)
    ;; Input Layer
    (inputs (­>input :size 800))
    (f1­activations (­>activation inputs :name 'f1 :size 512))
    (f1 (­>relu f1­activations))
    (f2­activations (­>activation f1 :name 'f2 :size 512))
    (f2 (­>relu f2­activations))
    (f3­activations (­>activation f2 :name 'f3 :size 512))
    (f3 (­>relu f3­activations))
    (prediction­activations (­>activation f3 :name 'prediction :size 380))
    ;; Output Lump: ­>squared­difference
    (prediction (­>loss (­>squared­difference (activations­output prediction­activations)
                                              (­>input :name 'targets :size 380))
                        :name 'prediction))))
まとめ
● 音声合成のための特徴量を揃えたが肝心のDNNの学習に失敗
– 出力が多次元のより単純な回帰問題で学習の進行を観察する
●
入力の特徴量もアクセントやイントネーションを無視しているので、テキ
ストを分析してこれらの情報を付与するようにしたい
– さらにユーザが簡単にアクセントなどを調整するためのGUIを用意
● CFFIでCのライブラリが簡単に呼べるのでライブラリ不足は感じない
– 今回はWORLDとFFTWのラッパーを書いた

More Related Content

What's hot

TensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアTensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアMr. Vengineer
 
深層学習フレームワーク Chainerとその進化
深層学習フレームワークChainerとその進化深層学習フレームワークChainerとその進化
深層学習フレームワーク Chainerとその進化Yuya Unno
 
PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法Yosuke Onoue
 
二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについて二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについてshow you
 
クリスマス?
クリスマス?クリスマス?
クリスマス?sasenomura
 
Numpy scipy matplotlibの紹介
Numpy scipy matplotlibの紹介Numpy scipy matplotlibの紹介
Numpy scipy matplotlibの紹介Tatsuro Yasukawa
 
Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Seiya Tokui
 
Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Makoto Kawano
 
2012 12 08_ngk_osm_a
2012 12 08_ngk_osm_a2012 12 08_ngk_osm_a
2012 12 08_ngk_osm_aTom Hayakawa
 
Tcl/Tkクイック入門
Tcl/Tkクイック入門Tcl/Tkクイック入門
Tcl/Tkクイック入門nyaocat
 
Rubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしRubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしMasaki Matsushita
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化についてAimingStudy
 
PARI/GPの話 @ Ph/shh/bin CTF勉強会LT
PARI/GPの話 @ Ph/shh/bin CTF勉強会LTPARI/GPの話 @ Ph/shh/bin CTF勉強会LT
PARI/GPの話 @ Ph/shh/bin CTF勉強会LT__ytoku
 
A Multiple Pairs Shortest Path Algorithm 解説
A Multiple Pairs Shortest Path Algorithm 解説A Multiple Pairs Shortest Path Algorithm 解説
A Multiple Pairs Shortest Path Algorithm 解説Osamu Masutani
 
論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"Yuta Koreeda
 
[DLHacks]Comet ML -機械学習のためのGitHub-
[DLHacks]Comet ML -機械学習のためのGitHub-[DLHacks]Comet ML -機械学習のためのGitHub-
[DLHacks]Comet ML -機械学習のためのGitHub-Deep Learning JP
 

What's hot (20)

CuPy解説
CuPy解説CuPy解説
CuPy解説
 
TensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアTensorFlow XLA とハードウェア
TensorFlow XLA とハードウェア
 
深層学習フレームワーク Chainerとその進化
深層学習フレームワークChainerとその進化深層学習フレームワークChainerとその進化
深層学習フレームワーク Chainerとその進化
 
PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法PythonistaがOCamlを実用する方法
PythonistaがOCamlを実用する方法
 
NumPy闇入門
NumPy闇入門NumPy闇入門
NumPy闇入門
 
二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについて二階堂愛と二階堂藍の違いについて
二階堂愛と二階堂藍の違いについて
 
クリスマス?
クリスマス?クリスマス?
クリスマス?
 
My code
My codeMy code
My code
 
Numpy scipy matplotlibの紹介
Numpy scipy matplotlibの紹介Numpy scipy matplotlibの紹介
Numpy scipy matplotlibの紹介
 
Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用Chainerの使い方と自然言語処理への応用
Chainerの使い方と自然言語処理への応用
 
Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章
 
2012 12 08_ngk_osm_a
2012 12 08_ngk_osm_a2012 12 08_ngk_osm_a
2012 12 08_ngk_osm_a
 
Tcl/Tkクイック入門
Tcl/Tkクイック入門Tcl/Tkクイック入門
Tcl/Tkクイック入門
 
M1 gp
M1 gpM1 gp
M1 gp
 
Rubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなしRubyで実はwritev(2) が使われているはなし
Rubyで実はwritev(2) が使われているはなし
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
PARI/GPの話 @ Ph/shh/bin CTF勉強会LT
PARI/GPの話 @ Ph/shh/bin CTF勉強会LTPARI/GPの話 @ Ph/shh/bin CTF勉強会LT
PARI/GPの話 @ Ph/shh/bin CTF勉強会LT
 
A Multiple Pairs Shortest Path Algorithm 解説
A Multiple Pairs Shortest Path Algorithm 解説A Multiple Pairs Shortest Path Algorithm 解説
A Multiple Pairs Shortest Path Algorithm 解説
 
論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"
 
[DLHacks]Comet ML -機械学習のためのGitHub-
[DLHacks]Comet ML -機械学習のためのGitHub-[DLHacks]Comet ML -機械学習のためのGitHub-
[DLHacks]Comet ML -機械学習のためのGitHub-
 

Similar to Lispmeetup #45 Common Lispで音声合成

Common Lispっぽいものをつくっています
Common LispっぽいものをつくっていますCommon Lispっぽいものをつくっています
Common Lispっぽいものをつくっていますt-sin
 
LibreOfficeの最新動向 in OSC 2015 Hiroshima
LibreOfficeの最新動向 in OSC 2015 HiroshimaLibreOfficeの最新動向 in OSC 2015 Hiroshima
LibreOfficeの最新動向 in OSC 2015 HiroshimaMasataka Kondo
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-t-sin
 
Debian tokyo-20150224-01
Debian tokyo-20150224-01Debian tokyo-20150224-01
Debian tokyo-20150224-01Yuji IMAI
 
Lisp tutorの開発について
Lisp tutorの開発についてLisp tutorの開発について
Lisp tutorの開発についてHiroki Noguchi
 
日本Symfonyユーザ会によるSymfony2 ワークショップ
日本Symfonyユーザ会によるSymfony2 ワークショップ日本Symfonyユーザ会によるSymfony2 ワークショップ
日本Symfonyユーザ会によるSymfony2 ワークショップShin Ohno
 

Similar to Lispmeetup #45 Common Lispで音声合成 (7)

Common Lispっぽいものをつくっています
Common LispっぽいものをつくっていますCommon Lispっぽいものをつくっています
Common Lispっぽいものをつくっています
 
LibreOfficeの最新動向 in OSC 2015 Hiroshima
LibreOfficeの最新動向 in OSC 2015 HiroshimaLibreOfficeの最新動向 in OSC 2015 Hiroshima
LibreOfficeの最新動向 in OSC 2015 Hiroshima
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-
 
Debian tokyo-20150224-01
Debian tokyo-20150224-01Debian tokyo-20150224-01
Debian tokyo-20150224-01
 
先取り Go1.5
先取り Go1.5先取り Go1.5
先取り Go1.5
 
Lisp tutorの開発について
Lisp tutorの開発についてLisp tutorの開発について
Lisp tutorの開発について
 
日本Symfonyユーザ会によるSymfony2 ワークショップ
日本Symfonyユーザ会によるSymfony2 ワークショップ日本Symfonyユーザ会によるSymfony2 ワークショップ
日本Symfonyユーザ会によるSymfony2 ワークショップ
 

More from Satoshi imai

lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装Satoshi imai
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Satoshi imai
 
Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法Satoshi imai
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめSatoshi imai
 
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Satoshi imai
 
Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Satoshi imai
 

More from Satoshi imai (7)

lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境
 
Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法Lispmeetup #56 Common lispによるwebスクレイピング技法
Lispmeetup #56 Common lispによるwebスクレイピング技法
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
 
Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類
 

Lispmeetup #45 Common Lispで音声合成