音声の合成
音声の合成
音声合成に使う最初の関数としてAudioGeneratorがある.
| AudioGenerator[model] | 指定された model の1秒の音声を生成する |
| AudioGenerator[model,t] | t 秒の音声を生成する |
信号を生成する最も簡単な方法は,AudioGeneratorでサポートされるネイティブの振動の一つを使うことである.
AudioGenerator["Sin"]AudioGenerator[{"Sin", 1000}]oscillators = {"Sin", "Sawtooth", "Square"};
Panel@TableForm[{
AudioGenerator[#, Appearance -> "Minimal"], AudioPlot[AudioGenerator[#], PlotRange -> .01, PlotTheme -> "Minimal"],
Periodogram[AudioGenerator[#], 2000, PlotRange -> {{0, 2000}, All}, Ticks -> {True, False}]
}& /@ oscillators, TableHeadings -> {oscillators, {"Audio", "Waveform", "Spectrum"}}, TableSpacing -> {2, 2}]vib = AudioGenerator[{"Sin", Quantity[6, "Hertz"], Pi}, 4];
AudioGenerator[{"Sin", 440 + 10vib}]AudioGenerator[{"Sin", 440 + 10Sin[2Pi 6#]&}, 4]vib = TimeSeries[Table[{t, Sin[2Pi 6t]}, {t, 0, 4, 1 / 200}]];
AudioGenerator[{"Sin", 440 + 10vib}]AudioGeneratorは,振動器の他,異なる種類のノイズ信号の生成を可能にする.
AudioGenerator["Pink"]noises = {"White", "PeriodicRandomNoise", "Pink", "Brown", "Blue", {"Color", 1.5}};
Periodogram[AudioGenerator /@ noises, 2000, ScalingFunctions -> {"Log10", "dB"}, PlotStyle -> {RGBColor[0.7777777777777778, 0.7777777777777778, 0.7777777777777778], RGBColor[0.8518518518518519, 0.8518518518518519, 0.8518518518518519], RGBColor[1, 0.5, 0.5], RGBColor[0.6, 0.4, 0.2], RGBColor[5/9, 5/9, 1], RGBColor[1, 0, 0]}, PlotLegends -> Placed[noises, Right]]white = AudioGenerator[{"White", NormalDistribution[]}]//AudioNormalizehistogram = Histogram[AudioData@white]Periodogram[white, 2000, PlotRange -> {All, {-40, 10}}, ScalingFunctions -> {"Log10", "dB"}]{"Color",α}を使うと,f-α 分布に従うスペクトルを持つ,色付きのノイズ信号を生成することができる.色付きのノイズには"Pink","Brown","Blue"があり,ここで α は1,2,
のいずれかである.
Manipulate[Periodogram[AudioGenerator[{"Color", α}], 2000, ScalingFunctions -> {"Log10", "dB"}, PlotRange -> {All, {-40, 10}}], {α, -2, 2}]AudioGeneratorを使うと,ランダム過程をサンプルすることで信号を生成することができる.
AudioGenerator[FractionalBrownianMotionProcess[.5]]//AudioNormalize(AudioGenerator[TelegraphProcess[2], 5] + 1).5AudioGenerator["Sin", 5]TimeSeriesから始まる音声信号を生成する:
windData = TimeSeriesRescale[WindSpeedData["KJFK", {DateObject[{2010, 1, 1}], DateObject[{2014, 1, 8}]}], {0, 1}];
ts = QuantityMagnitude@TimeSeries[windData, MissingDataMethod -> {"Interpolation", InterpolationOrder -> 0}];
AudioGenerator[Standardize@ts]//AudioNormalize減算合成
LowpassFilter[AudioGenerator["Sawtooth"], Quantity[1000, "Hertz"]]Manipulate[
lpFiltered = filter[AudioGenerator["Square", Appearance -> "Minimal"], Quantity[f, "Hertz"], 101, Padding -> "Periodic"];
TableForm[{{lpFiltered,
AudioPlot[lpFiltered, PlotRange -> .01, PlotTheme -> "Minimal", ImageSize -> Small],
Periodogram[lpFiltered, 1000, PlotRange -> {{0, 5000}, All}, Ticks -> {True, False}, ImageSize -> Small]}}],
{{f, 600, "Cutoff Frequency"}, 200, 4000}, {filter, {LowpassFilter, HighpassFilter}}, ContinuousAction -> False]加算合成
フィルタに使用で調和が減衰する減算合成とは対照的に,加算合成は調波を加えることに基づいている.その効果は,異なる周波数における正弦波の線形結合により得られる.ユーザは線形結合の係数を制御することができる.
Manipulate[
sineBank = Table[AudioGenerator[{"Sin", 200i}], {i, 8}];
amps = {a1, a2, a3, a4, a5, a6, a7, a8};
as = Mean[amps sineBank];
TableForm@{{as, Periodogram[as, 4000, PlotRange -> {{0, 2000}, All}, Ticks -> {True, False}, ImageSize -> Small]}},
{{a1, .5}, 0, 1}, {{a2, .5}, 0, 1}, {{a3, .5}, 0, 1}, {{a4, .5}, 0, 1}, {{a5, .5}, 0, 1}, {{a6, .5}, 0, 1}, {{a7, .5}, 0, 1}, {{a8, .5}, 0, 1}, ContinuousAction -> False, ControlPlacement -> Top]振幅変調
振幅変調では,carrier(搬送波)とmodulator(変調波)の2つの信号が使われる.結果は carrier(1+μmodulator)で計算される.ここでスケール係数 μ は変調度と呼ばれる.
carrier = AudioGenerator[{"Triangle", 200}, 2];
modulator = AudioGenerator[{"Sin", 100}, 2];
modIndex = .8;
am = carrier * (1 + modIndex * modulator)//AudioNormalizePeriodogram[am, 8000, PlotRange -> {{0, 2000}, All}, GridLines -> {Table[f, {f, 200, 2000, 400}], None}]周波数変調
cf = 500;
mf = 200;
modulator = mf * AudioGenerator[{"Sin", mf}];
modIndex = 1;
fm = AudioGenerator[{"Sin", cf + modIndex * modulator}]Periodogram[fm, 8000, ScalingFunctions -> "Absolute", PlotRange -> {{0, 1100}, {0, 800}}, GridLines -> Automatic]cf = 500;
mf = 100;
modIndex = {1, 2, 3};
fm = Table[AudioGenerator[{"Sin", cf + mIndex mf Sin[2 Pi mf #]&}], {mIndex, modIndex}];
periodograms = Table[Periodogram[fm[[i]], 20000, ScalingFunctions -> "Absolute", ImageSize -> Small, PlotRange -> {{0, 1000}, All}, GridLines -> Automatic, PlotLabel -> "Modulation Index: = " <> ToString[modIndex[[i]]]], {i, Length@modIndex}];
Grid[{fm, periodograms}]cf = 500;
ratios = {3 / 2, Sqrt[2], Pi};
fm = Table[mf = cf / r;
AudioGenerator[{"Sin", cf + 3.2 mf Sin[2 Pi mf #]&}], {r, ratios}];
periodograms = Table[Periodogram[fm[[i]], 20000, ScalingFunctions -> "Absolute", ImageSize -> Small, PlotRange -> {{0, 1000}, All}, GridLines -> Automatic, PlotLabel -> "FractionBox[SubscriptBox[c, f], SubscriptBox[m, f]] = " <> ToString[ratios[[i]], FormatType -> StandardForm]], {i, Length@ratios}];
Grid[{fm, periodograms}]cf = 500;
mf = cf / 6;
modulator = mf AudioGenerator[{"Sin", mf}, 5];
modIndex = 3AudioGenerator[{"Sawtooth", .1}, 5];
fm = AudioGenerator[{"Sin", cf + modIndex modulator}]Spectrogram[fm, 4096, 4096, HannWindow, PlotRange -> {All, {0, 1200}}]cf = 500;
mf = 100 + 400AudioGenerator[{"Sawtooth", .1}, 5];
modulator = mf AudioGenerator[{"Sin", mf}];
fm = AudioGenerator[{"Sin", cf + 3 modulator}]Spectrogram[fm, 4096, 4096, HannWindow, PlotRange -> {All, {0, 3000}}]