2008-10-31 28 views
5

Actualmente estoy trabajando en una aplicación que requiere la transmisión de voz codificada a un formato de audio específico.Pregunta SpeechSynthesizer.SetOutputToAudioStream problema de formato de audio

System.Speech.AudioFormat.SpeechAudioFormatInfo synthFormat = 
         new System.Speech.AudioFormat.SpeechAudioFormatInfo(System.Speech.AudioFormat.EncodingFormat.Pcm, 
          8000, 16, 1, 16000, 2, null); 

Esto indica que el audio está en formato PCM, 8000 muestras por segundo, 16 bits por muestra, mono, 16000 bytes promedio por segundo, la alineación de bloques de 2.

Cuando intento para ejecutar la el siguiente código no hay nada escrito en mi instancia de MemoryStream; sin embargo, cuando cambio de 8000 muestras por segundo hasta 11025, los datos de audio se escriben con éxito.

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(); 

No hay excepciones o errores registrados cuando se utiliza una frecuencia de muestreo de 8000 y no pude encontrar nada útil en la documentación relativa a SetOutputToAudioStream y por qué tiene éxito en 11025 muestras por segundo y no 8000. Tengo una solución alternativa que involucra un archivo wav que he generado y convertido a la frecuencia de muestreo correcta utilizando algunas herramientas de edición de sonido, pero me gustaría generar el audio desde dentro de la aplicación si puedo.

Un punto de particular interés fue que la SpeechRecognitionEngine acepta que el formato de audio y con éxito reconocido el discurso en mi archivo de onda sintetizada ...

actualización: Hace poco descubrió que este formato de audio tiene éxito para ciertas voces instaladas, pero falla para otros. Falla específicamente para LH Michael y LH Michelle, y la falla varía para ciertas configuraciones de voz definidas en el PromptBuilder.

Respuesta

3

Es muy posible que las voces de LH Michael y LH Michelle simplemente no son compatibles con 8000 frecuencias de muestreo Hz (debido a que inherentemente generan muestras> 8000 Hz). SAPI permite que los motores rechacen las tarifas no admitidas.

1

He creado algunas clases en mi biblioteca NAudio para permitirle convertir sus datos de audio a una frecuencia de muestreo diferente, si está atascado con 11025 del sintetizador. Echar un vistazo a WaveFormatConversionStream (que utiliza ACM) o ResamplerDMO (utiliza un objeto de DirectX Media)

+0

Lo siento si te interrumpo, parece que eres experto en productos de audio, tengo [esta pregunta] (http://stackoverflow.com/q/33932390/2651073) que me ha confundido, ¿podrías ayudarme por favor? ¿ese? – Ahmad

1

Estaba teniendo un problema similar y quería publicar una respuesta en caso de que ayude a alguien. Este hilo me llevó a encontrar la respuesta. Mi problema era que tenía el resultado de SpeechSynthesizer en un archivo WAV y luego reproducía ese archivo WAV con NAudio. Cuando salió a un archivo, funcionó sin modificaciones. Sin embargo, al tratar de usar un MemoryStream, se reproducirá, pero tan rápido todo lo que escuchó fue un chirrido.

Este código para dar salida a la SpeechSynthesizer ha solucionado el problema, y ​​es necesaria ninguna modificación en el lado NAudio:

SpeechAudioFormatInfo synthFormat = new SpeechAudioFormatInfo(EncodingFormat.Pcm, 88200, 16, 1, 16000, 2, null); 
synth.SetOutputToAudioStream(streamAudio, synthFormat); 

El 88200 es la clave. Por defecto, esto es 11025. Crear todo el SpeechAudioFormatInfo y configurarlo en 88200 es todo lo que se necesita.

Cuestiones relacionadas