질문 speechsynthesizer.setoutputtoaudiostream 오디오 형식 문제
-
05-07-2019 - |
문제
현재 특정 오디오 형식으로 인코딩 된 음성 전송이 필요한 응용 프로그램을 연구하고 있습니다.
System.Speech.AudioFormat.SpeechAudioFormatInfo synthFormat =
new System.Speech.AudioFormat.SpeechAudioFormatInfo(System.Speech.AudioFormat.EncodingFormat.Pcm,
8000, 16, 1, 16000, 2, null);
이는 오디오가 PCM 형식, 초당 8000 개의 샘플, 샘플 당 16 비트, 모노, 초당 16000 바이트, 2의 블록 정렬입니다.
다음 코드를 실행하려고 할 때 MemoryStream 인스턴스에 기록 된 것은 없습니다. 그러나 초당 8000 개의 샘플에서 11025로 변경하면 오디오 데이터가 성공적으로 작성됩니다.
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
waveStream = new MemoryStream();
PromptBuilder pbuilder = new PromptBuilder();
PromptStyle pStyle = new PromptStyle();
pStyle.Emphasis = PromptEmphasis.None;
pStyle.Rate = PromptRate.Fast;
pStyle.Volume = PromptVolume.ExtraLoud;
pbuilder.StartStyle(pStyle);
pbuilder.StartParagraph();
pbuilder.StartVoice(VoiceGender.Male, VoiceAge.Teen, 2);
pbuilder.StartSentence();
pbuilder.AppendText("This is some text.");
pbuilder.EndSentence();
pbuilder.EndVoice();
pbuilder.EndParagraph();
pbuilder.EndStyle();
synthesizer.SetOutputToAudioStream(waveStream, synthFormat);
synthesizer.Speak(pbuilder);
synthesizer.SetOutputToNull();
8000의 샘플 속도를 사용할 때 기록 된 예외 또는 오류는 없으며 SetoutputtoAudiostream과 관련하여 문서에서 유용한 내용을 찾을 수 없었으며 초당 11025 샘플에서 8000이 아닌 성공한 이유를 찾을 수 없었습니다. 사운드 편집 도구를 사용하여 올바른 샘플 속도로 생성 및 변환했지만 가능하면 응용 프로그램 내에서 오디오를 생성하고 싶습니다.
관심있는 한 가지 중요한 점은 SpeechRecognitionEngine이 오디오 형식을 받아들이고 합성 된 웨이브 파일에서 음성을 성공적으로 인식했다는 것입니다.
업데이트 : 최근 에이 오디오 형식은 특정 설치된 음성에 성공하지만 다른 사람들에게는 실패한다는 것을 발견했습니다. LH Michael 및 LH Michelle에게는 구체적으로 실패하며 프롬프트 빌더에 정의 된 특정 음성 설정마다 실패가 다릅니다.
해결책
LH Michael과 LH Michelle Voices는 단순히 8000Hz 샘플 속도를 지원하지 않을 가능성이 있습니다 (본질적으로 샘플> 8000Hz를 생성하기 때문에). SAPI를 사용하면 엔진이 지원되지 않는 요금을 거부 할 수 있습니다.
다른 팁
나는 내 수업을 만들었습니다 나우 디오 신시사이저에서 11025가 붙어있는 경우 오디오 데이터를 다른 샘플 속도로 변환 할 수 있도록 라이브러리. 살펴보십시오 WaveFormatConversionStream
(ACM을 사용하는) 또는 ResamplerDMO
(DirectX 미디어 개체 사용)
나는 비슷한 문제를 겪고 있었고 다른 사람을 돕는 경우에 대비하여 답장을 게시하고 싶었습니다. 이 스레드는 저를 답을 찾는 데 도움이되었습니다. 내 문제는 SpeechSynthesizer 출력을 WAV 파일로 출력 한 다음 Naudio와 함께 해당 WAV 파일을 재생하는 것이 었습니다. 파일에 출력되면 수정없이 작동했습니다. 그러나 메모리 스트림을 사용하려고 할 때 다시 재생 될 것이지만 너무 빨리 들었던 것은 삐걱 거리는 일이었습니다.
SpeechSyntheizer를 출력하기위한이 코드는 문제를 해결했으며 Naudio 측에서 수정이 필요하지 않습니다.
SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null);
synth.SetOutputToAudioStream(streamAudio, synthFormat);
88200이 핵심입니다. 기본적으로 이것은 11025입니다. Speechaudioformatinfo를 생성하고 88200으로 설정하는 것만으로도 필요합니다.