音声の基本
音声の基本
Wolfram言語は,Wolfram言語のパワフルな数学およびアルゴリズム機能と完全に統合した,プログラム的でありインタラクティブでもある音声処理に対する組込のサポートを提供している.サウンドファイルを生成してインポートしたり,組込み関数を使ってそれらを操作したり,線形および非線形フィルタを適用したり,多様な方法で可視化することができる.
| Audio[data] | data によって与えられたサンプルでインコアの音声を作成する |
| Audio[file] | file からアウトオブコアの音声を作成する |
| Audio[url] | url からアウトオブコアの音声を作成する |
| Import[file] | file から音声をインポートする |
| AudioGenerator[model] | さまざまな振動とノイズを作る |
Audio[RandomReal[{-1, 1}, 44100]]この他にも,ローカルのファイルシステム上,あるいはアクセス可能なリモートの場所にあるファイルから,アウトオブコアの音声オブジェクトを得るという方法もある.アウトオブコアの音声オブジェクトはサンプルをメモリに保存しない.
以下は,Wolfram言語のドキュメントディレクトリExampleDataからアウトオブコアの音声オブジェクトを生成し,そのオブジェクトによって内部的に使われるバイト数を表示したものである:
a1 = Audio["ExampleData/rule30.wav"]ByteCount[a1]Importを使って,ファイルまたはURLからインコアの音声オブジェクトを生成することができる.
a2 = Import["ExampleData/rule30.wav"];ByteCount[a2]ExampleData["Audio"]//ShortExampleData[{"Audio", "Wind"}, "Properties"]midi = Audio[Sound[{SoundNote[0], SoundNote[1], SoundNote[2], SoundNote[3], SoundNote[4], SoundNote[5],
SoundNote[6], SoundNote[7], SoundNote[8], SoundNote[9], SoundNote[10], SoundNote[11],
SoundNote[12]}]]AudioPlot[midi]以下は,SampledSoundFunctionで表現されたサウンドを音声に変換する:
sineTone = Play[Sin[2Pi 440 t], {t, 0, 0.01}]Audio[sineTone, "Real32"]//AudioPlotAudioGeneratorを使うと,さまざまな振動とノイズを作ることができる.
AudioGenerator["Sin", 0.02]//AudioPlotAudioGenerator["Pink"]//AudioPlot| AudioLength[audio] | audio オブジェクト中のサンプル数を返す |
| Duration[audio] | audio の持続時間を秒で返す |
| AudioChannels[audio] | audio のデータに存在するチャンネル数を返す |
| AudioSampleRate[audio] | audio に関連付けられたサンプルレートを返す |
| AudioType[audio] | audio の各サンプル要素に使われる値のタイプを返す |
props = {AudioLength, Duration, AudioChannels, AudioSampleRate, AudioType};Dataset@AssociationThread[props, Through[props[a1]]]サンプル値の配列は関数AudioDataを使って抽出することができる.デフォルトでは,この関数は実数値を返すが,オプションの"type"引数を使うと,指定されたタイプで求めることができる.
AudioData[AudioTrim[a1, {0.3, 0.3002}]]//MatrixFormAudioData[AudioTrim[a2, {Quantity[13230, "Samples"], Quantity[13237, "Samples"]}], "SignedInteger8"]//MatrixForma3 = Audio["ExampleData/drums.ogg"];MatrixForm /@ AudioData[AudioTrim[a3, {Quantity[1, "Samples"], Quantity[8, "Samples"]}]]AudioChannels /@ AudioChannelSeparate[a3]AudioChannelCombine[{AudioGenerator["Sin"], AudioGenerator["White"]}]//AudioChannels| AudioPlot[audio] | audio の波形をプロットする |
| Periodogram[audio] | audio の離散フーリエ変換の振幅の二乗(パワースペクトル)をプロットする |
| Spectrogram[audio] | audio のスペクトログラムをプロットする |
AudioPlot[ExampleData[{"Sound", "AltoFluteScale"}, "Audio"]]audio = ExampleData[{"Audio", "FluteScale"}];
silence = AudioIntervals[audio, #RMSAmplitude < 0.1&];
AudioPlot[audio, Epilog -> {RGBColor[1, 0, 0, .5], Rectangle[{#[[1]], -1}, {#[[2]], 1}]& /@ silence}]Periodogram[Audio["ExampleData/rule30.wav"], 300, 200, HammingWindow, GridLines -> Automatic]a = AudioGenerator[Sin[2π 1633 #] + Sin[2π 1209 #]&, SampleRate -> 8000];Spectrogram[a, 512, 64]有用な音声処理タスクの多くは,2つの音声オブジェクト間,あるいは音声オブジェクトと定数間の簡単な算術操作しか必要としない.例えば,音量を変更する場合は,音声オブジェクトに定数因子を掛けるか,音声オブジェクトに定数を足すか,音声オブジェクトから定数を引くかする.この目的で,NumericFunctionあるいはListableという属性を持つWolfram言語の演算子と関数のすべては,音声オブジェクトが使えるように多重定義されている.
| audio1+audio2 | 2つの音声オブジェクトを足す |
| n*audio | スカラーに音声オブジェクトを掛ける |
| Mean[{a1,a2,…}] | 音声オブジェクトのリストの平均を計算する |
0.3 * AudioGenerator["Sin", 0.01] + 0.7 * AudioGenerator["Triangle", 0.02]//AudioPlotMean[{\!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\), \!\(\*AudioBox[""]\)}]a = ExampleData[{"Audio", "Bird"}];
stats = {Total, Min, Max, Mean, Median, StandardDeviation};Dataset[AssociationThread[ToString /@ stats -> Through[stats[a]]]]"IndeterminateValue"というシステムオプションは,算術操作で得ることのできる値を置き換えるのに使うことができるが,音声オブジェクトに保存することはできない.これにはComplexInfinityとIndeterminateが含まれる.
SystemOptions["AudioProcessingOptions" -> "IndeterminateValue"]SetSystemOptions["AudioProcessingOptions" -> "IndeterminateValue" -> 2.]data = N[{-2, -1, 0, 1, 2}];
a = Audio[data];data ^ dataAudioData[a ^ a]data = {-2, -1, 0, 1, 2};
a = Audio[data];Sqrt[data]AudioData[Sqrt[a]]Re[Sqrt[data]]SetSystemOptions["AudioProcessingOptions" -> "IndeterminateValue" -> 0]選択,削除,充填等によって音声の継続時間を変更する操作について考えてみよう.このような操作はいろいろな目的に役立つ.選択や削除により,大きいファイルの一部から新しい音声オブジェクトを生成することができる一方,充填は音声オブジェクトの最後を拡張するために使われ,多数の音声処理タスクで最後のサンプルも一様に扱われるようにする.
| AudioTrim[audio,{t1,t2}] | t1から t2までのサンプルのみからなる音声オブジェクトを返す |
| AudioPad[audio,m] | m 秒間の無音を音声の両側に加える |
| AudioDelete[audio,{t1,t2}] | t1から t2までを削除する |
| AudioSplit[audio,{t1,t2,…}] | 時間 ti で audio を分割する |
| AudioPartition[audio,dur,offset] | audio を重複のある部分に分割する |
| AudioIntervals[audio,crit] | 基準 crit を満たす音声区間を返す |
AudioTrim[a1, {0, 1}]//DurationAudioPlot[AudioPad[AudioGenerator["Sawtooth", 0.01], 0.01, #]& /@ {"Silent", "Reflected", "Periodic"}](a = AudioPad[AudioGenerator["Sin", 0.01], {0.01, 0.02}])//AudioPlotAudioTrim[a]//AudioPlotAudioPlot[a = ExampleData[{"Audio", "FemaleVoice"}]]AudioDelete[a, {1, 3}]//AudioPlotDuration /@ AudioSplit[a, Duration[a] / 2]Row[AudioPlot[#, ImageSize -> Small]& /@ AudioPartition[AudioGenerator["Triangle", 0.01], 0.005]]Row[AudioPlot[#, ImageSize -> Small]& /@ AudioPartition[AudioGenerator["Triangle", 0.01], {0.005}, 0.004]]intervals = AudioIntervals[a1, #Max > .1 && #SpectralCentroid < 800&]AudioTrim[a1, intervals]//AudioPlot| AudioResample[audio,sr] | サンプルレートが sr になるようリサンプルされた音声オブジェクトを返す |
| AudioNormalize[audio] | サンプルの最大絶対値が1になるように audio を正規化する |
| AudioAmplify[audio,s] | audio の全サンプルを s 倍する |
AudioResample[a1, 8000]//AudioSampleRateAudioNormalize[a1]//AudioPlotAudioAmplify[a1, 5]//AudioPlot| AudioJoin[list] | 音声オブジェクトのリストを連結する |
| AudioOverlay[list] | 音声オブジェクトのリストを重ねる |
| ConformAudio[list] | リストの各音声オブジェクトの特性を適合させる |
AudioJoin[{AudioGenerator["Square", 0.01], AudioGenerator["Triangle", 0.01]}]//AudioPlotAudioOverlay[{AudioGenerator["Sin", 0.01], AudioGenerator["Impulse", 0.01]}]//AudioPlotlist = {Import["ExampleData/rule30.wav"], Import["ExampleData/drums.ogg"]};
prop = {"Channels", "Duration", "Length", "SampleRate", "Type"};TableForm[Transpose@(AudioMeasurements[#, prop, List]& /@ list), TableHeadings -> {prop, None}, TableDepth -> 2]TableForm[Transpose@(AudioMeasurements[#, prop, List]& /@ ConformAudio[list]), TableHeadings -> {prop, None}, TableDepth -> 2]