投稿

自分のツイートを 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 の投稿内容を使う...

MSYS2 の設定メモ

個人的な設定のメモ。 何年も  元祖MinGW  を使ってきたが、64ビットのバイナリを出力したくなったので  MSYS2 を導入した。 1. 導入 msys2.github.io からダウンロードした最新のインストーラ(執筆時点では msys2-x86_64-20160205.exe )を実行する。 デフォルトでは、MSYS2一式は C:\msys64\* にインストールされる。 msys2-shell.bat を開く (古いMSYS2ではシェルの初回起動時に各種設定をしていたようだが、新しいインストーラでは自動でやってくれるっぽい。) パッケージマネージャ pacman を更新する 最新版を導入した直後であれば、おこなう必要はない。 pacman -Sy pacman このコマンドの実行が終わったら、更新を反映させるために一旦MSYS2を閉じて、また起動する。 インストール済みのパッケージを更新する こちらは最新版をインストールした直後でも、あとからアップデートされていることがあるのでやっておく。 pacman -Syu これでひととおり最新の状態になった。 2. mintty の設定をいじる 元祖 MinGW とは異なり、MSYS2 は mintty というターミナルエミュレータ上で動いている。 コマンドプロンプトと比べて細かなカスタマイズができるので、いろいろ触ってみるとおもしろい。 デフォルトのフォントは Consolas に設定されている。 当初は Inconsolata に日本語表示用の MeiryoKe をフォントリンクしたものを使っていた(参考: Windowsで最高のターミナルを構築する方法 )。 しかし、個人的には統一感がないように見えてあまり気に入らなかったので、最近は VLゴシック に設定している。 mintty のウィンドウを右クリックして Options... を開くと、設定ウィンドウが出てくる。 フォントは Text タブで変更できる。 また、Looks タブ → Transparency=Low に設定している(ちょっと背景が透けてカッチョよくなる)。 3. 開発系パッケージを追加する MSYS2 の初期状態は、必要最低限のシ...

PortAudio を VS2010 Express でビルドする

PortAudio を Visual C++ から利用しようと思ったのだが、導入に手こずってはまりかけた。 環境: Windows 8.1 (x64), Visual Studio 2010 Express, CMake 3.2.2 使ったソースは pa_stable_v19_20140130.tgz。 このなかにある build/msvc 以下のファイルは、VS2010で開くとプロジェクト変換に失敗してしまう。 検索してみると VS2008 ならうまくプロジェクト変換できるという情報( PortAudioでリアルタイム入出力制御 (1) )もあったが、今回のPortAudioのためだけに環境を構築しなおすのはあまりにも面倒くさすぎるので試さなかった。 最終的には、CMake を使ってVisualStudioプロジェクトを生成したところ、うまくビルドできた。 詳しいことはPortAudioのCMakeに関するドキュメント( Creating MSVC Build Files via CMake )に書いてある。 以下にざっくりと手順を書いておく。 CMake 2.8以降をインストール する。 PortAudio から ASIO を利用したい場合は ASIOSDK をダウンロード 。フォルダ名を「ASIOSDK2.3」から「ASIOSDK」にして src/hostapi/asio にコピーする。 CMake GUI を起動 。「Where is the source code」には CMakeLists.txt があるディレクトリ、「Where to build the binaries」にはVS2010プロジェクトを作るディレクトリを指定する。 「Configure」をクリック 。ドロップボックスからVisualC++のバージョンを選ぶ。 必要に応じて PA_USE_ASIO などのオプションをいじる(オプションを変更する場合、再度Configureする必要がある)。 「Generate」をクリック 。指定ディレクトリにVC++プロジェクトが生成される。 いままでほとんどCMakeを使ってこなかったけれど、思った以上に便利で感動した。

謹賀新年

あけましておめでとうございます しばらく更新が途絶えてしまいましたが生きております! 気づけば MOGESYSTEM HP も5年目。早いものだなあ。 本年もよろしくお願いいたします。

基本波形の生成

イメージ
オーディオやマルチメディア関連のプログラムを書いていると、手早くノコギリ波や矩形波を生成したいことがある。 そこで、簡単にいろいろな波形を生成する方法をまとめる。 1. ノコギリ波 1サンプルごとに少しずつ値を足していくと、直線的に増加していく波形ができる。 値が 1.0 を超えた瞬間に 0.0 へ戻すことで、ノコギリ状の周期波形が生成できる。 これは、値の小数点以下のみを取り出すことで実装できる。 実装してみる。 以下のコードでは、オーディオ信号として扱いやすいよう出力値の範囲を 0〜1 から -1〜1 へ変換している。 double sawtooth(double 周波数, double サンプルレート) { static double phase = 0.0; // 初期値 phase += 周波数 / サンプルレート; phase -= floor(phase); // 整数部分を引き算 return 2.0 * (phase - 0.5); // -1.0~1.0 の範囲に広げる } 「小数点以下を取り出す」を「1.0で割ったときの剰余」として実装する方法もある。 double another_sawtooth(double 周波数, double サンプルレート) { static double phase = 0.0; // 初期値 phase += 周波数 / サンプルレート; phase = fmod(phase, 1.0); // 小数部分を取り出す return 2.0 * (phase - 0.5); // -1.0~1.0 の範囲に広げる } プログラミング言語によっては(C# など)、浮動小数点数(float や double)に対して剰余演算子 % が使えるので、この実装方法のほうがシンプルに書ける。 2. 矩形波 ノコギリ波が 0.5 を超えたら 1.0、超えなければ -1.0 を出力する。 条件を「0.75 を超えたら 1.0 を出力」に変えれば、デューティ比25%の矩形波になる。 double pulse(double 周波数, double サンプルレート) { static double phase =...

アセンブラでWin32APIを使ってみる(MessageBox編)

RubyやPython、JavaScriptのような高級なプログラミング言語が浸透してだいぶ経ちました。 たくさんの便利なライブラリが整っていますし、少ないコード量で面倒な処理ができるところが魅力的です。 とはいえ、こういった言語ばかり触っていると低水準な言語でゴリゴリと書きたくなってきませんか?ほら、なってきましたね。 そんなわけで、もっとも低水準なプログラミング環境といえるであろう アセンブラでWin32APIを使ったアプリケーション を作ります。 今回使うツールは以下の通り。 NASM (アセンブラ) -  http://sourceforge.net/projects/nasm/ ALINK (リンカ) -  http://alink.sourceforge.net/download.html ちなみに最初はMASMを使おうと思ったのですが、Microsoft純正だけありWin32APIのサポートがしっかりされていてつまらないので、今回はNASMを使って縛りプレイをしてみます。 ALINKは。 上記のALINKのサイトの 「Download my Win32 Import library(win32.lib)」 からALINK用のWin32APIライブラリをダウンロードしておきます。 NASM、ALINK、win32.libは同じフォルダに入れてソースコードと同じフォルダに置きます。 まずはお決まりの Hello world を作ってみます。 ウィンドウ表示をすると複雑になるので、MessageBox関数で表示させることにします。 以下のようなプログラムを test.asm などのファイル名で保存します。 bits 32 extern MessageBoxA extern ExitProcess section .text global winmain winmain: push dword 0 push dword title push dword string push dword 0 call MessageBoxA push dword 0 call ExitProcess ret section .data ti...

(2)C言語で音声合成もどき ~母音の生成~

イメージ
この記事は素人が音声合成で遊んでいるだけの記事です。完全に行き当たりばったりなので、紹介している内容の保証はできません。また、記事の内容を予告なく変更することがあります。 生成した「お」の波形 今回は本題の音声合成に移っていきます。 前回 は波形データをWAVファイルに書き出す部分を作ったので、ここからはさっそく母音の合成をしていきます。 ざっくりいうと人間の声は、 声帯 で基となる音がつくられ、 声道 で加工されたものです。 今回のプログラムは、この「声帯→声道」という構成を参考にして音声を合成していきます。 まずは、声帯にあたる部分から実装することにします。 声帯が振動すると、周期的な波が発生します。 つまり、なんらかの周期的な波を使えば模倣できそうです。 一般的なシンセサイザーのようにノコギリ波や三角波を使うこともできますが、ここでは声帯振動の波を模倣した Rosenberg波 とよばれる波形を使います。 以下がRosenberg波の式です。 出典: https://dspace.jaist.ac.jp/.../896paper.pdf のP14 (2.1)、一部式の変形・表記変更あり τ1は 声門開大期 *1 の長さ 、τ2は 声門閉小期 *2 の長さ を表します。 *1 声門開大期……声門が閉じた状態から開ききるまでの時間 *2 声門閉小期…… 声門が開いた状態から閉じきるまでの時間 これらの値は、τ1 + τ2 が 0〜1 の範囲におさまるように決めます。 今回は  τ1 = 0.90, τ2 = 0.05 としました。 Cで書くとこんな感じです。 double GenRosenberg(double freq) { /* Rosenberg波を生成 */ static double t = 0; double tau = 0.90; /* 声門開大期 */ double tau2 = 0.05; /* 声門閉小期 */ double sample = 0.0; t += freq / (double)サンプリング周波数; t -= floor(t); if (t <= tau) { ...

(1)C言語で音声合成もどき ~WAVファイルを生成する~

この記事は素人が音声合成で遊んでいるだけの記事です。完全に行き当たりばったりなので、紹介している内容の保証はできません。 また、記事の内容を予告なく変更することがあります。 「C言語で音声合成もどき」ということで、このシリーズではフォルマント合成と呼ばれる手法を使った音声合成プログラムをC言語で作っていきます。 本題の音声合成に入る前に、まずは肩慣らしとして 音声ファイルを作るプログラム をつくります。 今回は  8bit, 44100Hz, 1ch  の WAV形式 のファイルを作成するプログラムを書いてみます。 ( この記事では、比較的実装が簡単なWAV形式を扱います。 ひょっとするとMP3形式等のほうが馴染み深いかもしれませんが、MP3ではデータ圧縮にやや複雑なアルゴリズムを使うことになります。) なお、WAVファイルの構造については WAVファイルフォーマット WAVE file format を参考にしました。

最初の記事

このたびブログをJUGEMからBloggerへ移転しました。 今のところJUGEMのほうを消す予定はありませんが、完全に放置状態となります。 前ブログ( http://moge32.jugem.jp/ )と同様、プログラミングの話題が中心となると思います。 更新頻度は少ないとは思いますが、引き続きよろしくお願いします。