[レポート] LINEにおける深層学習を用いた音源分離技術の研究 #linedevday_report
せーのでございます。
2019年11月20日(水)・21日(木)にグランドニッコー東京 台場でLINEのデベロッパーカンファレンス「LINE DEVELOPER DAY 2019」が開催されました。
本記事は、セッション「LINEにおける深層学習を用いた音源分離技術の研究」をレポートします。
スピーカー
- 戸上 真人氏 [LINE Research Labs Senior Researcher]
セッション概要
AIアシスタントなど音声で操作する機器・サービスは近年急速に増えつつあります。これらの機器・サービスでは高い音声認識率を得る事が重要なポイントになります。この時,避けて通れない問題が、他の人の話し声,走行雑音などの雑音,部屋の壁や床で音が反射することで生じる反響音がマイクに混入する,「不要音混入問題」です。この問題に対して,様々な研究機関で,2000年以降,ユーザーの音声だけを抽出する音源分離の研究が盛んに行われてきましたが,特に近年の性能の向上は,深層学習を取り込むことで目覚ましいものになってきています。本セッションでは,深層学習を用いた音源分離技術について,どのようなブレイクスルーがありどのような事ができるようになったか,そして,そのブレイクスルーを実現した中核技術は何か,さらにLINEで研究を進めている深層学習を用いた音源分離技術についてお話しいたします。また,LINEでは2018年に国立情報学研究所と連携し,研究開発を行う部門である「Research Labs」を設立いたしました。本部門の概要についてもお話しいたします。
レポート
- Agenda
- 音源分離とは何か
- 音源分離を実現するための方法
- 統計的なモデルを用いた方法
- DNN(深層学習)を用いた方法
- DNNと音源分離は完全に結合できてはいない
- 深く結合させるための研究内容の発表
音源分離とは
- DEMO
- 会議室で2人の声を収録
- 音源上では2人の声は混ざって録音されている
- 音源分離技術によりそれぞれの声を分離して抽出する
- ブロック構成
- 複数の音が混ざったものを入力
- それぞれの声を分離して出力
- 使いみち
- AIスピーカー
- 人間とスピーカー1対1で会話することを前提としている
- 家庭の中の複数人の会話を理解してそれぞれに応対を出し分ける
- 会議
- 会議の音声を収録する
- 音源分離技術でそれぞれの人の声を分離してそれぞれ書き起こす
- 音楽
- オーケストラの音を収録
- 特定の音を消して自分の音を追加する
- オーケストラにバーチャルに参加する
- 音源分離方法の道のり
- かつては統計モデルに基づいた音源分離方法が用いられていた
- 今はDNNが主流
統計モデルに基づく音源分離方法
- そもそも音声信号とは
- 時系列と周波数を可視化したスペクトログラムを見て判断できる
- 2人の声が混ざると単純に足された形で表示される
- マイクの入力信号を例えば左右2つに分けると空間的なモデルを分離の手がかりとして活用できる
- 2人が左右に分かれていると左の人の声は右のマイクは左のマイクに比べて小さく、遅れて入力される
- この差を音源の違いとして使う
- これを式で表すと x = As となる
- Aは音の伝わり方を表す行列
- S1、S2はともに2つの要素を持つベクトルなので、Aは2 x 2の正方行列となる
- つまりAの逆行列をxにかければSを求めることができる
- しかし実際は環境がわからないので音の伝わり方Aはわからない
- Aを適当に設定すると何かしらの答えとしてSは出てくる。それが分離できていれば逆説的にAは正しい、となる
- 「音声らしいモデル」Aを用意すればいい
- 人間の音声は特徴的なのでいくつか統計的なモデルがある
- Independent Vector Analysis(IVA)
- 人間の音声は全ての周波数成分が時間帯ごとに同じ音量を取りやすい
- 実際は周波数の高低で大きい音量を取る時間帯は違う
- Independent Low-Rank Matrix Analysis(ILRMA)
- 周波数ごとに大きくなる時間帯は複数ある
- IVAより正確
- まだ本来の音声とは乖離している
- より正確に音声のモデルを定義したい => Deep Neural Network(DNN)の採用
Deep Neural Network(DNN)による音源分離方法
- 音声を分離するために非線形な回帰分析を行いパラメータを学習させる
- 学習したモデルを用意して推論を行い、結果を空間的なモデルと音源分離に接続することで分離信号を得る
- しかし、学習したモデルは音源モデルを推定するために学習されており、空間モデルや音源分離は考慮されていない
- モデルを単独で学習させるのではなく、音源分離と統合して学習させることが重要
DNNと音源分離を深く結合させるための研究
- 音源分離がより進むようにDNNを学習させる方法
- 学習後に音源分離処理を行い、その結果に対して損失計算を行う
- 損失がなるべく小さくなるように学習させる
- 誤差逆伝播の場合には音源分離層を通ってパラメータが学習される
- 音源分離処理は複素数の計算を含むが全てが微分可能なため、誤差逆伝播も可能
- 損失関数の求め方
- 正解の分離信号と学習結果の分離信号との二乗誤差が少なくなるようにする
- 実際の音声分離では分離しきれないサンプルを二乗してしまうと誤差が大きくなる => 過学習の危険
- 分離サンプルの分散(信頼度)を推定し、分散が大きい場合は誤差を割り引く
- 共分散行列の逆行列をかける
- 二乗オーダーから対数オーダーに割り引かれる => 過学習のリスクが減る
- より直接的に音源分離の影響をDNNに入れ込む
- DNNの中をいじる
- 音声信号は時系列信号なのでBLSTM(Bidirectional Long short-term memory)を数階層用いている
- 実際の空間モデル情報は全てのBLSTMによる学習が終わった後に接続される
- 各階層のBLSTMに空間モデル情報を入れ子にする
- マイクの数が多い場合は性能の差が大きくなる => マイクの数が多いと空間モデルの情報が多いから
- 音源分離における教師なし学習法
- 今までの学習法は教師データ(正解となるクリーンな音声)が得られることが前提
- 実際には正解データを得るのは困難
- 正解データがなくても学習できるようにしよう
- 正解データの代わりに統計モデルに基づく音源分離方法によって導いた結果を擬似的な正解データとして用いる
- 統計モデルにて作ったデータを「正解」とするなら、学習結果はその「正解」を超えることはないのではないか?
- 統計モデルでは分離に失敗する周波数部分がある
- 失敗の仕方はランダム
- DNNはランダムなものは学習しにくい => ランダムな部分(失敗部分)は学習されずに正解だけ学習する可能性がある
- 失敗部分を学習して過学習になる可能性もあるのでここでも損失関数に分散サンプルを使う
- DNNだけではなく正解データにも失敗部分があるので両方に使う
- 確率分布同士を比較するような損失関数 => カルバック・ライブラー擬距離(KLD)を用いる
- 3つの方法での実験を元データ(左上)と比べてみる
- 最後の方の無音部分(グラフ右の青い所)がKLDを使ったもので一番再現されている
- 低周波数の部分(グラフの最下部)がKLD以外の実験結果では欠損している
まとめ
かなりガチ度の高いセッションで、初めて見た単語も多かったのではないでしょうか。DeepLearningの性能がいいからと言ってそれだけに頼るのではなく、それまで研究していた統計的手法を用いて機械学習を補完に使う、という考え方は実践に基づいていて、「やってみた」感があって非常に共感が持てました。統計的手法に用いる音声らしさの定義の精度を上げるためにDNNを使うのに、そのDNNを現実に即した形にするために統計的手法を用いる、という感じもエンジニアリングの試行錯誤を感じます。
尚この統計的手法を用いた音声分離はgithubにpythonのコードが公開されていますので、興味のある方は触ってみてはいかがでしょうか。