我試圖讓.NET SpeechSynthesizer的波形輸出使聲音聽起來像機器人一樣。乘以機器人語音的音頻信號C#
經過一番研究,我發現環調製可能是一個很好的選擇,以獲得我想要的效果。我已經看到公式基本上是Result(t) = Voice(t) * SineWave(t)
。
雖然,我沒有的我怎麼會從波流應用此效果的想法,是否有任何圖書館都來:
- 產生一個正弦波,並加工成波浪流
- 將兩個數據流相乘以獲得結果
如果不是,您是否知道其他選項?也許我可以用正弦波中的每個樣本乘以聲波流中的每個樣本?
我正在使用C#/.net框架。
謝謝!
編輯:好吧,經過幾個小時的失敗嘗試,我終於想出了什麼似乎是好的結果。唯一的問題是輸出端有很多劈啪聲,我發現的唯一解決方法是應用低通濾波器。
這裏就是我有這麼遠(快速,骯髒和註釋掉的代碼,而應該是自我解釋):
class Mixer
{
public static Stream RingModulation(Stream voiceStream, TimeSpan duration, SpeechAudioFormatInfo format)
{
var sineWave = SineOscillator.GenerateWave(duration, 80, 1, format);
var numSamples = Convert.ToInt32(duration.TotalSeconds * format.SamplesPerSecond);
var dataStream = new MemoryStream();
sineWave.Position = 0;
voiceStream.Position = 0;
var buf1 = new byte[2];
var buf2 = new byte[2];
for (var i = 0; i < numSamples; i++)
{
voiceStream.Read(buf1, 0, 2);
sineWave.Read(buf2, 0, 2);
var data = BitConverter.GetBytes(Convert.ToInt16(BitConverter.ToInt16(buf1, 0) * BitConverter.ToInt16(buf2, 0)));
dataStream.Write(data, 0, data.Length);
}
return dataStream;
}
}
class SineOscillator
{
public static Stream GenerateWave(TimeSpan duration, double frequency, int amplitude, SpeechAudioFormatInfo format)
{
var numSamples = Convert.ToInt32(duration.TotalSeconds * format.SamplesPerSecond);
var dataStream = new MemoryStream();
var angle = (Math.PI * 2 * frequency)/(format.SamplesPerSecond * format.ChannelCount);
for (var i = 0; i < numSamples; i++)
{
var data = BitConverter.GetBytes(Convert.ToInt16(amplitude * Math.Sin(angle*i)));
// Generate a sine wave in both channels.
dataStream.Write(data, 0, data.Length);
}
return dataStream;
}
}
低通濾波器還沒有應用,儘管問題仍然是開放的如果有人有一個很好的答案提供和/或更好的方式來做:)
你是否知道這個正弦(t)將在某些時候= 0? –
我知道它會,但afaik,這是環調製工作的方式 –