Question

Je travaille actuellement sur une application nécessitant la transmission de paroles codées dans un format audio spécifique.

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

Cela indique que l'audio est au format PCM, 8 000 échantillons par seconde, 16 bits par échantillon, mono, 16 000 octets par seconde en moyenne, alignement des blocs de 2.

Lorsque j'essaie d'exécuter le code suivant, rien n'est écrit dans mon instance MemoryStream. Cependant, lorsque je passe de 8 000 échantillons par seconde à 11025, les données audio sont écrites avec succès.

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

Il n'y a aucune exception ou erreur enregistrée lors de l'utilisation d'une fréquence d'échantillonnage de 8 000 et je n'ai trouvé aucun élément utile dans la documentation concernant SetOutputToAudioStream et la raison pour laquelle il réussit à 11025 échantillons par seconde et non à 8000. J'ai une solution de contournement impliquant un fichier wav. fichier que j’ai généré et converti à la fréquence d’échantillonnage correcte à l’aide de certains outils d’édition audio, mais j’aimerais générer le son à partir de l’application si je le peux.

Un point intéressant était que SpeechRecognitionEngine accepte ce format audio et a reconnu la parole dans le fichier wave synthétisé ...

Mise à jour: récemment découvert que ce format audio réussit pour certaines voix installées mais échoue pour d'autres. Il échoue spécifiquement pour LH Michael et LH Michelle, et l’échec varie pour certains paramètres de voix définis dans PromptBuilder.

Était-ce utile?

La solution

Il est tout à fait possible que les voix LH Michael et LH Michelle ne prennent tout simplement pas en charge les fréquences d'échantillonnage de 8 000 Hz (car elles génèrent de manière inhérente des échantillons supérieurs à 8 000 Hz). SAPI permet aux moteurs de rejeter les tarifs non pris en charge.

Autres conseils

J'ai créé des classes dans ma bibliothèque NAudio pour vous permettre de convertir vos données audio en un taux d'échantillonnage différent, si vous êtes bloqué avec 11025 du synthétiseur. Consultez WaveFormatConversionStream (qui utilise ACM) ou ResamplerDMO (utilise un objet média DirectX)

J'avais un problème similaire et je voulais poster une réponse au cas où cela aiderait quelqu'un. Ce fil m'a amené à trouver la réponse. Mon problème était, je suis en train d'avoir la sortie SpeechSynthesizer dans un fichier WAV, puis de lire ce fichier WAV avec NAudio. Lors de la sortie dans un fichier, cela fonctionnait sans modification. Cependant, lorsque vous essayez d’utiliser un MemoryStream, la lecture s’effectue, mais très rapidement, tout ce que vous entendez est un grincement.

Ce code de sortie de SpeechSynthesizer a résolu le problème. Aucune modification n’est nécessaire du côté de NAudio:

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

Le 88200 est la clé. Il s’agit par défaut de 11025. Il suffit de créer le SpeechAudioFormatInfo et de le définir sur 88200.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top