shingoushori's dialy

音信号処理を専ら研究していた元博士後期課程の学生によるメモ

Pythonで音信号処理する環境づくり on Mac のメモ

<経緯>
メインPCがMacです。
Pythonで音信号処理する環境づくりをやりました。
恥ずかしいことに、これまで何度も挑戦しては挫折してました。
今回は今の所すんなり綺麗にできているので、メモをば。

<Python本体>
まずバージョン。Python2, Python3 をそれぞれ入れて適宜切り替えることに。
どうせ、どちらかだけでは済まないんだから。
今回は、以下の並びで入れてみた。

Mac -> Homebrew -> pyenv+virtualenv -> Anaconda

以下、参考にしたサイトです。

HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ - Qiita

データサイエンティストを目指す人のpython環境構築 2016 - Qiita

Macでpyenv+virtualenv - Qiita

<音信号処理の一歩二歩>
とりあえず、WAVファイルの読み書きに、FFT から。
色々なモジュールでもってやれそうです。

pythonでwavファイルを扱う108の方法 - (wrist blog)


とりあえず、scipyを使ってそうなサンプルを下地にあれこれします。
scipyだとフィルタ設計関数が色々あるらしいので。

以下、サンプルを動かしてみたサイトです。

Pythonで音の高速フーリエ変換(FFT)

Pythonで短時間フーリエ変換(STFT)と逆変換 - 音楽プログラミングの超入門(仮)

高速フーリエ変換(FFT) - 人工知能に関する断創録

Pythonで音響信号処理 - Qiita

デジタルネイティブ

雑談です。

"デジタルネイティブ" って言葉を目にしませんか。
この言葉に徐々に違和感が膨らんでおります。
ついぞ先日、ぽろっと言語化に至りました。
ゆえに、ここで雑談です。

... 結論としては、
"デジタルネイティブってITであってデジタルじゃないよね"
"デジタルの方のレベルを引き上げたほうがいいんじゃないの"
です。

つまり、
情報理論を意識した意思疎通を図ろうよ!
音信号のディジタル信号処理、もっと流行れよ!
ってことです。うん。

 

<どこで目にするのよ?>

わたしが目にするデジタルネイティブは、... まあ2つ。
1. 出身大学
「ディジタル・ネイティブ世代の国立大学法人電気通信大学 UEC TOKYO」
http://www.megrokai.or.jp/megurokai/kaihou/kiji/kiji221/shinsei_uec.html

2. テレビ というより たぶん某現代の魔法使い先生

 

<定義?>

wikipedia先生に頼ります。
https://ja.wikipedia.org/wiki/デジタルネイティブ

"学生時代からインターネットやパソコンのある生活環境の中で育ってきた世代"
インターネットの有無でパソコンの意味が大きく異なりそうですけども、
まあ IT ですよねこれ。

"日本では1980年前後生まれ以降"
思ったより範囲が広いですね、わたしもズブズブにデジタルネイティブ

アメリカの”教育分野における作家”が2001年に定義した呼称であると。

日本における世代の議論が載っています。

・76世代 パソコンによるインターネット利用が中心
・86世代 携帯電話によるインターネット利用
・96世代 様々な携帯通信機器を利用して動画コンテンツを視聴するとともに、クラウド環境での集合知(衆合知)を活用 「ネオ・デジタルネイティブ

・「デジタル・ネイティブ第1世代」物心ついた頃から ... 検索サービスに触れてきた世代
・「デジタル・ネイティブ第2世代」ソーシャル・メディアやクラウドコンピューティングを使いこなし青年期を過ごした世代

うむ、ひたすらIT。

 

<違和感>

やっぱり、IT。インフォメーションテクノロジー。

まず、デジタルが議論の先頭に来ないことへの違和感。
デジタルとアナログの違いへの意識がないのをネイティブとしているのかしら?
違うんじゃないか。ネイティブへのイメージは、穿ったイメージだけど、「つかいこなしていてすごいね〜」くらいの放任、傍観だと思う。
デジタル信号処理って、何をどう諦めるかの作業だと思う。実は万能でもなんでもないわけで。
そのあたりのデジタルな感覚ぅ?わびさびぃ? ... が、わたしは好きなんで、
そっちの議論をしてくれるといいな。

次に、IT。インフォメーションテクノロジーについても、
情報理論というより、単にインターネットだよなと感じるわけです。
インターネットがなくたって、デジタル機器がなくたって、
実のところ私たちの時間感覚ってデジタルだったと思うのです。
夜や食事なんかで、私たちの時間はいつだって断続的ですよね。
付き合っている人だって、立場だって、パタパタと切り替わる。
時間感覚がデジタルなら、そこから得られる情報も、ずっとデジタルだったんです。
いつだって、デジタル。なんだって、デジタル。
で、ITとしてデジタルさがブーストされた。ただそれだけで、なにも変わっていない。
その上で、ブーストできている下地を知ることが生活や文化の水準を守るために必要であると。たとえばそれは、情報理論とか信号処理であるわけです。

それは難しいことでもなくて、
単に "全てを知ることはできない"とか、
”どうしても曖昧さが残る”、”別の視点に立つと見え方が変わる”とか、
そんなことを意識することがもっと大事なんじゃないかと思います。

ちょっと優しくなれそうじゃないですか?
優しくしてもらえそうじゃないですか?

 

とかく人工知能あたりで技術を物騒にみていたり、
研究者技術者〜をまるで血の通わない薄情で肉体のない冷徹で...
まるで人類の敵の親みたいな目で見られているように感じて、
生き辛いですけれども。
少なくともわたしは、ずいぶんほんわかとした未来に憧れて工学してます。
だから ... もうちょっと生きやすくなるといいなー。

元博士後期課程の学生

そういえば、ブログの設定も更新していませんでした。
下記のように更新してみました。

旧:音信号処理を専ら研究している博士後期課程の学生によるメモ
新:音信号処理を専ら研究していた元博士後期課程の学生によるメモ

2016年3月に博士(工学)が取れたんです、はい、電気通信大学で。
"元博士後期課程の学生"の方がそれらしいので、そのようにします。

これだと文の構造が取りにくい悪い文ですけれども。

音信号処理にも研究職にもこだわりませんでした。
とはいえ、研究意欲は湧いてしまいますので、
捌け口として気ままにここに出していきます。

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、... + 残差信号(簡易)

今回は、前回の記事↓に残差信号を追加してみました。ただし、簡易。

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、とりあえず最大16バンド - shingoushori's dialy

gが、the sliding Goertzel DFT filterでパラメータを表示しているバンドのゲイン一括変更。
g_Residualが、残差信号のゲイン。

 

残差信号を作るべく、the sliding Goertzel DFT filter の各ノードに並列でノードを用意しています。
位相特性をきちんと揃えないと、今回のように残差信号でアタックが分離しますな。
今回は簡単に、遅延を差し込んでいます。遅延量も手探り、アテが外れたため。

ところがどうも、パフォーマンスによって遅延量がブレているようです。
このあたりは、Web Audio API の限界なのかもしれません。
ちゃんとオールパスフィルタを配しても、常にはうまくいかない悪寒がします。

さあ、どうしたものか。

Simutransで, "日本の役場セット"の問題を無理やり直す

<欲望>
筆者は, 鉄道経営シミュレーションが好きである.
Simutrans(http://japanese.simutrans.com)は, 素晴らしい.

"日本の役場セット" ( アドオン/建物2 - Simutrans日本語化・解説 ) は, 
なかなかニヤける.
しかし, 一番大きい庁舎(building.05_CITY.pak)に変わった後に, 一段階小さい庁舎(building.04_CITY.pak)に建て戻しされるという悲しい問題がある.

筆者の使っているバージョンは古く(pak64 112.3), 気がついたら新しいバージョンでは治っていそうだ. ただし, 新しいバージョンでは筆者の使っているバージョンのデータが開けず, もっと悲しい...

そこで, 古いバージョン(pak64 112.3)を延命すべく, 無理やりにでも弄れるようになりたいと思っておるわけです...

 

<原因の所見>

一番大きい庁舎(building.05_CITY.pak)と一段階小さい庁舎(building.04_CITY.pak)とで, 
建て替え判定に用いられていると思われる人口の数字が逆転している.
前者が34464人, 後者が50000人だと思う.

 

<無理やり直し手法>

バイナリエディタで, 該当箇所を書き換える.

pakを作り直せればよいのですが, 筆者はmacがメインであったりなんなりでそれが難しかったのです...
バイナリエディタには 0xED ( http://www.suavetech.com/0xed/0xed.html ) を使いました.

該当箇所は, 0すたーとの16進数で 00053 ~ 00056 byte までの 4 byte だと思われます.
ここの数字が先述の 34464 (A0 86 00 00), 50000 (50 C3 00 00) だったわけです.

そして, この数字を弄ることで, 無事問題を回避することに成功しました.

 

<発展>

さらに発展した使い方として, ここの数字を 0 (00 00 00 00) にしたものを用意し, 適宜置き換えるというのを考えました.

元々の問題を逆手に取り ... 建て替え判定をバカにしてしまうことで, 建て替えを手動で制御できます.

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、とりあえず最大16バンド

今回は、以下の記事の流れをマージしてみたというわけです。

マージするにあたってあれこれ書き換えた結果、
これまでuploadしていたjsdo.itだと動かない、示されたerrorを全部直しても動かない。

仕方がないので、今回は新たにCodePenなるサイトを導入してみました。
調べたページ : 

www.webcreatorbox.com


それでも、Firefoxでしか動かない。
元々のhtmlファイルではSafariでもChromeでも動いたので、困惑しています。

とりあえず最大16バンドとして、fとrとgを変えれるようにしました。
変数Bでバンド数を指定します。ただし、html上に作るフォームの数だけを変えます。
nodeの抜き差しは、また今度。

fとrについて、2系統フォームがでます。
これらの使い方次第で、
1.パラメータの設定方法が多様になる、
2.イレギュラーなパラメータ設定を楽しめる、ようになります。

上段にBと並んでいるfとrは、回路全体のデフォルトの値とでも言いましょう。
設定すると、下段のfとrを一挙に上書きします。
fについては、fを初項とするDFTの中心周波数の刻み
(今回は サンプリング周波数 Fs : 44100, DFT点数 : 1024で, 43.06640625 Hz)で、
等差数列にします。

下段のfとrとgについては、各バンドごとの個別の設定です。
フォームが作られていないバンドについては、gが0で無音化しています。

ここで、下段でいう各バンド個別というのは、
the sliding Goertzel DFT filter の2段構えのフィルタのうち、
後段の極を作る方のみです。
前段の零点を単位円上に等間隔で配置するフィルタは全バンドで共有させている都合、
後段に連動させるのが億劫だったために、このような構成になりました。

これによって、極と零点の位置がずれている
不完全なthe sliding Goertzel DFT filterを楽しめるわけです。

フィルタの特性を確認していないですけども、
耳で聞く分には個人的には中々気に入っています。

Web Speech API の Speech synthesis を試してみた

Web Speech API というものがあるんですね。
とりあえず google chrome, firefox, safari で動き、
Internet Explorerでは動かない、edgeでは対応検討中...だそうです。

Speech synthesis , Speech recognition があるらしい。
とりあえず 今回はsynthesisしてみました。

ただ読み上げるだけでは参考文献そのもので残念なので、
前回の記事の流れで複数のフォームを次々に読み上げるようにしてみました。

簡単、手軽で素敵です。

しかし、Web Audio API とは全然別物らしく、全然繋がらないんだとか。
似ている名前をしているのに、なんとも嘆かわしい ...
なんとかできないか検討していく所存でございます ...

 

<参考文献>

ブラウザのみで音声認識とテキスト読み上げを実現する Web Speech API | CYOKODOG

 

lealog.hateblo.jp