2016-02-09 13 views
5

मैं कुछ सरल कोड टीटीएस का उपयोग कर एक लहर फ़ाइल पैदा करने और फिर इसे खेलने के लिए है:लंबाई

public void TestSpeech() 
{ 
    SpeechSynthesizer synth = new SpeechSynthesizer(); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     synth.SetOutputToWaveStream(stream); 
     synth.Speak("Hello world"); 
     stream.Seek(0, SeekOrigin.Begin); 
     IWaveSource source = new WaveFileReader(stream); 
     EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset); 
     var soundOut = new WasapiOut(); 
     soundOut.Initialize(source); 
     soundOut.Stopped += (s, e) => waitHandle.Set(); 
     soundOut.Play(); 
     waitHandle.WaitOne(); 
     soundOut.Dispose(); 
     source.Dispose(); 
    } 
} 

सब कुछ ठीक काम कर रहा है, लेकिन मुझे पता है कि इससे पहले कि मैं लहर खेलने के लिए शुरू करना चाहता हूँ फ़ाइल के लिए कितनी देर तक चलेंगे। क्या इसकी गणना करने का कोई तरीका है, या यह कहीं उपलब्ध है?

यदि यह कहीं उपलब्ध है, तो इसकी गणना कैसे की जाती है? मुझे लगता है कि यह धारा में डेटा की मात्रा से संबंधित है, लेकिन कैसे?

+0

इसी तरह के प्रश्न का उत्तर यहां दिया गया है http://stackoverflow.com/questions/82319/how-can-i-determine-the-length-of-a-wav-file-in-c –

+0

कोई रास्ता नहीं होगा, कुछ भी नहीं होगा असंभव है। यह मुझे झुका हुआ है। अगर मैं कुछ भी लेकर आऊंगा, तो मैं जो पोस्ट करूंगा उसके साथ पोस्ट करूंगा - उस घटना पर मैं अपने पैरों के बीच अपनी पूंछ के साथ दूरी में चलेगा। – Gabe

+0

जैसा कि लिंक किए गए आलेख में पोस्ट किया गया है, पहले ऐसा करने का कोई _reliable_ तरीका नहीं है, हालांकि Genti का समाधान आपके परिणामों को प्राप्त करने का एक अच्छा तरीका है। लंबाई गणना विवरण के लिए Genti के विवरण की टिप्पणियां देखें। – Gabe

उत्तर

2

आप उपयोग कर सकते हैं CSCore या NAudio:

CSCore (this sample से निकाले गए, वर्तमान प्लेबैक स्थिति और कुल अवधि here उपयोग किया जाता है):

using System; 
using CSCore; 
using CSCore.Codecs.WAV; 

IWaveSource wavSource = new WaveFileReader(stream); 
TimeSpan totalTime = wavSource.GetLength(); 

NAudio:

using System; 
using NAudio.Wave; 

using (var wfr = new WaveFileReader(stream)) 
{ 
    TimeSpan totalTime = wfr.TotalTime; 
} 

भी the MSDN docs for TimeSpan देखें।

अवधि की कुल WAVE डेटा की लंबाई (जो कंप्रेस फ़ाइलों के लिए एक अनुमान किया जा सकता है) और (संपत्ति TotalTime में NAudio source के अनुसार) प्रति सेकंड औसत बाइट्स से की जाती है:

totalTimeInSeconds = LengthInBytes/AverageBytesPerSecond; 
+0

हालांकि उसके पास 'स्ट्रीम' तक पहुंच है। सिंथेसाइज़र 'स्ट्रीम' को लिखता है। –

+1

मैंने इसे पोस्ट करने के बाद सीधे अपनी टिप्पणी हटा दी क्योंकि मैंने अपने तर्क की त्रुटि देखी क्योंकि मैंने "एड" पर क्लिक किया था। क्षमा करो मेरे मित्र। – Gabe

+0

इसके लिए धन्यवाद। "अवधि WAVE डेटा की कुल लंबाई (जो संपीड़ित फ़ाइलों के लिए अनुमान हो सकती है) और प्रति सेकेंड औसत बाइट्स से गणना की जाती है" मुझे प्रति सेकंड औसत बाइट कहां मिलते हैं? यह सीएसकोर का उपयोग कर रहा है। – jgm

0
using CSCore; 

IWaveSource waveSource = new WaveFileReader(stream); 
TimeSpan totalTime = waveSource.GetLength(); //get length returns a timespan