やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonでノイズ音を永続的に生成してみた

ストリーミング再生風。

成果物

GitHubPython.Noize.201708271752

実行

$ cd src/
$ python main.py
...
========== Noise Player ==========
[w]hite, [p]ink, brow[n], [b]lue, [v]iolet: 

デフォルトではピンクノイズが再生される。途中で変更可能。

ポイント

  • 各ノイズを生成できる(ホワイト、ピンク、ブラウン、ブルー、バイオレット)
  • 再生中でもCUI入力を受け付ける。入力して数秒後、入力したノイズ音に切り替わる(マルチスレッド)

色々やってみた

ファイル 概要
main.py ノイズを再生しつつ、ノイズ色を指定できる。スレッドを正常終了できない。
main_loop.py 無限ループ版
main_async.py 非同期版(音が汚く正常に再生されない)
main_callback.py.py コールバック版
main_callback_async.py asyncを使ってみた。思い通りに動かない。
main_callback_class.py コードを整えた。
main_callback_thread.py スレッドを使うことで音声再生と入力受付を並列できそう。
main_callback_thread_2.py 音声再生と入力受付を並列できたが正常終了できない。Pythonスレッドの仕様。これはひどい

わからないことだらけなので試行錯誤しまくった。

問題

  • スレッドが正常終了できない
    • Pythonスレッドの仕様らしい……。どうすればいいのか……
  • ノイズ音データ生成箇所でMemoryErrorになる
    • 音声データの配列データを[start:end]で区切って生成しようとするとMemoryErrorが発生する
      • なぜかfor文で1データずつ生成するとエラーにならない。コード的にカッコ悪いが仕方ない

私の知識と技術では手のうちようがない。

課題

  • ノイズ音データは2秒間分生成しているが、その切れ目が気になる。とくにbrown

少ないメモリでやりくりするため2秒間ごとに新規生成している。切れ目をスムーズにしたいのだが、どうすればいいかわからない。

  • 入力してから音が切り替わるまでのタイムラグが大きい

蓄えているデータを使いきるまでは前の音データを再生する仕組みだから。工夫すれば解決できそうだが、面倒そうなので放置。

所感

問題や課題がとても気になる。それに目をつぶれば、やりたいことは大体できた。あとはストリーミング再生用サーバでも作れたらいいかも。