Hatena::Groupnlpyutori

(setf yaruki nil)

2013-05-16

unicodeテキストをkwicするpythonライブラリpykwic作った

17:36 | はてなブックマーク - unicodeテキストをkwicするpythonライブラリpykwic作った - (setf yaruki nil)

suffix array構築するぜ〜的なライブラリは数あれど、unicode文字列を検索したりいろいろするようなライブラリが無いので、せっかくだから作った。富豪的にメモリは一杯あること前提での実装で、mmapとかもしてないけど新聞記事一年分とか突っ込んでもメモリ250MB位だから問題ないよね。手早くやりたいことやるために作ったのでD+ジーに大きく依存しています。

python2.6以上で、3系でも動くかも。

インストール

 pip install pykwic

使い方

基本的に、一行なり一文、一段落を一要素として追加しsuffix arrayを構築します。要素をまたぐような文字列は検索されません。現在は、idなどを保持するようにはなっておらず、単純にkwicのような機能のみを提供しています。

import pykwic

kwic = pykwic.Kwic()
kwic.add_line(u"うなぎうなうなうなぎなう")
kwic.add_line(u"うらにはにわにわとりがいる")
kwic.build()
kwic.save("ファイル名")
kwic.load("ファイル名")

buildを実行すると、suffix arrayが構築され、saveでインデックスを保存することができます。loadも可能です。

searchメソッドでは、検索文字列が存在する場所の前方文脈と、検索文字列を含む後方文脈を取得できます。kwic的な事をするには、以下のような呼出を行えば可能です。

query = u"うな"
for x in kwic.search(query):
    print x[0],query,x[1][len(query):]

せっかくなので、拡張接尾辞配列もサポートしています。

差し当たり、以下のようなコードで二回以上出現する極大部分文字列をその頻度とセットで取り出すことが可能です。

maxmal_substringメソッドはジェネレータになっていて、極大部分文字列を一つずつ取り出すような実装になっています。

kwic = pykwic.EKwic()
kwic.add_line(u"うなぎうなうなうなぎなう")
kwic.add_line(u"うらにはにわにわとりがいる")
kwic.build()

for maxsubst in kwic.maxmal_substring():
    print maxsubst[0],maxsubst[1]

おもちゃのようなコードですが、ちょっとした用例検索などに利用してください。

そのうちpure cythonに直して便利にします。

2013-01-28

colorcorrect: 色恒常性に基づいた自動色補正ライブラリ

13:45 | はてなブックマーク - colorcorrect: 色恒常性に基づいた自動色補正ライブラリ - (setf yaruki nil)

色恒常性モデルに基づいた画像の自動色調整アルゴリズムの複数実装をかなり前から公開していたのですが、一念発起して概要ページを作ったのでここにリンクを張ります。

http://gyazo.argmax.jp/data/2f4cd6529b88f386d533320682b5a126.png

http://argmax.jp/index.php?colorcorrect

古い色あせた写真をスキャンして色を補正したり、光源や光量などの撮影条件がばらついてる画像に適用して画像認識の精度を向上させるなどに用いることができます。

いくつかパラーメタがある手法もありますが、基本的にはパラメータ設定をしなくても補正が可能です。いくつかの手法で試してみて、上手くいかないようであれば、パラメータをいじるなり、複数のアルゴリズムを組み合わせるなどして見てください。全くうまく行かないこともあります。

2012-03-14

音声分析合成はじめの一歩

16:55 | はてなブックマーク - 音声分析合成はじめの一歩 - (setf yaruki nil)

一年程前に開催された@dsk_saito先生のSPTK講習のまとめ。

音声合成の基礎であるヴォコーダー周りを学ぼう。合成フィルタの詳しい話はSPTKのマニュアル等を参照で。3.5系では一部コマンドの仕様が変わっているので、3.4系準拠ということで。

ヴォコーダーは、pitchの系列と素性ベクトルの系列(LPCやMel-cepstrum)を元に音声を合成するもの。

Text to Speechシステムではヴォコーダーに与えるためのピッチ系列とスペクトルに関する素性ベクトル系列の生成はHMMなどで生成するけれど、まずは人間の生の音声から素性ベクトルとピッチ抽出して再合成をしてみる。このピッチ系列と素性ベクトル系列に対しての操作を行うことで、ヴォイスチェンジャーや話者変換を実現することができる。

とりあえずsoxとSPTKを利用して音声分析合成を行う方法をまとめる。音声は16k16bit。SPTKの実行ファイル群は名前が他のプログラムと被っているものがあるので、prefixに/usr/local/SPTKなどを指定してインストールするとよい。

ヴォーカルコードの抽出

f0(ピッチ)の系列を取り出す。

 bcut +s -s 22 test.wav | x2x +sf | frame -l 400 -p 80 | window -l 400 | pitch -s 16 -l 400 -t 4.5 > test.pitch

bcutを使ってwavのヘッダを切る

frame: 音声をフレームに分割 。-lでウィンドウサイズを指定。'-l 400'で400/16000の25ms 。-pでフレーム周期(スライド量)を決める。

音源生成

 excite -p 80 test.pitch|sopr -m 1000 | x2x +fs > pitchsignal.raw

exciteを利用してピッチファイルから音源波形を生成

soprでスカラ演算を実行 (-m 1000 千倍) し、ヴォーカルコードの抽出が完了

形式変換

 sox -t raw -r 16000 -s -2 pitchsignal.raw pitchsignal.wav

soxraw形式に対してwaveヘッダを付与

素性ベクトルを計算しよう

メルケプストラムを抽出

 bcut +s -s 22 test.wav | x2x +sf | frame -l 400 -p 80 | window -l 400 -L 512 | mcep -a 0.42 -m 20 -l 512 > test.mcep

windowに -L 512 をしてるのは、FFTのため。後ろをzero fill して2のべき乗にしている

mcepに-mで20を指定すると、20次元ではなく21次元ベクトルが生成 (0 origineのデータに対して、終端のindexの値を指定するから)

合成処理

 excite -p 80 test.pitch | mlsadf -m 20 -a 0.42 -p 80 test.mcep | clip -y -32000 32000 | x2x +fs > mcepresyn.raw
 sox -t raw -r 16000 -s -2 mcepresyn.raw mcepresyn.wav

ヴォーカルコードとケプストラムを組み合わせて波形の合成処理をする

clipを利用して、short値を超える値をクリッピングしておく。

LPC(線形予測係数)で合成

 bcut +s -s 22 test.wav | x2x +sf | frame -l 400 -p 80 | window -l 400 | lpc -l 400 -m 20 > test.lpc
 excite -p 80 test.pitch | poledf -m 20 -p 80 test.lpc | clip -y -32000 32000 | x2x +fs > lpcresyn.raw
 sox -t raw -r 16000 -s -2 lpcresyn.raw lpcresyn.wav

LSP(線スペクトルペア)で合成

MSなどの音声合成はこれを用いている(音が良いと言われている)

 lpc2lsp -m 20 -n 256 < test.lpc > test.lsp
 excite -p 80 test.pitch | lspdf -m 20 -p 80 test.lsp | clip -y -32000 32000 | x2x +fs > lspresyn.raw
 sox -t raw -r 16000 -s -2 lspresyn.raw lspresyn.wav

メル一般化ケプストラム

 bcut +s -s 22 test.wav | x2x +sf | frame -l 400 -p 80 | window -l 400 -L 512 | mgcep -a 0.42 -m 20 -c 2 -l 512 > test.mgcep
 excite -p 80 test.pitch | mglsadf -m 20 -a 0.42 -p 80 -c 2 test.mgcep | clip -y -32000 32000 | x2x +fs > mgcepresyn.raw
 sox -t raw -r 16000 -s -2 gmcepresyn.raw mgcepresyn.wav

パラメータをいじって音を変化させる。

波形を直接いじると品質の劣化が激しい。しかし、パラメータ情報(f0と素性ベクトル)をいじるとかなり頑健に変換が出来る。

以降はメルケプストラムで実装

ピッチを変える

音源情報のみを変化させる

高くする。

 sopr -m 0.4 test.pitch | excite -p 80 | mlsadf -m 20 -a 0.42 -p 80 test.mcep | clip -y -32000 32000 |x2x +fs > highpitch.raw
 sox -t raw -r 16000 -s -2 highpitch.raw highpitch.wav

低くする。

 sopr -m 2 test.pitch | excite -p 80 | mlsadf -m 20 -a 0.42 -p 80 test.mcep | clip -y -32000 32000 |x2x +fs > lowpitch.raw
 sox -t raw -r 16000 -s -2 lowpitch.raw lowpitch.wav

話速を変える

音源の間隔を変化させる

 sopr -m 1 test.pitch | excite -p 40 | mlsadf -m 20 -a 0.42 -p 40 test.mcep | clip -y -32000 32000 |x2x +fs > fast.raw
 sox -t raw -r 16000 -s -2 fast.raw fast.wav

80フレームごとにシフトしていたものを、無理やり40フレームでシフトしていたものであるとして合成すると、2倍の速度で合成される。

 sopr -m 1 test.pitch | excite -p 160 | mlsadf -m 20 -a 0.42 -p 160 test.mcep | clip -y -32000 32000 |x2x +fs > slow.raw
 sox -t raw -r 16000 -s -2 slow.raw slow.wav

Hoarse Voice

音源を無声化

 sopr -m 0 test.pitch | excite -p 80 | mlsadf -m 20 -a 0.42 -p 80 test.mcep | clip -y -32000 32000 |x2x +fs > hoarse.raw
 sox -t raw -r 16000 -s -2 hoarse.raw hoarse.wav

Robotic Voice

音源を一定にする

 train -p 200 -l -1 | mlsadf -m 20 -a 0.42 -p 80 test.mcep | clip -y -32000 32000 |x2x +fs > robot.raw
 sox -t raw -r 16000 -s -2 robot.raw robot.wav

プロソディックな情報を完全に消した物 -> 昔の音声合成のイメージ

声質を変える

スペクトル自体を伸縮

 sopr -m 0.4 test.pitch | excite -p 80 | mlsadf -m 20 -a 0.1 -p 80 test.mcep | clip -y -32000 32000 |x2x +fs > child.raw
 sox -t raw -r 16000 -s -2 child.raw child.wav

スペクトル包絡を高い方にシフト(アルファパラメータを小さくする) ピッチが高くなる

 sopr -m 2 test.pitch | excite -p 80 | mlsadf -m 20 -a 0.6 -p 80 test.mcep | clip -y -32000 32000 |x2x +fs > deep.raw
 sox -t raw -r 16000 -s -2 deep.raw deep.wav

freqtというsptkのコマンドで同様のことが出来る。

ピッチだけを変化させても綺麗にならない。ヴォーカルトラクト側の情報(スペクトル包絡等)も変化させてより自然な変換が可能に

これをきちんと確率モデルで実現するものが、声質変換、話者適応と呼ばれる物。

uwvoujelbouwvoujelbo2018/08/12 16:16http:/// - .ankor <a href="http:///">.ankor</a>

ovlohudaeovlohudae2018/08/12 16:36http:/// - .ankor <a href="http:///">.ankor</a>

avupebehehavupebeheh2018/08/12 16:48http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

anulifixanulifix2018/08/12 17:02http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

oxagefiqouqooxagefiqouqo2018/08/12 17:08http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

xeaiqepalexeaiqepale2018/08/12 17:45http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

unakijunounakijuno2018/08/12 18:09http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

royutoufroyutouf2018/08/12 18:47http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

imubgiqimubgiq2018/08/12 19:40http:/// - .ankor <a href="http:///">.ankor</a>

eiucobunagoreiucobunagor2018/08/12 20:25http:/// - .ankor <a href="http:///">.ankor</a>

uqitctiumuqitctium2018/08/12 22:56http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

ogajalhoqbogajalhoqb2018/08/13 04:11http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

uduyevauduyeva2018/08/13 04:30http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a>

2012-01-14

Amazon Linux AMIにソースからサックリnumpyとscipyを入れる

07:31 | はてなブックマーク - Amazon Linux AMIにソースからサックリnumpyとscipyを入れる - (setf yaruki nil)

正直numpyとscipyとscikits系とその他pypiライブラリがあれば自分の用途ならRマジいらない感じになってきた。

numpy,scipyを入れるのいつも面倒なんだけど、ubuntumac,suseならそこそこの性能の奴がパッケージ管理システムで入ってくれる。なので基本その環境使っとけって事なんだけど、どうしても他の環境でセットアップしないといけない時のメモ。環境は64bit。ライブラリの指定とかは結構適当かもしれない。

Amazon Linux AMIで例示するけど他の環境でも対して変わらないはず。さすがにatlasぐらいはだいたいパッケージ管理システムで入るはず。

とりあえずまっさらの状態から入れるにはコンパイラ周りから。ついでにemacs

 yum install gcc gcc-c++ make gcc-gfortran swig emacs

お手軽数値計算ライブラリといえばatlas

yum install atlas atlas-devel

GotoBlasあたりをソースから入れるほうがイケてる気はするけどこれでもそこそこ性能はでるのでよしとする。

今時はだいたい疎行列使うよね

SuiteSparseを入れればひと通り入るとさ。

wget http://www.cise.ufl.edu/research/sparse/SuiteSparse/current/SuiteSparse.tar.gz
tar zxf SuiteSparse.tar.gz
cd SuiteSparse

UFconfig/UFconfig.mkを修正

BLAS = -L/usr/lib64/atlas -lcptblas -lgfortran -latlas -lm -lptf77blas -lpthread
LAPACK = -L/usr/lib64/atlas -llapack -latlas -lm -lptf77blas -lpthread

make

make CC=gcc CPLUSPLUS=g++ F77=gfortran CFLAGS="-I../Include -O3 -fno-tree-vectorize -fPIC -fexceptions -m64 -march=native" F77FLAGS="-O3 -fno-tree-vectorize -fPIC -fexceptions -m64 -march=native"
sudo make install

fftwも引っ張る

wget http://www.fftw.org/fftw-3.3.tar.gz
tar zxf fftw-3.3.tar.gz
cd fftw-3.3
./configure
make
sudo make install

バージョンは適当に

pythonまわり

yum install python-devel python-setuptools
easy_install pip
pip install nose

numpy

http://sourceforge.net/projects/numpy/files/NumPy/から最新版のソースをパクッてくる。ここでは1.6.1を対象とする。

wget http:/***/numpy-1.6.1.tar.gz
tar zxf numpy-1.6.1.tar.gz
cd numpy-1.6.1
cp site.cfg.example site.config

site.configの編集

[DEFAULT]
library_dirs = /usr/local/lib:/usr/lib/usr/lib64/atlas
include_dirs = /usr/local/include:/usr/include:/usr/incliude/atlas
[blas_opt]
libraries = ptf77blas, ptcblas, atlas
[lapack_opt]
libraries = lapack, ptf77blas, ptcblas, atlas
[amd]
amd_libs = amd
[umfpack]
umfpack_libs = umfpack
[fftw]
libraries = fftw3

buildしてインストール

python setup.py build
sudo python setup.py install

テスト

python
import numpy
numpy.test()

scipy

numpyが入ればscipyはそのままpipで入る

pip install scipy

テスト

python
import scipy
scipy.test()

意外と楽に入る時代になったものだ。そして0.10.0はなんか疎な対称行列の固有値分解がなんかバグってるっぽいのでさしあたっては0.9系を入れるのがいいかもしれない。

2011-08-30

pysspの紹介

13:40 | はてなブックマーク - pysspの紹介 - (setf yaruki nil)

先日開催されたpyconjpにて、現在個人で作成中の音声信号処理ライブラリpysspに関するLightnig Talkを行いました。SPTKやCLAMよりも手軽な信号処理ライブラリを目指しています。

pyssp
View more presentations from yaruki_nil

ライブラリレポジトリ
インストール方法など

pip install pyssp

インストール可能です。依存しているライブラリに、numpyとscipyがあるので、aptmacportsで先にscipyを入れておくと手軽にインストールが可能だと思います。

scikits.learnもいれておくといろいろ遊べます。