LoginSignup
2
0

More than 5 years have passed since last update.

The Snack Sound Toolkit を Mac OS X 10.9 上の python で使う

Last updated at Posted at 2014-11-06

はじめに

音声に関係する研究者の中でも極一部の人にしか興味はないと思いますが,WaveSurferという音声分析ツールで使われているSnack Sound ToolkitをMac OS X 10.9上のPythonで使おうというときの導入の方法です.

Snackのインストール

Tcl/Tkの導入

SnackはTcl/Tkにバインドされており,Pythondで利用する場合はPythonからTkを介してSnackを叩くという形になります.兎にも角にもTcl/Tkが導入されていないことには話しになりません.
OSX標準でTcl/Tkは入っているはずなのですが,その状態ではソースからのビルドが出来なかったのでHomebrewのtcl-tkパッケージで改めて導入を行います.

% brew tap Homebrew/dupes
% brew install tcl-tk 

PythonをTcl/Tk対応にする

既にPython導入済みであっても,導入時にTcl/Tk対応にしていない場合は再インストールの必要があるようです.

% brew install python --with-brewed-tk

Snackのビルドとインストール

公式サイトからアーカイブをダウンロードして展開します.

ソースコードの修正

まず,generic/jkCanvSpeg.c にビルド時にエラーの原因となる部分があるので修正します.
具体的には39行目付近の

jkCanvSpeg.c
#ifndef Solaris

から始まる TkPutImage の宣言がビルドの邪魔になるようです.
全体をスキップするように以下のように変更します.

jkCanvSpeg.c(変更後)
#if 0

ビルドとインストール

いよいよビルドとインストールです.unixフォルダ内で作業します.

% ./configure --with-tcl=/usr/local/opt/tcl-tk/lib --with-tk=/usr/local/opt/tcl-tk/lib LDFLAGS=-L/usr/local/opt/tcl-tk/lib CPPFLAGS=-I/usr/local/opt/tcl-tk/include --disable-stubs
% make
% make DESTDIR=/usr/local/opt/tcl-tk install

Pythonパッケージのインストール

Pythonパッケージのインストールは至ってシンプルです.pythonフォルダ内で作業します.

% python setup.py install

使い方

基本的には doc フォルダ内にある python-man.html に従って利用します.
ただし,音声の録音や再生はできず,分析に限られると思います(未確認).

初期化

全ての処理を行う前に以下の処理を行います.

from Tkinter import *
root = Tk()

import tkSnack
tkSnack.initializeSnack(root)

Soundオブジェクトの作成と音声ファイルの読み込み

以下の処理でSoundオブジェクトを作成し,データとしてtest.wavの内容を読み込みます.

mysound = tkSnack.Sound()
mysound.read("test.wav")

各種分析

パワースペクトル,対数パワースペクトル

パワースペクトル,対数パワースペクトルをリストとして取得します.
開始位置は start オプションで指定します.窓幅やFFTサイズなどもオプションで指定できるようです.詳細はマニュアルを参照のこと(と言ってもあまり詳しく載っていない).

sp = mysound.powerSpectrum()
lsp = mysound.dBPowerSpectrum()

ピッチ(F0; 基本周波数)

10ミリ秒毎のF0値をタプルとして取得します.
F0が計算できないところでは0が入ります.

f0list = mysound.pitch()

パワー

ピッチ同様10ミリ秒毎のパワー値をタプルとして取得します(単位は不明).

pwlist = mysound.power()

フォルマント

10ミリ秒毎(f0やパワーと出てくる要素数が若干異なるので厳密には違うかも?)のフォルマントの推定値をタプルとして取得します.
要素自体もタプルとなっており,デフォルトでは8つの値を持っています.
マニュアルによると前半の4つがフォルマント位置,後半の4つが各フォルマントの帯域幅を表すそうです.

fmlist = mysound.formant()
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0