2013-05-19 33 views
3

我試圖讓.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; 
    } 
} 

低通濾波器還沒有應用,儘管問題仍然是開放的如果有人有一個很好的答案提供和/或更好的方式來做:)

+0

你是否知道這個正弦(t)將在某些時候= 0? –

+0

我知道它會,但afaik,這是環調製工作的方式 –

回答

0

我曾在音頻處理一段時間。有一些「機器人效應」的另一種方法是重複相同的頻率幾毫秒,而不是有一個良好的平滑曲線。

就拿頻率值的區間
平均價值
寫平均到您的輸出緩衝器的整個區間

有不同的「機器人效應」不發音相同,這將不聽起來像擎天柱,但將無誤地似乎是電腦生成