Pregunta

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

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, alineación de bloque de 2.

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

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 ni errores registrados cuando se utiliza una frecuencia de muestreo de 8000 y no pude encontrar nada útil en la documentación sobre SetOutputToAudioStream y por qué tiene éxito a 11025 muestras por segundo y no a 8000. Tengo una solución que implica una wav Archivo que generé y convertí a la frecuencia de muestreo correcta utilizando algunas herramientas de edición de sonido, pero me gustaría generar el audio desde la aplicación si puedo.

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

Actualización: Recientemente descubrí que este formato de audio es exitoso para ciertas voces instaladas, pero falla para otras. Falla específicamente para LH Michael y LH Michelle, y la falla varía para ciertas configuraciones de voz definidas en el PromptBuilder.

¿Fue útil?

Solución

Es completamente posible que las voces de LH Michael y LH Michelle simplemente no admitan frecuencias de muestreo de 8000 Hz (porque generan de forma inherente muestras > 8000 Hz). SAPI permite que los motores rechacen tarifas no admitidas.

Otros consejos

He creado algunas clases en mi biblioteca NAudio para permitirle convertir sus datos de audio a Diferente frecuencia de muestreo, si te quedas con 11025 del sintetizador. Eche un vistazo a WaveFormatConversionStream (que usa ACM) o ResamplerDMO (usa un objeto de medios de DirectX)

Tenía 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 estaba teniendo la salida SpeechSynthesizer en un archivo WAV y luego reproducía ese archivo WAV con NAudio. Cuando se envía a un archivo, funciona sin modificación. Sin embargo, cuando intentas usar un MemoryStream, se reproduce, pero tan rápido todo lo que escuchaste fue un chirrido.

Este código para generar el SpeechSynthesizer solucionó el problema, y ??no se necesita ninguna modificación en el lado de NAudio:

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

El 88200 es la clave. De forma predeterminada, esto es 11025. Todo lo que se necesita es crear SpeechAudioFormatInfo y configurarlo en 88200.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top