読者です 読者をやめる 読者になる 読者になる

manabu’s blog

日々の足跡。

Tensorflow を使いこなせない話

TensorFlow ってご存知ですか. 最近 (?) 巷で流行りの人工知能(というか機械学習(というか深層技術))の実装を助けてくれるライブラリです. オープンソースですが, Google が作っているので機械学習ライブラリとしては有名だと思います.
ただこの TensorFlow, ただの機械学習ライブラリと言うには語弊がありますよね.

研究で流行りの深層技術を扱った際に TensorFlow を利用したのですが, 如何せん, TensorFlow のポテンシャルを微塵も発揮できている気がしません.
ちまちまやれば所望のアプリケーションは実装できるのですが, TensorFlow の実力は深層技術を用いたアプリケーションの実装が容易い (?) ことではないと Google さんはおっしゃられています.

TensorFlow のトップページでは,

About TensorFlow

TensorFlow™ is an open source software library for numerical computation using data flow graphs. Nodes in the graph represent mathematical operations, while the graph edges represent the multidimensional data arrays (tensors) communicated between them. The flexible architecture allows you to deploy computation to one or more CPUs or GPUs in a desktop, server, or mobile device with a single API. TensorFlow was originally developed by researchers and engineers working on the Google Brain Team within Google’s Machine Intelligence research organization for the purposes of conducting machine learning and deep neural networks research, but the system is general enough to be applicable in a wide variety of other domains as well.

とあります.

要は, TensorFlow は数値計算ライブラリだと. データフローグラフに基づいた数値計算ライブラリ. それも, 様々なデバイス・計算資源のもとで動かすことが出来る. 元々機械学習の研究を目的として作られた, しかし, 応用範囲は機械学習に留まらない(これが大事).

なんかすごそう. データフローグラフに基づいた数値計算ライブラリって意味, TensorFlow を既に触った身からすると何となくだけど分かるようで分からない. 使いこなせたらすごいんだろうな.

と, いたく感動しているのですが, 実際どんなことに使えるのかがわかりません.
Tutorials では Deep Learning 系の実装以外に, マンデルブロ集合 (?) や偏微分方程式 (?) を実装 (?) して可視化するものがあります.
でもそれじゃ有り難みがわからない…もっと具体的なアプリケーションを実装して欲しい…
誰か格好良く使いこなして…そしてデータフローグラフの延いては TensorFlow の素晴らしさ教えて欲しい…

小学生みたいな感想ですが, ファイルの読み込みから書き込みまで何もかもフローグラフで表現されていて, 関数型言語みたいだと思いました.
…見栄を張りました, 実は関数型言語すら触ったことないです…

ドキュメントとチュートリアルがせっかく充実しているのだしもっとちゃんと勉強しようと思います.

以上, TensorFlow のバージョンアップに伴って既存スクリプトとの互換性が無くなり, 折角だから改めてチュートリアルをやってみたら中々コードが読み解けなくて, つらみ極まった人の戯れ言でした.

ダメ絶対音感について実験してみた その2

はじめに

この記事は ダメ絶対音感について実験してみた の続きです。
追実験とその考察についてまとめました。

追実験

追実験と言ってもやったことは、

  • UBM 学習用の音声データに JNAS と呼ばれる音声コーパスを用いた。具体的には JNAS 内の男性話者100名と女性話者100名について各話者4分程度の音声データを用意した。
  • GMM の混合数、EMアルゴリズムイテレーション回数、i-vector の次元数などのパラメータを色々と試した。
  • 集めた音声データのうち雑音やBGMが入っているデータは除外した。

という程度です。

結果

前回の実験と結果は変わりませんでした。
ただ、声優の地声発話データを各声優3発話用意して i-vector を抽出・距離を計算したところやはり声優識別は正しく出来ていました。

考察

これもう、声優がキャラクターを演じると i-vector 空間上では他の話者とみなされるほど声質が変化しているということでは!?? と思ったので、アニメや声優をよく知らない研究室の先輩に実際に音声を聞き比べてもらいました。
椎名まゆり(CV: 花澤香菜)の音声データを聞いてもらったあと、花澤香菜東山奈央のラジオ音声を聞いてもらって「どちらの声優が声を当てていると思いますか?」と質問したところ、 あまり迷わず東山奈央だと答えました。
これはプログラムの識別結果と一緒です... つまり、単純な声質だけではダメ絶対音感は成り立たないのかもしれません。
研究室の先生ともわいわい議論したのですが、i-vector の話者内変動(話者に同じ内容を読み上げてもらっても1回目と2回目じゃ絶対少しはしゃべり方変わってしまうよねってこと)を考慮して距離計算をしているのですが、声優の演技は話者内変動というには変化が大きすぎてもはや別人だと言えそうです。
これつまり声紋認証とか無理ってことかな。やろうと思えば他人の声真似ることできるわけだし。指紋認証のようにはいかなさげ。

あと大きな疑問として、何でダメ絶対音感なんて特技(?)が出きるのか、という問題が残ります。
いくつか理由を考えてみたのですが、

  • 声質以外のキャラクターの演じ方に声優の方々の個性が乗っている。
    アクセントとかの韻律情報は今回使っていないです。音声の特徴量としてmfcc(メル周波数ケプストラム係数)を用い、GMM 生成モデルを構築して i-vector を抽出しているのですが、この mfcc に韻律情報はのっていません。気になる人は頑張って調べて。
  • 複数の話者モデル(キャラクター)が存在して実はみんな同じ声優が声をあてているんだよ、ということを知っている。(つまり声優が新しい演技をしたらそのキャラクターのCVが誰かわからなくなる)
  • そもそもダメ絶対音感出来ていない。オタクの驕り。

といったところでしょうか。

ダメ絶対音感を本気でやろうと思ったら声質変換の話も混ぜてごちゃごちゃと出来ないでもないかもしれない(?)ですが、普段の研究レベルのタスクになるので、この話はここでおしまいです。

せっかくスクリプト書いたりもしたので、次は時間があれば声優の声を i-vector 空間上に埋め込んで(どの声優の声が似ているかなど)可視化してみてもいいかもしれません。

ダメ絶対音感について実験してみた

はじめに

この記事は eeic Advent Calendar 2016 10 日目の記事です。
卒論配属の研究室にちなんで、何か音声に関係あることをここでやりたいなと思ったのですが、さっと作れて見せやすいものが中々思いつかず... 迷ったのですが、タイトルの通りダメ絶対音感について実験してみたことを書こうと思います。
具体的には、既存の話者識別アルゴリズムでキャラクターの声優識別って出きるのかな、というお話です。

ダメ絶対音感

ダメ絶対音感について一応説明すると、アニメを見てる時にキャラクターの声を聞いただけでその声を当てている声優が誰か分かるやつです。

え?何言ってるかわからない?ほら、よくあるじゃないですか。ぼーっとアニメ見てると急に
\ピコーン/「あ、香菜ちゃんだ」
みたいな。無いですか。そうですか。 きもいですか。否定はしません。

この記事は絶対音感を話者認識プログラムで実装したいという野望に基づいて書かれています。
まあ、これ書いている段階でまだデータセットスクリプトも用意出来てないのですが...

ただデータをたくさん集めて DNN で識別器を学習して、だと面白くないので、i-vector なるものを使って声優の地声とキャラクターの声の距離を測ることで識別できるのか、というタスクでやってみようと思います。

話者認識(話者識別)

音声の研究は大きく、合成系と認識系に分けることが出来ます。 いや、どちらでもない研究もたくさんあるんですけど、弊研では学生をそのように二分してグループミーティングを行ったりしています。 合成系は音声合成・声質変換など音声を作ることに関する研究で、認識系は音声認識(音声→テキスト、"OK Google!"みたいな)や話者認識など音声から情報を抽出するタスクを扱うことが多いようです。

認識系の一分野である話者認識(話者識別)は、ある発話音声がどの話者の発話かを推定するというのが基本的なタスクなはずです。 雑音環境下での話者認識や複数話者が同時発話してる状況での話者認識など、話者認識にも様々なタスクがあるみたい。

話者認識のアルゴリズム

i-vector を用いた話者認識をやってみようと思います。音声認識まわりを触ってみるの初めてなので、どきどきです。

参考文献はこれ
"i-vector を用いた話者認識" 小川哲司, 塩田さやか (日本音響学会誌70巻6号(2014), pp.332-339)

ざっと説明すると各発話の音響特徴量を GMM (Gaussian Mixture Model) でモデル化し、GMM のスーパーベクトルを因子分析して各発話の低次元特徴量(これが i-vector)を得ます。 この i-vector に対してコサイン類似度などの距離尺度を用いることで話者識別を行います。実装する余裕は到底ないので、ライブラリを探してきます。

実験条件

声優

女性声優 4 名を適当に(自分や友達の趣味を元に)選びました。

各声優の地声発話データはラジオからとってきました。

キャラクター

上記声優 4 名が演じるキャラクターから選びました。

もっとバリエーションに富んだキャラクターを選びたかったのですが、BGMの無い音声が集められない問題など諸々の理由で妥協しています。
声優ごとのキャラ数や各キャラクターの発話時間もまちまちでとても雑ですが、データ集めるコストが高すぎました。まあやってみた実験ということで...

ライブラリ

使用したライブラリは ALIZE というマイナーオープンソースライブラリ。 認識系の研究をしている先輩に聞いてみましたが知らないとのことでした...ほんとにちゃんと動くのかな。汗

ただ、チュートリアルに i-vector を用いた話者識別があるので、データを差し替えて何も考えずにスクリプトを回してみます(と言いつつそもそもスクリプトが回るまでにだいぶ時間がかかってしまった(汗))。

その他

距離尺度はライブラリに存在するうち一番良さげなやつ(よく理解していないし説明もしたくない)を使います。 ハイパーパラメータはライブラリのデフォルトのまま。 付属してたサンプルデータをUBM の学習に用いたり(全部男性話者!)いろいろガバガバです。

各声優の地声データが 1 発話(無音切り出し・結合して 3 分くらい)、キャラクターの発話も 1 発話です。
要は各キャラ発話の特徴ベクトル(i-vector)が声優 4 人の地声発話の特徴ベクトルのどれに一番近いか、という話。

実験結果

声優の地声発話データで話者識別をやってみると、たまに間違えるけどおおよそちゃんと話者識別ができました。
キャラ発話データを用いた結果は散々でした...誰も彼も東山奈央さんだと識別してしまう...

各キャラクターについて、スコアがよかった声優を順に並べると、

  • 椎名まゆり ( 花澤 ) → 東山、花澤、早見、林原
  • 千石撫子 ( 花澤 ) → 東山、花澤、早見、林原
  • 綾波レイ ( 林原 ) → 早見、 東山、花澤、林原
  • 灰原哀 ( 林原 ) → 花澤、東山、林原、早見
  • 高垣楓 ( 早見 ) → 東山、花澤、林原、早見
  • 金剛 ( 東山 ) → 東山、早見、花澤、林原
  • 川島瑞樹 ( 東山 ) → 東山、花澤、早見、林原

地声データで比較した際の傾向として、

  • 花澤-東山は似ている
  • 花澤-早見は似ていない
  • 東山-早見も似ていない
  • 林原-花澤は比較的似ているが、林原-東山は比較的似ていない

という結果が見られていたのですが、それは上のキャラクター識別でも見られるような見られないような...

感想

ダメ絶対音感よりも「声優の声分布を可視化してみた」の方がお手軽でよかったなあと思いました。笑
予備実験とか追実験をする余裕が無かったためダメ絶対音感やってみたという割に大した結果出なくて残念です。この結果を持って今回の i-vector を用いた話者識別が声優の演技に対して不偏性を持っていないと結論づけるにはデータセットが汚すぎる...

何か悔しいのでもうしばらく話者識別で遊んでみようと思います(ほんとに?w)。

この話の続き
ダメ絶対音感について実験してみた その2

ゲーム制作の反省

経緯

先日、大学の文化祭で企画を展示する機会がありました。 企画の枠組みとしては学科の学術展示の内の 1 つである「AR企画」を展示することになりました。 内容としては、「(家族連れの)子供たちがARを体感できるようなゲーム」を作ろうということになり、1 ヶ月ほどゲーム制作に取り組みました。

結果的に "拡張現実" なんて大層なものを体感できるゲームを制作することはできなかったのですが、画像処理によるプレイヤーからゲームの世界への干渉がキーボードなどのボタン以外で行えるようなゲームを制作しました。 ざっくり言うならば、KinectWiiリモコンみたいな(?)ものです。 ARとは?(笑)となってしまいましたが、子供たちからは「面白かった」「これどーなってるの?」といった感想や、ヘビーリピーターとなる子がいたりと、個人的にはとても満足しました。

以下はこの企画への反省です。

反省

まず、情報工学科の学術展示のAR企画として展示しているのに、実態が子供向けゲームであるというミスマッチがありました。 たくさんの家族連れに来ていただき、1 日で100人以上遊んでいただいたので、とても企画として盛況ではありました。 その一方で、ARに興味を持って来た方もいらっしゃったので、そういう人たちに何か面白いものを見せられなかったのは残念でした。 ARの専門家を名乗るロシア美女が企画に来た時はとても焦りました(笑)(;´Д`)

次に、開発時に後輩に教えながら開発することの難しさがありました。 思ったよりも 1 年の差は大きかったようで、これくらいなら出来るんじゃないか?やってみます!というやりとりの元タスクを投げると、期限になっても進捗が無い、ということが多かったです。 結局、実装より前段階の部分(画像・効果音の用意、パラメータ調整 etc )を主にタスクとして与えたのですが、後輩が仕事を終える→自分が実装する、という流れになってしまい、自分のキャパがパンクしそうになりました。 企画全体での開発の流れをもっと検討すべきだったなぁという感じです。むずかしい。

これも開発時の反省ですが、ゲームエンジンに Unity などを使わず、1 から(主に友人が)書いたのですが、最初に仕様を相談して詰めておかなかったのが、後々影響してきました。 最終的にクラス間の依存関係とかが切り離せなくなり、読みづらいものになってしまいました。 全体で 1 万行程度なのでまだマシでしたが、半年後にはきっと自分でも読めないと思います。(笑)

最後に

作ったゲームの紹介動画(後輩が作ってくれました!)

また、学科の友達と何か作る機会があればいいな、と思います。 次こそ事前準備をしっかりとして臨みたい(毎回言ってる)。