سؤال

أعمل حاليًا على تطبيق يتطلب نقل الكلام المشفر إلى تنسيق صوتي محدد.

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.لدي حل بديل يتضمن ملف wav قمت بإنشائه وتحويله إلى معدل العينة الصحيح باستخدام بعض أدوات تحرير الصوت، ولكنني أرغب في إنشاء الصوت من داخل التطبيق إذا أمكنني ذلك.

كانت إحدى النقاط المثيرة للاهتمام هي أن SpeechRecognitionEngine يقبل تنسيق الصوت هذا ويتعرف بنجاح على الكلام في ملف الموجة المركب الخاص بي...

تحديث:تم اكتشاف مؤخرًا أن تنسيق الصوت هذا ينجح مع بعض الأصوات المثبتة، لكنه يفشل مع أصوات أخرى.لقد فشل خصيصًا لـ LH Michael وLH Michelle، ويختلف الفشل بالنسبة لبعض إعدادات الصوت المحددة في PromptBuilder.

هل كانت مفيدة؟

المحلول

من الممكن تمامًا أن أصوات LH Michael وLH Michelle ببساطة لا تدعم معدلات عينة تبلغ 8000 هرتز (لأنها تولد عينات بطبيعتها > 8000 هرتز).يسمح SAPI للمحركات برفض الأسعار غير المدعومة.

نصائح أخرى

لقد قمت بإنشاء بعض الفصول في ملفي ناوديو مكتبة للسماح لك بتحويل بياناتك الصوتية إلى معدل عينة مختلف، إذا كنت عالقًا مع 11025 من جهاز النطق.القي نظرة على WaveFormatConversionStream (الذي يستخدم ACM) أو ResamplerDMO (يستخدم كائن وسائط DirectX)

كنت أواجه مشكلة مماثلة وأردت نشر رد في حال كان ذلك مفيدًا لأي شخص.هذا الموضوع دفعني نحو العثور على الجواب.كانت مشكلتي هي أنني كنت أقوم بإخراج SpeechSynthesizer إلى ملف WAV، ثم تشغيل ملف WAV هذا باستخدام NAudio.عند إخراجه إلى ملف، كان يعمل بدون تعديل.ومع ذلك، عند محاولة استخدام MemoryStream، سيتم تشغيله، ولكن بسرعة كبيرة، كل ما سمعته هو صرير.

أدى هذا الرمز الخاص بإخراج SpeechSynthesizer إلى إصلاح المشكلة، ولا يلزم إجراء أي تعديل من جانب NAudio:

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

88200 هو المفتاح.بشكل افتراضي، هذا هو 11025.كل ما هو مطلوب هو إنشاء SpeechAudioFormatInfo وتعيينه على 88200.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top