Go
sox
音声処理

SoXチートシート - コマンドラインで音声編集


はじめに

音声処理界のスイスアーミーナイフことSoXの使い方を目的別にまとめました。

なお、この記事で扱うのは特に断りのないかぎり44.1k Hz / 16 bitのステレオ音声です。


音声を編集する


音声を切り出す

trim 開始秒 切り出す秒数と指定することで音声の一部を切り出すことができます。以下の例では、input.wavの1.5秒目から4.5秒目までの3秒間を切り出したoutput.wavを作成します。

sox input.wav output.wav trim 1.5 3

秒数の代わりにHH:MM:SS.sss形式で時刻を指定することもできます。以下のように指定しても上記の例と同じ結果が得られます。

sox input.wav output.wav trim 00:01.5 00:03

trim 開始秒と指定することで開始病から最後まで音声を切り出すことができます。以下の例では、input.wavの2秒目から最後まで切り出したoutput.wavを作成します。

sox input.wav output.wav trim 2

trim 開始秒 切り出す秒数 開始秒 切り出す秒数 ...と指定することで複数箇所を切り出すことができます。以下の例では、input.wavの2秒目から5秒間、10秒目から4秒間きりだしたoutput.wavを作成します。

sox input.wav output.wav trim 2 5 3 4

2番目以降の開始秒は、切り出した秒数分だけ再生位置が移動していることに注意してください。つまり、上記の例でtrim 2 5 10 4とするのは間違いです。そのように指定した場合は2秒目から5秒間、17秒目から4秒間切り出す、という意味になってしまいます。


音量を調整する

-v 絶対的な音量と指定することで音量を調整できます。音量は1.0を基準にして自由に設定できます。以下の例では、input.wavの音量を0.5倍に調整したoutput.wavを作成します。

sox -v 0.5 input.wav output.wav

gain 相対的な音量と指定することで音量を調整できます。音量の単位はデシベルで、0 dBを基準とする相対的な値で設定します。以下の例では、input.wavの音量を2 dB増加させたoutput.wavを作成します。なお、同時に-hを指定することで音割れを防止できます。

sox input.wav output.wav gain -h +2

-vgainを組み合わせることもできます。以下の例では、音割れを防ぎつつinput.wavの音量を1.25倍したoutput.wavを作成します。

sox -v 1.25 input.wav output.wav gain -h

ただし、調整後の音量が大きすぎると-hを指定しても音割れが発生します。また、最初から音割れしている音声に対しては-hを指定しても効果がありません。


左右チャネルの音量バランスを調整する

remix 1v左チャネルの絶対的な音量 2v右チャネルの絶対的な音量と指定することで左右チャネルの音量を独立して調整できます。音量は1.0を基準にして自由に設定できます。以下の例では、input.wavの左チャネルの音量を0.8倍、右チャネルの音量を1.2倍に調整したoutput.wavを作成します。

sox input.wav output.wav remix 1v0.8 2v1.2

remix 1p左チャネルの相対的な音量 2p右チャネルの相対的な音量と指定することで左右チャネルの音量を独立して設定できます。音量の単位はデシベルで、0 dBを基準とする相対的な値を指定します。以下の例では、input.wavの左チャネルの音量を3 dB下げて、右チャネルの音量を5 dB上げたoutput.wavを作成します。

sox input.wav output.wav remix 1p-3 2p5

片方のチャネルの音量を0に設定したい場合、remix 1v0.0 2v1.0のように指定することもできますが、remix 0 2のように指定しても片方のチャネルの音量を0にできます。以下の例では、ステレオ音声input.wavの左チャネルをミューとしたoutput.wavを作成します。

sox input.wav output.wav remix 0 2

右チャネルをミュートする場合は、以下のように指定します。

sox input.wav output.wav remix 1 0


ステレオ音声をモノラル音声に変換する

remix 1,2と指定することで左右チャネルが結合されてモノラル音声に変換されます。以下の例では、input.wavの左右チャネルを結合してoutput.wavというモノラル音声を作成します。

sox input.wav output.wav remix 1,2


モノラル音声をステレオ音声に変換する

remix 1 1と指定することでモノラル音声をステレオ音声に変換できます。以下の例では、input.wavというモノラル音声をステレオ音声に変換したoutput.wavを作成します。

sox input.wav output.wav remix 1 1

-c 2と指定してもモノラル音声をステレオ音声に変換できます。

sox input.wav -c 2 output.wav


ステレオ音声の左右チャネルをモノラル音声として分割する

remix 抽出したいチャネル番号と指定することで任意のチャネルを抽出できます。チャネルの番号は左が1で右が2です。これを利用してステレオ音声の左右チャネルを分割します。以下の例では、stereo.wavl.wavr.wavの2つのモノラル音声に分割します。

sox stereo.wav l.wav remix 1

sox stereo.wav r.wav remix 2


2つのモノラル音声からステレオ音声を作成する

-M 左チャネルのモノラル音声 右チャネルのモノラル音声と指定することで2つのモノラル音声からステレオ音声を作成できます。なお、2つのモノラル音声の長さが異なる場合は短い方に合わされます。以下の例では、l.wavr.wavという2つのモノラル音声からステレオ音声stereo.wavを作成します。

sox -M l.wav r.wav stereo.wav


ステレオ音声の左右チャネルを入れ替える

remix 2 1と指定することでステレオ音声の左右チャネルを入れ替えることができます。以下の例では、input.wavの左右チャネルを入れ替えたoutput.wavを作成します。

sox input.wav output.wav remix 2 1

swapと指定しても左右チャネルを入れ替えることができます。

sox input.wav output.wav swap

音声が3チャンネル以上ある場合、swapと指定すると2つのチャンネルのペアごとにチャネルを言え変えます。例えば、5.1chの音声の場合、チャンネルは1, 2, 3, 4, 5という順番で並んでいますが、変換後は2, 1, 4, 3, 5のように入れ替わります。


複数の音声を連結する

連結したい音声のファイル名を並べて、最後に出力ファイル名を指定することで複数の音声を連結することができます。

sox part_a.wav part_b.wav part_c.wav output.wav


複数の音声をミックスする

-m 音声1 音声2 ...と指定することで複数の音声を重ねること(ミックス)ができます。なお、音声のチャネル数は一致している必要があります。例えば、guitar.wavdrums.wavがステレオ、vocal.wavがモノラルだった場合はボーカルが左に寄ってしまいます。そこで、ミックスする前にモノラル音声はステレオ音声に変換してチャネル数を一致させる必要があります。すると、ボーカルが中央から聞こえるようになります。以下の例では、複数の音声をミックスしてstereo.wavを作成します。

sox -m vocal.wav guitar.wav drums.wav stereo.wav


音声の先頭または末尾から無音を削除する

silence 1 無音の長さ 無音とみなす音量を指定することで先頭から無音を削除できます。以下の例では、音量が0.1%以下の部分を無音とみなし0.2秒以上の無音が続いた場合にinput.wavの先頭から削除します。

sox input.wav output.wav silence 1 0.2 0.1%

silencereverseを組み合わせることで、音声の末尾から無音を取り除くことができます。以下の例では、音量が0.1%以下の部分を無音とみなし0.2秒以上の無音が続いた場合にinput.wavの末尾から削除します。

sox "|sox input.wav -p reverse silence 1 0.2 01%" output.wav reverse


音声から無音をすべて削除する

silence 1 先頭に含まれる無音の長さ 先頭に含まれる無音の音量 1 中間に含まれる無音の長さ 中間に含まれる無音の音量 : restartを指定することで無音をすべて取り除くことができます。以下の例では、元の音声に対して0.2%以下の音量を無音とみなして0.3秒以上無音が続いている部分をすべて取り除きます。

sox input.wav output.wav 1 0.3 0.2% 1 0.3 0.2% : restart


無音部分で音声を分割する

silence 1 先頭に含まれる無音の長さ 先頭に含まれる無音の音量 1 中間に含まれる無音の長さ 中間に含まれる無音の音量 : newfile : restartと指定することで無音が続いているところで音声を分割できます。以下の例では、元の音声に対して0.2%以下の音量を無音とみなして0.3秒以上無音が続いた場合、無音を取り除いた上で音声を分割します。このコマンドを実行すると、output001.wavoutput002.wavのように連番でファイルが作成されます。

sox input.wav output.wav silence 1 0.3 0.2% 1 0.3 0.2% : newfile : restart


音声をN秒おきに分割する

trim 0 秒数 : newfile : restartと指定することで音声を指定された秒数秒おきに分割できます。以下の例ではinput.wavを10秒おきに分割します。このコマンドを実行すると、output001.wavoutput002.wavのように連番でファイルが作成されます。

sox input.wav output.wav trim 0 10 : newfile : restart


無音を作成する

-nは無音を生成する仮想ファイルです。これにtrimを組み合わせることで任意の長さの無音を作成することができます。以下の例では無音が1.5秒続くファイルoutput.wavを作成します。

sox -n output.wav trim 0 1.5


音声にエフェクトを加える


ピッチを変更する

pitch シフト量と指定することでピッチを上げ下げできます。シフト量の単位はセントです。ただし、ピッチを上げると音質の劣化が目立つので基本的には下げる方向に使用します。以下の例では、input.wavのピッチを半音(60セント)下げます。

sox input.wav output.wav pitch "-60"


再生速度を変更する

tempo 倍率と指定することで音程を保ったまま再生速度を変更できます。以下の例ではinput.wavのテンポを1.25倍に変更します。

sox input.wav output.wav tempo 1.25

なお、speed 倍率と指定しても再生速度を変更できますが、同時にピッチも変化してしまいます。以下の例ではinput.wavの再生速度を1.25倍にしたoutput.wavを作成します。

sox input.wav output.wav speed 1.25


フェードイン・フェードアウトする

fade カーブの種類 開始秒数と指定することでフェードイン・フェードアウト効果を加えることができます。カーブの種類は次のとおりです。言葉で説明しても伝わらないと思いますので、音量がどのように変化するのかを自分の耳で確かめてみてください。なお、カーブの種類を指定しなかった場合はlが選択されます。



  • q: サイン波の8/1のカーブ


  • h: サイン波の1/4のカーブ


  • t: 線形増加または減少


  • p: パラボラを逆にしたカーブ


  • l: 指数増加もしくは減少

以下の例では、input.wavの開始後に3秒間かけてフェードインします。

sox input.wav output.wav fade 3

以下の例では、input.wavの末尾の3秒間をフェードアウトしたoutput.wavを作成します。

sox "|sox input.wav -p reverse fade 3" reverse


イコライジングする

equalizer 周波数 幅 ゲインと指定することで特定の周波数帯域を調整できます。ゲインは0 dBを基準にして相対的な値として指定します。イコライザの扱いは難しく、すぐに音割れしてしまうのでgain -hを指定して音割れを防ぐ必要があります。以下の例ではinput.wavの2400 Hz付近を3 dB増加させたoutput.wavを作成します。

sox input.wav output.wav gain -h equalizer 2400 0.5q 3

上記の例では0.5qというパラメータが使用されています。この数値が大きくなるほどイコライザが適用される周波数帯域の幅が狭く、小さくなるほど適用される周波数帯域の幅が広くなります。

equalizer 周波数 幅 ゲイン equalizer 周波数 幅 ゲイン ...と複数のイコライザを組み合わせることもできます。以下の例では、input.wavの80 Hz付近を5 dB、5000 Hz付近を3 dB強調します。

sox input.wav output.wav gain -h equalizer 80 1.0q 5 5000 0.1q 3


高音域または低音域を調整する

treble 増減量またはbass 増減量と指定することで、それぞれ音声の高音域または低音域を調整できます。なお、増減の単位はデシベルです。また、このエフェクトを使用する場合は音が割れないようにgainエフェクトを同時に指定することをおすすめします。以下の例ではinput.wavの高音域を5 dB強調したoutput.wavを作成します。

sox input.wav output.wav gain -h treble +5

basstrebleを同時に指定することもできます。以下の例では低音域と高音域を音が割れない範囲でそれぞれ5 dBブーストします。

sox input.wav output.wav gain -h bass +5 treble +5


リバーブを加える

reverb かかり具合を指定することでリバーブを加えることができます。このエフェクトを加えると、音が前後に広がって大きなステージで演奏しているかのような効果が得られます。リバーブのかかり具合は、0から100の%単位で指定することができます。デフォルトは50です。

以下の例では、input.wavにリバーブを加えたoutput.wavを作成します。

sox input.wav output.wav reverb

元の音声に対して、反響音だけを抽出したい場合は-wフラグを指定します。以下の例では、input.wavに10%のリバーブを加えて、その反響音のみを抽出したoutput.wavを作成します。

sox input.wav output.wav reverb -w 10


ディレイを加える

delay 左チャネルの開始時刻 右チャネルの開始時刻と指定することでディレイを加えることができます。このエフェクトを加えると、音声のサラウンド感が増します。ヘッドホンやイヤホンで音楽を聞くときに使用すると、左右に音が広がる効果をより明確に感じられます。なお、山びこのように音が遅れて聞こえるエフェクトを使用したい場合は、次のセクションを参照してください。

以下の例ではinput.wavの右チャネルの開始時刻を0.04秒遅らせることでサラウンド感を強調します。なお、input.wavはステレオ音声であることに注意してください。モノラル音声にこのエフェクトを加えても音は変化しません

sox input.wav output.wav delay 0 0.12

時刻の代わりにサンプル数を指定することもできます。以下の例では、input.wavの右チャネルを882サンプル遅らせることでサラウンド感を加えます。input.wavのサンプリング周波数が44100 Hzと仮定すると、882 / 44100 = 0.02秒遅らせることになります。

sox input.wav output.wav delay 0 882s


エコーを加える

echo 入力ゲイン 出力ゲイン ディレイ間隔 深さと指定することでエコーを加えることができます。このエフェクトを加えると、音声が前後に広がります。おすすめのパラメータはecho 1.0 0.75 100 xです。`xはディレイの深さです。x = 0.1でカラオケ、x = 0.3`で大きなステージのような音の広がりが感じられます。

以下の例では、input.wavに大きなステージで演奏しているかのようなエコーエフェクトを追加したoutput.wavを作成します。

sox input.wav output.wav echo 1.0 0.75 100 0.3

echo 1.0 1.0 500 0.4とパラメータを設定することで、山びこのように音が遅れて聞こえる効果が得られます。以下の例では、input.wavにやまびこエフェクトを加えたoutput.wavを作成します。

sox input.wav output.wav 1.0 1.0 500 0.4


トレモロを加える

tremolo 周波数 深さと指定することでトレモロを加えることができます。このエフェクトを加えると音量が一定間隔で上下する効果が得られます。周波数は音量が上限する間隔、深さは音量を何%下げるかを指定します。デフォルトの深さは40%です。

以下のトレモロエフェクトの例では、input.wavの音量を5 Hz(1秒間に5回)の間隔で60%上げ下げします。

sox input.wav output.wav tremolo 5 60


音量を正規化する

normと指定することで音量が正規化されます。小さな音は大きく、大きな音は小さくして全体の音量を一定に整えることを正規化と言います。以下の例では、音量にばらつきがあるinput.wavの音量を正規化したoutput.wavを作成します。

sox input.wav output.wav norm


位相を反転する

-v "-1"と指定することで位相が反転します。位相についての説明は省きますが、音声波形が山・谷・山・谷...と振動している場合、位相を反転すると谷・山・谷・山...のように波形が反転します。

sox -v -1 input.wav output.wav


繰り返し再生する

repeat 繰り返す回数と指定することで音声を繰り返し再生します。以下の例では、drums.wavを4回繰り返した音声output.wavを作成します。ドラムなどのリズムパターンを作成するときに便利です。

sox drums.wav output.wav repeat 4


逆再生する

reverseと指定することで音声を逆再生することができます。このエフェクト単体で使用する場面はないと思いますが、他のエフェクトや編集作業と組み合わせて使用します。以下の例では、input.wavを逆再生したoutput.wavを作成します。

sox input.wav output.wav reverse


SoXをシンセサイザーとして使う

-n 出力ファイル名 synth 再生時間 波形の種類 周波数と指定することで任意の波形を作成できます。

利用できる波形の種類は次のとおりです。


  • sin

  • square

  • sawtooth

  • triangle

  • trapezium

  • noise

  • pinknoise

  • brownnoise


サイン波を作成する

以下は、880 Hzのサイン波が0.5秒間記録されたモノラル音声sin.wavを作成する例です。-rでサンプリング周波数と-cでチャネル数を指定するひつようがあります。

sox -r 44100 -c 1 -n sin.wav synth 0.5 sin 880


ノイズを作成する

以下はブラウンノイズを3秒間記録したbronnoise.wavを作成する例です。なお、波形の種類としてノイズを指定した場合は周波数を指定することはできません。

sox -r 44100 -c 1 -n brownnoise.wav synth 3 brownnoise


スィープ音を作成する

次のように指定すると、1.5秒間で110 Hzから1800 Hzへと音程が変化する矩形波を作成できます。マリヲがステージをクリアしたときの効果音のようですね。

sox -r 44100 -c 1 -n effect.wav synth 01.5 square 110-1800


その他


録音する

SoXをインストールすると付属するrecコマンドを使用して録音することができます。

以下の例では、デフォルトのサウンド入力デバイスから音声をinput.wavとして録音します。Ctrl-Cで終了すると同時にファイルが作成されます。

rec input.wav

trimを組み合わせて録音する秒数を指定することもできます。以下の例では、10秒間録音します。

rec input.wav trim 0 10


再生する

SoXをインストールすると付属するplayコマンドを使用して音声を再生できます。

play input.wav

この記事で紹介しているsoxコマンドの実行結果を、その場で確認したい場合にはplayコマンドに置き換えてください。その場で実行結果の音声を聴くことができます。以下の例では、input.wavのテンポを1.5倍に変更して再生します。

play input.wav tempo 1.5


標準入力から読み込んで再生する

-は標準入力を表す仮想ファイルです。これをplayコマンドと組み合わせることで、標準入力から読み込んだデータを再生することができます。

以下に、3秒間ドの音(約523 Hzの音)を64bit Float型データとして標準入力に書き出すGoプログラムmain.goを示します。

main.go

package main

import (
"encoding/binary"
"math"
"os"
)

const PI = 3.1415

func main() {
var (
data float64
frequency float64 = 440 * math.Pow(2, 3/12)
rate float64 = 44100
duration float64 = 3
)
for n := 0; n < int(rate*duration); n++ {
// Calculate amplitude at the n / rate phase.
radius := frequency * 2 * PI * float64(n) / rate
data = math.Sin(radius)

// Render audio data to STDOUT.
binary.Write(os.Stdout, binary.LittleEndian, data)
}
return
}

上記のプログラムは次のように実行します。すると3秒間ドの音が再生されます。

go run main.go | play -r 44100 -c 1 -t f64 -

再生するには-rでサンプリング周波数、-cでチャネル数、-tでデータ型を指定する必要がある点に注意してください。

データ型は[s|u|f]ビット数のように文字列で指定します。


  • Unsigned Integer: u

  • Integer: s

  • Float: f

上記のプレフィクスとビット数を組み合わせてデータ型を表します。例えば、16 bit符号付き整数はs16のように表します。

なお、エンディアンを指定する必要がある場合は、-Bでビッグエンディアン、-Lでリトルエンディアンを切り替えることができます。


まとめ

この記事で紹介したのはSoXの機能の一部に過ぎません。さらに詳しく知りたい方はSoXのドキュメントを御覧ください。


参考


  1. SoX - Sound eXchange | Documentation