投稿

2017の投稿を表示しています

MATLAB版WORLD を GNU Octave で使う

イメージ
音声分析合成システム  WORLD  を GNU Octave 上で動かしてみる。 WORLDにはC++版とMATLAB版がある。ふと思い立って試作するには、C++ よりも MATLAB のほうがはるかにラクだ。しかし MATLAB は高価なので、個人で手を出すのは難しい。そこで MATLAB 互換のオープンソースソフトウェア Octave を使うことにした。 この記事では MATLAB版WORLD を Octave で動かすときの注意点と、WORLD で声をこねくりまわして遊ぶためのメモを書き連ねていく。 注 : この記事のとおりにOctaveで動作させると、 C++版や本物のMATLABで実行したときと結果が一致しない (原因はおそらくビルトイン関数の結果が微妙に異なるため)。一応それらしい結果になるし、単に「動いたら面白いな」という程度なので、ここでは問題ないと考えて割り切っている。正しい結果が必要なときは Julia  の  WORLD.jl パッケージ  を利用したほうがよいとおもう。 WORLD の使い方は、おもに森勢先生の公演スライドとPDF資料をベースにしている(URLを記事の最後に載せてある)。とてもわかりやすい資料なので、目を通しておくべし。 環境 Windows 10 (x64) GNU Octave  4.2.1 WORLD  v0.2.1_4 (Matlab) WORLD を使う準備 Matlab版WORLD  のZIPファイルをダウンロードして解凍しておく。 基本的に Octave は MATLAB 互換なので、普通はこのまま動作できる。 ところが、Octave には実装されていないMATLABの関数が存在する。 今回使った WORLD v0.2.1_4 (Matlab) で使われている rng関数 と interp1q関数 は、現時点では Octave に実装されていない。 というわけで、埋めあわせ用の関数を用意した。 rng.m function rng(x) randn('seed', x) rand('seed', x) end interp1q.m function yi = interp1q(x, y, xi)

自分のツイートを word2vec で学習させて遊ぶ

イメージ
全ツイートの内容を word2vec に放り込んで遊んだ。 数年前から word2vec はスゴいらしいという話を聞いていたが、なんとなくスルーしていた。 Python の gensim パッケージで手軽に word2vec を使えるようなので、試してみた。 今回使った環境 Windows 10 (64bit) Python 3.6.0 (Anaconda 4.3.0) MeCab 0.996 word2vec は、2014年に Google で開発された自然言語処理の手法。比較的計算量が少ないところが特徴らしい。 ざっくりとした流れ word2vec という名前の由来は、おそらく "word to vector" の略だと思う(出典はない)。単語 (word) からベクトル (vector) を学習する。 word2vec は、大量の文章を渡されると、単語の前後関係から、各単語をよく表すn次元のベクトルを学習する。 一見すると機械的な方法だが、なぜか単語どうしの意味的な関連性まで学習できてしまう(ことがある)らしい。 ベクトルの次元数 n は、自由に設定できる。ネット上のサンプルを見ていると n=100 くらいに設定していることが多かった。 細かい話 学習には2層のニューラルネットワーク (入力層、隠れ層、出力層からなる。ふつう出力層はカウントしないので2層といっている) を使っているらしい。意外と少ない! 学習時の「前後の単語を見る」処理として、 CBOW (Continuous Bag-of-words) と skip-gram の2種類が提案されている。どちらを使うかによって、NNの構造がすこし異なる。 Python の gensim パッケージではどちらも使えるが、今回は性能が良いらしい skip-gram を使うことにする。 参考: Word2vec - Wikipedia 絵で理解するWord2vecの仕組み 【論文シリーズ】CBOWとSkip-gramについて データの準備 さて、word2vec の学習には、大きめの文章データが必要となる。 なにか良さそうなものはないかと考えて、約12万ツイートある  mogesystem の投稿内容を使う