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