0

AppleScriptでMacの音量を設定する

Yosemiteにアップデートしていないのでまだapplescript使ってる。

# 音量設定取得
% osascript -e "get volume settings"
output volume:40, input volume:50, alert volume:100, output muted:true

# 音量だけを取得、0〜100で返ってくる
% osascript -e "(get volume settings)'s output volume"

# 音量を50に設定
% osascript -e "set volume 50/100*7"

# ミュートされているか確認、true/falseで返ってくる
% osascript -e "(get volume settings)'s output muted"

# ミュートする
% osascript -e "set volume with output muted"

# ミュート解除
% osascript -e "set volume without output muted"

音量取得が0〜100で返ってくるのに設定は0〜7でやるという謎のAPI


参考

起動音ジャーンの音量を自在にコントロールしたい! – ザリガニが見ていた…。

0

Raspberry Piで録音再生

Raspberry Piに喋らせるの時はライン出力がひどかったけど、ファームウェアアップデートしたら良くなった。

sudo rpi-update


スピーカーはライン出力の普通のやつ、マイクはこれ使ってる
SANWA SUPPLY MM-MCUSB16 USBマイクロホン
サンワサプライ (2009-05-13)
売り上げランキング: 3,017



必要な物をインストール

sudo apt-get install alsa-utils sox libsox-fmt-all
soxは録音再生、wavにエフェクトかけたりできるしMacでも動くから便利
mp3やoggで録音・再生したりもできる。
でも新しく買ったMacbook Airで動かなくて悲しい。Macminiでは動いている。


マイクが認識されているか確認

マイクはUSBマイクを使った。
lsusbやarecord -lでデバイスが認識されているか確かめる。
lsusb
arecord -l


録音再生

export AUDIODRIVER=alsa
AUDIODEV=plughw:1,0 rec test.mp3
AUDIODEV=plughw:0,0 play test.mp3
AUDIODEV=plughw:0,0 play test.mp3 pitch -500 norm reverb


arecord/aplayでも録音再生できる
arecord -D plughw:1,0 -f cd test.wav
aplay -D plughw:0,0 test.wav


参考にした

Raspberry Pi • View topic – sox default device
EzzeP: Raspberry PiにJuliusを動かしてみた(再び)
Rodent's Outrage: Raspberry Pi recording/playback with Sound Blaster Play

0

Macのsayコマンドの音程を変更しつつ再生

Macのsayに日本語しゃべらせれるけど、声が1種類しかなくてもっとほしい。

soxについてるplayコマンドを使うと音程変えたりエフェクトいろいろかけたりしながら再生できるので

brew install sox


saypitchコマンドを作った
後ろに数字付けると音程調整できる
saypitch パソコンなくても書画カメラとnexus7で余裕だった -300
saypitch パソコンなくても書画カメラとnexus7で余裕だった 800
男っぽい声とかもだせる。

#!/bin/sh
## brew install sox

TMP=/tmp/saypitch.aiff
if test $2 ; then
PITCH=$2
else
PITCH=0
fi
say $1 -o $TMP && play $TMP pitch $PITCH norm reverb
rm $TMP

読む速度遅くしたり
saypitch "-r 250 パソコンなくても書画カメラとnexus7で余裕だった" -1000


というかsoxはおもしろい。
一緒にrecというコマンドも入って、これを使うとCUIからすぐに録音できる。
今のところこれが一番簡単な録音方法なのではないか

0

Google NewsをMacに読み上げさせる

Googleニュース等のヘッドラインをMacに読み上げさせるやつ作った。最終的にMac以外でも動くようになった。



新聞の勧誘を「インターネットでニュース見てますので」と言って断ってるんだけどよく考えたら見てなかったから、新聞の人に申し訳なくて作った。
自分でインターネットにニュース見に行くの面倒くさいし、テレビとかラジオつけると余計な番組やっててウルサイからニュースだけ届けてほしい。

というわけで3ヶ月ぐらい前に作って、そこそこ良くてずっと使ってるから書いておく。


■使い方
詳細は上のgithubのREADMEを見るとよい。


面倒だったら
git clone git://github.com/shokai/speech-news.git
cd speech-news
gem install bundler
bundle install --path vendor/bundle
でインストールできて


読み上げる。
ruby -Ku speech_news.rb --help
ruby -Ku speech_news.rb

Mac/Linuxに喋らせるで書いた、MacのsayコマンドのKyoko化(日本語化)をやっておく必要あり。



■毎日決まった時間に読み上げる
crontab -e して
0 7 * * *  cd /Users/sho/src/ruby/speech-news && ruby -Ku speech_news.rb > /dev/null 2>&1
0 12 * * * cd /Users/sho/src/ruby/speech-news && ruby -Ku speech_news.rb > /dev/null 2>&1
0 19 * * * cd /Users/sho/src/ruby/speech-news && ruby -Ku speech_news.rb > /dev/null 2>&1
こう書いておくと、7時/12時/19時にニュース読んでくれる。朝はおはようって言うし夜はこんばんはって言う。
ちゃんと書けてるかは crontab -l で確認。


■Mac以外でも読み上げる
Mac/Linuxに喋らせるに書いたGoogle翻訳の声を使うgsayコマンドも一緒に入れておいた。
-sayオプションでgsayを使うようにすれば、Mac以外でも読んでくれる。声怖いけど。
ruby -Ku speech_news.rb -say "tools/gsay"


■Googleニュース以外も読み上げたい
pluginsディレクトリの中に.rbファイルを置けばニュースソースとして自動的に読み込むようになってる。
プラグインは読み上げるべき文字列を配列で返してくれるRubyプログラムならなんでも良い。
今はgoogle.rbだけが置いてある。


自分でプラグインを書くならgoogle.rbを参考にするとか、
a.rb
# プラグインのテストです
return ['うぽって微妙に古そうな銃ばかりでてくるし',
'あれは使われなくなった銃の行き着く精神世界なのでは',
'飛行機の墓場みたいな']
のような感じで、とりあえずStringのArrayを返すやつ書いてみると動く。

0

wavファイルをRubyで編集する

Rubyでwavファイルのフォーマットを読んだり、データチャンクを編集するためのgemを作った。

ベースは以前作ったやつで、ついでにwavファイル操作のサンプルをたくさん追加してrubygems.orgに登録しておいた。
あくまでサーバーで音を合成して返すようなwebサービスで使う事を想定している物で、マイクからの入力をリアルタイムに音声処理するための物ではない。

■インストール

gem install wav-file


■使う

フォーマットとデータチャンクを読む
require 'rubygems'
require 'wav-file'

f = open("input.wav")
format = WavFile::readFormat(f)
dataChunk = WavFile::readDataChunk(f)
f.close

puts format

するとこんな感じにフォーマットが取れる。
Format ID:      1
Channels: 2
Sampling Ratio: 48000 (Hz)
Byte per Sec: 192000
Bit per Sample: 16
Block Size: 4


バイナリからwavの波形を配列として取り出す
bit = 's*' if format.bitPerSample == 16 # int16_t
bit = 'c*' if format.bitPerSample == 8 # signed char
wavs = dataChunk.data.unpack(bit) # read binary


音量を半分にしてみる
wavs = wavs.map{|w| w/2}


逆再生にして、バイナリに戻す
dataChunk.data = wavs.reverse.pack(bit) # reverse


wavファイルに保存する
open("output.wav", "w"){|out|
WavFile::write(out, format, [dataChunk])
}


samplesディレクトリの中に色々と例を入れておいた。githubからも見れる。
  • 音量が小さいのを大きくする
  • 左右チャンネルを分けて保存する
  • wavファイル同士を連結する
  • wavファイル同士を重ねて同時に鳴らす
  • 再生速度を上げる
  • 波形をグラフにする
とかまあ色々入れておいた。


■tips
使う前にwavファイルのフォーマットについて理解しておいた方が良いかもしれない。
wav ファイルフォーマットが参考になる。


あと、複数のwavファイルを合成して新しいファイルを作る場合、操作する前にffmpegでformatを揃えた方が良い。その方が楽だし高速。
adjust_wav_format.rbにやり方を書いておいた。

サンプルを実行するのに必要なwavも、ffmpegでmp3とかから変換して作れる。
ffmpeg -i input.mp3 -ac 2 -ar 44100 output.wav