音声処理

フィルタリング解析
エフェクトと操作
Wolfram言語は,他のパワフルな数学およびアルゴリズム機能と完全に統合した,プログラム的でありインタラクティブでもある音声処理に対する組込のサポートを提供している.音声オブジェクトは,線形および非線形フィルタを適用したり,エフェクトを加えたり,音声特定の関数を使って解析することもできれば,Wolfram言語の他の部分との密接な統合を利用して処理することもできる.
フィルタリング
音声信号は,多数の信号処理関数の入力として使うことができる.
LowpassFilter[audio,ωc]
カットオフ周波数が ωc のローパスフィルタを音声に適用する
HighpassFilter[audio,ωc]
カットオフ周波数が ωc のハイパスフィルタを音声に適用する
WienerFilter[audio,r]
範囲 r サンプルのWienerフィルタを音声に適用する
MeanFilter[audio,r]
範囲 r サンプルの平均値フィルタを音声に適用する
TotalVariationFilter[audio]
ノイズ除去フィルタを音声に適用する
GaussianFilter[audio, r]
範囲 r サンプルのガウシアンフィルタを音声に適用する
音声オブジェクトに直接適用できるフィルタの例
Wolfram言語に存在するフィルタリング関数の多くは,そのまま音声オブジェクトに適用することができる.多くの場合,カットオフ周波数を周波数Quantityとして指定することができる.
音声オブジェクトに適用されるFIRフィルタ:
Wolfram Language code: a = ExampleData[{"Audio", "Apollo11ReturnSafely"}, "Audio"]
Wolfram Language code: lp = LowpassFilter[a, Quantity[800, "Hertz"], 101]
Wolfram Language code: hp = HighpassFilter[a, Quantity[1600, "Hertz"], 101]
Wolfram Language code: bs = BandstopFilter[a, {Quantity[800, "Hertz"], Quantity[1600, "Hertz"]}, 91]
もとの信号と処理された信号のピリオドグラムをプロットする:
Wolfram Language code: Periodogram[{a, bs, lp, hp}, 2000, PlotRange -> {{0, 3000}, Automatic}, Frame -> True, ImageSize -> Medium, PlotLegends -> {"Original", "Bandstop", "Lowpass", "Highpass"}]
WienerFilterを使って,録音のノイズを除去する:
Wolfram Language code: a = ExampleData[{"Audio", "Apollo11ReturnSafely"}, "Audio"]
Wolfram Language code: WienerFilter[a, 25]
Wolfram Language code: Spectrogram[#, ImageSize -> Small, FrameTicks -> None]& /@ {a, %}
離散時間伝達関数モデルを使うと,RecurrenceFilterで音声オブジェクトにフィルタを適用することができる.
RecurrenceFilter[tf,audio]
TransferFunctionModel tf で定義された離散時間フィルタを使う
BiquadraticFilterModel[{"type",spec}]
指定された {"type",spec}の双二次フィルタを作る
ButterworthFilterModel[{"type",spec}]
指定された {"type",spec}のButterworthフィルタを作る
TransferFunctionModel[m,s]
複素変数 s を持つ伝達関数行列 m のモデルを表す
ToDiscreteTimeModel[lsys,τ]
サンプリング周期が τ の連続時間系モデル lsys の離散時間近似を与える
利用可能なフィルタモデルと追加のユーティリティの例
アナログ(連続時間)フィルタモデルの一つを使う最も簡単な方法は,ToDiscreteTimeModelを使って伝達関数を離散化し,RecurrenceFilterを使ってその結果を音声オブジェクトに適用するというものである.
音声オブジェクトに共振双2次フィルタを適用する:
Wolfram Language code: filterModel = BiquadraticFilterModel[{ω, q}]
Wolfram Language code: discreteFilter = ToDiscreteTimeModel[filterModel, 1 / 22050, z, Method -> {"BilinearTransform", "CriticalFrequency" -> ω}]
Wolfram Language code: a = \!\(\*AudioBox["![Embedded Audio Player](audio://content-1323j)"]\);
Wolfram Language code: RecurrenceFilter[discreteFilter /. {ω -> 1000 2 Pi, q -> 7}, a]
離散伝達関数はTransferFunctionModelを使って作成し,RecurrenceFilterを使って音声オブジェクトに適用することができる.
TransferFunctionModelを使ってコムフィルタを定義し,それを音声オブジェクトに適用する:
Wolfram Language code: combFilterModel[f_, α_, sr : _ : 22050] := TransferFunctionModel[{{1 / ( 1 - α z^-Round[sr / f])}}, z, SamplingPeriod -> (1/sr)]
Wolfram Language code: combFilterModel[150, α]
Wolfram Language code: RecurrenceFilter[combFilterModel[150, -.9], a]
エフェクトと操作
音声オブジェクトは,組込関数あるいはユーザ定義の関数を使って変更したり操作したりすることができる.
AudioTimeStretch[audio,r]
指定された因数 r 分だけの時間の引き伸ばしを音声に適用する
AudioPitchShift[audio,r]
指定された割合 r のシフトピッチを音声に適用する
AudioReverb[audio]
音声に残響エフェクトを加える
AudioDelay[audio,delay]
音声に遅延時間 delay の遅延エフェクトを適用する
AudioChannelMix[audio,desttype]
指定された desttype に音声のチャンネルを混ぜる
一般的な音声エフェクト
ピッチシフトとタイムストレッチを使うと,音声信号のピッチと継続時間を別々に変更することができる.
音声オブジェクトを引き伸ばす:
Wolfram Language code: a = ExampleData[{"Audio", "MaleVoice"}, "Audio"]
Wolfram Language code: AudioTimeStretch[a, 1.5]
音声オブジェクトのピッチをシフトアップする:
Wolfram Language code: AudioPitchShift[a, Quantity[2, IndependentUnit["semitones"]]]
遅延エフェクトと残響エフェクトは,録音を仮装環境に置いたり,特殊エフェクトを生成したりするために使うことができる.
遅延エフェクトあるいは残響エフェクトを適用する:
Wolfram Language code: AudioDelay[a, .7, .8, .4, PaddingSize -> 2]
Wolfram Language code: AudioTrim[AudioReverb[a, ExampleData[{"Audio", "IRStMarysChurch"}]], 10]
高いフィードバック値を持つ短い遅延を突発的ノイズに加えることにより,カープラス・ ストロング(Karplus–Strong)合成を実行する.これは振動する弦のサウンドのシミュレーションである:
Wolfram Language code: freq = 60; feedback = 0.99; AudioDelay[AudioGenerator["Pink", .01], 1 / freq, feedback, 1, PaddingSize -> 5, Method -> {"LowpassCutoff" -> Quantity[8000, "Hertz"]}]
任意数のチャンネルへのダウンミキシングおよびアップミキシングは,AudioChannelMixを使って実行することができる.
マルチチャンネルの音声オブジェクトをダウンミックスおよびアップミックスする:
Wolfram Language code: a//AudioChannels
Wolfram Language code: AudioChannelMix[a, "Mono"]//AudioChannels
Wolfram Language code: AudioChannelMix[a, 3]//AudioChannels
Audioオブジェクトの算術機能を利用して,録音を変更することができる.属性NumericFunctionあるいはListableを持つWolfram言語の演算子および関数はすべて音声オブジェクトで利用できるよう多重定義されている.
Tanh関数を使って,音声オブジェクトに滑らかなディストーションを適用する:
Wolfram Language code: a = AudioNormalize[Import["ExampleData/Rule30.wav"]]
Wolfram Language code: Tanh[5a]
ChebyshevT関数を使って「ウェーブシェイパー」エフェクトを得る:
Wolfram Language code: ChebyshevT[10, a]
音声オブジェクトに正弦波を掛けて「リングモジュレータ」エフェクトを得る:
Wolfram Language code: a×\!\(\*AudioBox["![Embedded Audio Player](audio://content-71fn6)"]\)
解析

全信号の解析

録音の特性は,大域的にも局所的にも計算することができる.
AudioMeasurements[audio,"prop"]
audio 全体についての特性"prop"を計算する
大域的測度値を計算する機能の例
AudioMeasurementsを使うと,時間領域特性も周波数領域特性も測定することができる.この特性は,音声オブジェクトのチャンネル上の平均サンプル値上で計算される.
録音の時間領域特性を計算する:
Wolfram Language code: AudioMeasurements[ExampleData[{"Audio", "Drums"}], {"MinMax", "Mean", "StandardDeviation", "RMSAmplitude", "ZeroCrossings"}, "Dataset"]
録音の周波数領域特性を計算する:
Wolfram Language code: AudioMeasurements[ExampleData[{"Audio", "Drums"}], {"SpectralCentroid", "SpectralFlatness", "SpectralRollOff", "SpectralSpread"}, "Dataset"]
組込の統計関数を直接適用して,他の測度値を計算する.
音声のモーメントとエントロピーを計算する:
Wolfram Language code: a = AudioGenerator["Sin"];
Wolfram Language code: Moment[a, 2]
Wolfram Language code: Entropy[a]
AudioMeasurementsとは異なり,多重定義された関数は平坦化されたデータに適用される(入力がマルチチャンネルの音声オブジェクトの場合,すべてのチャンネルからのサンプル値は1つの配列に平滑化される).
録音の統計的特性を計算する:
Wolfram Language code: AssociationThread[{"MinMax", "Mean", "StandardDeviation", "RMSAmplitude", "ZeroCrossings"} -> Through[{MinMax, Mean, StandardDeviation, Sqrt@Mean[# ^ 2]&, Total@CrossingDetect[#, CornerNeighbors -> None]&}@ExampleData[{"Audio", "Drums"}]] ]//Dataset

分割された信号の解析

音声オブジェクトの大域的特性に加え,局所的な測度値を計算することもできる.
AudioLocalMeasurements[audio,"prop"]
audio の分割について,特性"prop"をローカルに計算する
AudioIntervals[audio,crit]
基準 crit を満たす音声区間を求める
局所的測度値を計算する機能の例
AudioLocalMeasurementsでは,特性はローカルで計算される.信号はPartitionGranularityの指定に従って分割され,要求された特性はそれぞれの部分について計算される.結果は,タイムスタンプが各部分の中心の時間に対応するTimeSeriesとして返される.
オフセット1ミリ秒の40ミリ秒の部分でRMS(二乗平均平方根振幅)を計算する:
Wolfram Language code: a = \!\(\*AudioBox["![Embedded Audio Player](audio://content-v3fc5)"]\);res = AudioLocalMeasurements[a, "RMSAmplitude", PartitionGranularity -> {Quantity[40, "Milliseconds"], Quantity[1, "Milliseconds"]}]; Show[AudioPlot[a], ListLinePlot[res, PlotStyle -> Red]]
AudioLocalMeasurementsあるいはAudioMeasurementsの結果は,Wolfram言語の他の機能の入力として使うことができる.
"SpectralCentroid"および"SpectralSpread"の測度値を使って,リスト中の同様の音声オブジェクトのクラスタを見付ける:
Wolfram Language code: samples = {\!\(\*AudioBox["![Embedded Audio Player](audio://content-ewxls)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-gcjdl)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-fytkk)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-dkdtd)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-pqo5r)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-1iwl9)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-7qywt)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-nldr6)"]\), \!\(\*AudioBox["![Embedded Audio Player](audio://content-xc09e)"]\)}; props = AudioMeasurements[#, {"SpectralCentroid", "SpectralSpread"}, "List"]& /@ samples; clusters = FindClusters[props -> props]
Wolfram Language code: ListPlot[Partition[props, 1], PlotMarkers -> samples, ImageSize -> 300, Prolog -> ({Opacity[.3, RGBColor[1, 0.5, 0.5]], Disk[Mean@#, 400]& /@ clusters}), PlotRange -> {{00, 4000}, {0, 4000}}, AspectRatio -> 1]
MFCC(メル周波数ケプストラム係数)の測度値を,ExampleData["Audio"]集合のさまざまな要素間の距離を計算する機能として使う:
Wolfram Language code: list = Select[ExampleData["Audio"], ExampleData[#, "Duration"] < 10&]; a = ConformAudio[AudioNormalize@AudioChannelMix[#, 1]& /@ ExampleData[#, "Audio"]& /@ list, SampleRate -> 11025];
Wolfram Language code: mfcc = AudioLocalMeasurements[#, "MFCC", PartitionGranularity -> {.05, .01}]["Values"]& /@ a;
Wolfram Language code: ticks = Thread[{Range[Length@list], Text /@ list[[All, 2]]}];MatrixPlot[DistanceMatrix[mfcc], ImageSize -> Medium, FrameTicks -> {ticks, Apply[Rotate[#, Pi / 2]&, ticks, {2}]}]
AudioIntervalsを使うと,ユーザ定義の基準を満たす区間を抽出することができる.
録音の無音の区間を見付ける:
Wolfram Language code: a = ExampleData[{"Audio", "NoisyTalk"}, "Audio"]; nonVoicedIntervals = AudioIntervals[a, #RMSAmplitude < .02 && #SpectralFlatness > .0001&, .1, PartitionGranularity -> {.06, .01}]
Wolfram Language code: AudioPlot[a, Epilog -> {RGBColor[1, 0, 0, .3], Rectangle[{#[[1]], -1}, {#[[2]], 1}]& /@ nonVoicedIntervals}, ImageSize -> Medium]

高レベル解析

ニューラルネットワークベースの関数を使うと,信号のコンテンツについてのより深い洞察を得ることができる.
SpeechRecognize[audio]
audio の音声を認識し,これを文字列として返す
PitchRecognize[audio]
audio のメインピッチを認識する
AudioIdentify[audio]
audio が何の録音か識別する
ニューラルネットワークベースの機能の例
高レベルの音声解析を行う:
Wolfram Language code: a = SpeechSynthesize["hello i am a computer"]
Wolfram Language code: SpeechRecognize[a]
Wolfram Language code: PitchRecognize[a]//ListLinePlot
Wolfram Language code: AudioIdentify[a]
機械学習の関数はすべてAudioオブジェクトを認知しており,意味的に重要な特徴抽出から計算を実行する.
Classify[{audio1class1,audio2class2,…}]
与えられた例やクラスで訓練されたClassifierFunction[…]を生成する
FeatureExtraction[{audio1,audio2,…}]
与えられた例で訓練されたFeatureExtractorFunction[…]を生成する
FeatureSpacePlot[{audio1,audio2,…}]
audioi から抽出された特徴を散布図としてプロットする
高レベル機械学習関数の例
この処理は各音声オブジェクトを固定サイズのベクトルで変換するため,簡単に比較できる.
楽器の音のデータセットを分類する:
Wolfram Language code: data = Join@@Table[Thread[WebAudioSearch[instr, "Samples", Sequence[Slot["Duration"] < 5&, MaxItems -> 40]] -> instr], {instr, {"acoustic guitar", "drums", "trumpet"}}]; {train, test} = TakeDrop[RandomSample[data], 90];
Wolfram Language code: cl = Classify[train]
Wolfram Language code: ClassifierMeasurements[cl, test, "Report"]
FeatureSpacePlotを使って音声コレクションの特徴をプロットする.
FeatureSpacePlotを使って,意味的に重要な空間で信号のリストをプロットする:
Wolfram Language code: FeatureSpacePlot[ExampleData[#] -> #[[2]]& /@ ExampleData["Audio"], LabelingFunction -> Callout]

ニューラルネットワーク

Audioオブジェクトは,パワフルなニューラルネットワークフレームワークと緊密に統合されている.NetEncoderはAudioオブジェクト等のさまざまな高レベル構造にタメノニューラルネットの入り口を提供する.
"Audio"
信号を波形として符号化する
"AudioSpectrogram"
信号をすペクトログラムとして符号化する
"AudioMFCC"
信号をメルスペクトログラムとして符号化する
音声NetEncoderの例
いろいろな種類の特徴を計算するためには,異なるエンコーダを使うことができる.もとの信号の情報をすべて維持するもの("Audio"や"AudioSTFT"等)もあれば,いくらかの情報を捨てて次元を劇的に減少させるもの("AudioMFCC"等)もある.
異なるエンコーダを使って計算した特徴を可視化する.
Wolfram Language code: a = ExampleData[{"Audio", "Bird"}, "Audio"]
Wolfram Language code: Labeled[ListLinePlot[First@Transpose@Normal[NetEncoder["Audio"][a]]], "Audio"]
Wolfram Language code: Labeled[MatrixPlot[Log@Transpose@Normal[NetEncoder["AudioSpectrogram"][a]], DataReversed -> {True, False}], "AudioSpectrogram"]
Wolfram Language code: Labeled[MatrixPlot[Transpose@Normal[NetEncoder["AudioMFCC"][a]], DataReversed -> {True, False}], "AudioMFCC"]
エンコーダを使うと,ネットワークを始めから訓練して音声関連のタスクを解き,結果の性能を測定することが簡単にできる.
NetTrain[net,data]
データセット data でネットワーク net を訓練する
NetChain[{layer1,layer2,…}]
layeri の出力が layeri+1 の入力と接続されるネットを指定する
NetMeasurements[net,data,measurement]
data で評価された net に対してリクエストされた measurement を計算する
ニューラルネットワークの機能の例
NetChainおよびNetGraphを使うと,任意の位相のネットワークを作成し,GatedRecurrentLayerやLongShortTermMemoryLayer等の列に焦点を当てた層を使って可変長の信号を解析することができる.
0から9までの発話による数字を分類するネットワークを訓練する:
Wolfram Language code: net = NetChain[{GatedRecurrentLayer[64], GatedRecurrentLayer[64], GatedRecurrentLayer[10], AggregationLayer[Mean, 1], SoftmaxLayer[]}, "Input" -> NetEncoder["AudioMFCC"], "Output" -> NetDecoder[{"Class", Range[0, 9]}]]
Wolfram Language code: trainedNet = NetTrain[net, ResourceData["Spoken Digit Commands"], ValidationSet -> Scaled[.05]]
Wolfram Language code: NetMeasurements[trainedNet, ResourceData["Spoken Digit Commands", "TestDataset"], {"Accuracy", "ConfusionMatrixPlot"}]