2013-05-19 4 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, 그것은 방법이다 Ring modulation works –

답변

0

나는 얼마 동안 오디오 처리를 해왔다. "로봇 효과"가있는 또 다른 방법은 곡선을 잘 매끄럽게하는 대신 동일한 주파수를 몇 밀리 초 동안 반복하는 것입니다.

값이
전체 구간에 대한 귀하의 출력 버퍼의 평균 쓰기
평균 간격의 주파수 값을 가지고 같은 소리를하지 않는 다른 "로봇 효과"가 있습니다

, 이것은하지 않습니다 옵티머스 프라임처럼 들리 겠지만, 틀림없이 컴퓨터가 생성되는 것 같습니다