pythonで音声を再生するのこと
pythonで音楽を再生したくなったので、やり方を調べてみた。
まずあたったのが、pyAudioというライブラリ。
PyAudio: PortAudio v19 Python Bindings
ページにはpipで入れよと書いてあったけど、
ubuntuならapt-getでもインストールできる。
sudo apt-get install python-pyaudio
けれども、ライブラリのサンプルを眺めてみると
どうやらこれはwave再生のようで、MP3が再生できるかはわからない。
コードを書いて調べるのも面倒だったので、
次に行くことにした。
MP3が再生できそうなライブラリにpygameが当たった。
ダウンロード&リファレンスサイト
http://pygame.org/download.shtml
その日本語訳。
pygame - Pygameドキュメント 日本語訳
これもapt-getでインストールできる。
sudo apt-get install python-pygame
ゲーム制作用のライブラリのようだが、
それなら当然、音声再生もできる。
というわけでこれを使ってみることにした。
音の出し方は意外と簡単だった。
import pygame import time if __name__ == '__main__': # ライブラリの初期化 pygame.mixer.init() # MP3ファイルのロード pygame.mixer.music.load(u"MP3ファイルパス") # 再生回数の指定。-1ならリピート pygame.mixer.music.play(1) # 音楽再生の間、スレッドを止めるためにスリープ。 # これでは中断のために割り込みとかできないから、 # 本当に使うときは色々と作りこみをする必要がある。 time.sleep(300) # 再生の停止。 pygame.mixer.music.stop()
これはストリーム再生なので起動も早く、負荷も少ない。
ただし、音声ファイルの再生時間が取得できない。
ストリーム故にバッファに読み込んだデータの再生時間は取得できるが。。。
とはいえ、waitする時間の根拠値としても、音声の再生時間はどうしても取得したい。
なんとかならないかと探してみた。
mutagenというライブラリでMP3の再生時間が取得できるらしい。
インストールはやはりapt-getでいける。
sudo apt-get install python-mutagen
使い方は簡単で、ファイルを読み込んで該当のプロパティを叩けばいい。
import mutagen.MP3 sound = mutagen.MP3(u"MP3ファイルパス") print sound.info.length
といわけで、これらのライブラリを使うことでMP3の再生はできた。
いやぁ、楽しいなぁ、こういうの。
pythonでポップアップ通知を表示するのこと。
NASAの科学者によると、
30分に1回立ち上がると老化防止になるそうな。
本当かなと思いながら"試してガッテン"を見ていた。
こういうのに乗せられやすい性質なので、
PCが起動している間、30分に1回ポップアップ通知を出すプログラムでも作ってみようと思い、
実装方法を調べてみた。
(まぁ、タイマーなんて腐るほどあるんだろうけれど、なんでも勉強なので)
pythonでポップアップ通知を出す方法については、下記の記事が参考になった。
http://kyoui3350.blog96.fc2.com/blog-entry-258.html
上のサイトにもあるように、下のロジックで通知表示できる。
import pynotify pynotify.init(u"application name") n = pynotify.Notification(u"title", u"message") n.show()
けれども、これには落とし穴があった。
自分が試したところでは、
wxPythonのApplicationクラスと併用しようとするとエラーになる。
さらに調べた結果、notify2というライブラリがあるので、
結局、こっちの方を使うことにした。
インストールはapt-getからインストールできる。
sudo apt-get install python-notify2
で、使い方についてはpynotifyと全く同じ。
インポートするライブラリだけが異なる。
import notify2 notify2.init(u"application name") n = notify2.Notification(u"title", u"message") n.show()
と、まぁ、こんな感じでした。
アプリ?
その後、ちゃんと作りましたとも。
.profileを再読み込みするのこと
知らなかったのでメモを残しておく。
.profileを変更した場合、ログアウト等をせずに再読込したい場合、
下記のコマンドで再読み込みができる。
source ~/.profile
参考文献はここ。
qiita.com
Ubuntu 16.04での市販DVDの再生について
VLCをインストールするだけではDVDメディアの再生ができないので、
なにかインストールする必要があるのは知っていたのだが、
15.04以前と15.10以降では手順が異なるのは知らなかった。
RestrictedFormats/PlayingDVDs - Community Help Wiki
以下に16.04で行った手順をメモしておく。
sudo apt-get install libdvd-pkg
sudo dpkg-reconfigure libdvd-pkg
2つ目のコマンドは1つ目を実行した際に、
"dpkgがロックされているので後で実行すること"と
注意が表示されたので実行した。
正式な手順があってよかった。
pythonでのunicode型とstr型の扱いについて
pythonianな人には当たり前かもしれないが。
ファイルの読み書きでunicode文字とstr文字の絡みで、
すんなりロジック書けなくて、ここしばらく悩んでた。
ファイルを書き込む際に日本語が混ざってると発生するUnicodeEncodeError。
このページとか、
PythonのUnicodeEncodeErrorを知る - HDEラボ
このぺーじとか
Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法
読んでみてわかったような、わからんような。
なんとなく頭に入ったのは、
- リテラルはとりあえずunicode型にしておく、
- 日本語を含むファイルを読み書きするなら、open()ではなく、codecs.open()を使っておけ
- ロケールのエンコードを取るにはlocale.getpreferredencoding()を使え
import locale import codecs enc = locale.getpreferredencoding() with codecs.open(u"aaa.txt", u"r", enc) as file: for line in file: ・・・
対処療法的で全く内容を理解していないのが、やばい。
Marcoでworkspace毎に背景を変える方法のこと
ウィンドウマネージャの話です。
workspace毎に背景を変えたかった。
Compizを使えばできるけど、ヤツはあまり好みではないので、
Marcoでできないかと色々調べてみるものの、
ツールのたぐいは拾えなかった。
古い話で"Wallpapoz"なんかが出てきたけれど、
今のバージョンではそのままは動かなそう。
たまたま、Ubuntu MATE コミュニティでこんな記事を拾った。
ここにLinux Mint 17 Mateで動いたよっていうスクリプトがあったので、
参考までにダンロードして読んでみた。
仕掛けとしては2点。
- xpropコマンドでworkspace切り替え時のイベントを拾う。
- gsettingsコマンドを使って背景設定のプロパティ"org.mate.background"の"picture-filename"値を書き換える。
そのスクリプトを参考にWorkspace1〜Workspace4に切り替えると
背景が変わるスクリプトを書いてみた。(というよりパクリや)
#!/bin/bash # Script to change the desktop image when switching workspaces. # Tested on Ubuntu MATE 16.04 IMG0=/usr/share/backgrounds/mate/abstract/Flow.png IMG1=/usr/share/backgrounds/mate/abstract/Silk.png IMG2=/usr/share/backgrounds/mate/abstract/Spring.png IMG3=/usr/share/backgrounds/mate/abstract/Waves.png IMGBG=${IMG0} xprop -root -spy _NET_CURRENT_DESKTOP | ( while read -r; do DESK=${REPLY:${#REPLY}-1:1} if [ "$DESK" == "0" ]; then IMGBG=${IMG0} elif [ "$DESK" == "1" ]; then IMGBG=${IMG1} elif [ "$DESK" == "2" ]; then IMGBG=${IMG2} elif [ "$DESK" == "3" ]; then IMGBG=${IMG3} else IMGBG=${IMG0} fi gsettings set org.mate.background picture-filename ${IMGBG} done )
パスはハードコードだし、シェルとしてはいまいちかもしれないけれど、
自動起動アプリケーションに登録しておけば、
workspaceを切り替えると背景も変わることが確認できた。
あとは、画像選択とかをGUIからできるようにpythonあたりで組めば、
使い勝手は良くなるか。
エッセンスは確認できたので、今日はこれまで。
wxPythonをPython3で使えるようにするのこと
Ubuntu 16.04ではwxPythonはpython-wxgtk3.0の名でapt-getから標準でインストールできる。
ただし、これはpython2でしか使えない。
そもそもwxPythonはpython2用らしい。
だけれど、昨今の流れから、そろそろpython3へ移行すべきであり、
wxPythonを使って作った自作アプリも練習を兼ねてpython3化したい。
というわけで、まずは、wxPythonをpython3で使う方法を探してみた。
どうも、wxPythonには開発版としてのwxPython-Phoenixというものがあり、
こちらからファイルを取得してインストールすれば良いらしい。
インストールにはpipというpython環境用のパッケージマネージャを使う。
と、一応、wxPython本家のサイトに説明があった。
How to install wxPython - wxPyWiki
Ubuntu MATE 16.04にはpython2.7とpython3.5がインストールされていて、
pipもpython2用と3用が別々に存在する。
pipはpython2用であり、3用はpip3となる。
前置きはともかく、説明通り下記のコマンドを実行してみる。
sudo pip3 install --upgrade --trusted-host wxpython.org --pre -f http://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix
ダウンロードは済むものの、pipのバージョンが古いとかで、インストールできない。
結論から言うと、この先もエラーが頻発し、ライブラリを追加しないとまともにインストールできなかった。
どうやらインストールっていっても、Windows版やMac版と違いバイナリがないため、ビルドが必要なようだ。
原因と対処法を箇条書きにするとこんな感じ。
pipを使うと毎度、40M超えのファイルをダウンロードする。
面倒なのでサイトからソースをダウンロードしてビルドコマンドを直接叩いた。
cd {ソースディレクトリ} sudo python3 build.py build
pipのバージョンが古い
Ubuntu MATE 16.04にインストールされていたものでは古いらしい。
pipを更新するにもpipを使う。
pip3 install --upgrade pip
これで3用のpipが更新される。
しかし、ここに罠が。なんと2用のpipまで更新されてしまった。
そこで、/usr/local/bin/pipを/usr/local/bin/pip2で上書きしてお茶を濁す。
(何が原因だろう。それにこんな対処でいいんだろうか)
gstreamer0.10または0.08のライブラリがない
libgstreamer0.10-devではないらしく、こっちだったらOKだった。
sudo apt-get install python-gst0.10-dev
python3用のpython-configがない
これもよくわからん話で、
たしかに/usr/binにpython-configやpython2-configはあるが、3用がなかった。
調べるとpython-devを入れると作られるとのこと。
sudo apt-get install python3-dev
GTKのwebkitライブラリがない
wxWidgetのビルド時のチェックで確かにWarnningだったが、
スルーされていたのでOKかと思いきや、エラー。
sudo apt-get install libwebkitgtk-dev
notifyライブラリがない
上と同様。Warnningが上がっていた。
エラーになるかわからないが、二度手間は嫌なのでインストールしておく。
sudo apt-get install libnotify-dev
ここまでやってようやっとビルドが通る。
ビルド完了確認ができたら、pipを使って再トライ。
もう一度、ビルドが走って待たされるけど、今度は正しくインストールできた。
確認は、下記で取れる。
python3 import wx wx.version()
余談だけど、build.pyを使ってのインストールができなかったんだよね、なんでだろう。
結果的にpipでインストールできたからいいけどさ。
あとはアプリを作って確認だ。
追記:
2017/04/16にwxPython4のアルファ版がPyPIに登録された。
Python2.7〜3.4+まで対応されているようなので、
わざわざ開発版のPhoenixをインストールする理由もなくなった。
これからは以下でOK。
pip install wxPython