2016-02-09 14 views
5

Bazı basit bir kod TTS kullanarak bir dalga dosyası oluşturma ve sonra oynamaya vardır:Uzunluk

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

Her şey iyi çalışıyor, ama ben dalga çalmaya başlamadan önce bilmek istiyorum dosya ne kadar süre devam edecek. Bunu hesaplamanın bir yolu var mı, yoksa bir yerlerde mi mevcut?

Bir yerlerde kullanılabilir, nasıl hesaplanır? Akımdaki veri miktarıyla ilgili olduğunu düşünüyorum, ama nasıl? (this sample çıkarılan, mevcut pleybek pozisyonu ve süre here kullanılır)

CSCore:

+0

benzer soru zaten burada cevaplandı http://stackoverflow.com/questions/82319/how-can-i-determine-the-length-of-a-wav-file-in-c –

+0

Bir yolu olacak, hiçbir şey imkansız. Bu beni bağladım. Ben bir şey ile gelmek - ben bu olay ile gelip, ben ayaklarım arasında benim kuyruk ile mesafe içine yürüyeceğim. – Gabe

+0

Bağlantılı makalede yayınlandığı gibi, daha önce _reliable_ yolu yoktur, ancak Genti'nin çözümü sonuçlarınızı elde etmenin iyi bir yoludur. Uzunluk hesaplama detayları için Genti'nin açıklamalarına bakınız. – Gabe

cevap

2

için CSCore veya NAudio kullanabilir

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; 
} 

Ayrıca bkz. the MSDN docs for TimeSpan.

süresi (sıkıştırılmış dosyalar için bir tahmin olabilir) DALGA toplam veri uzunluğunda olan ve (özelliği TotalTime içinde NAudio source göre) saniye başına ortalama bayt hesaplanır

:

totalTimeInSeconds = LengthInBytes/AverageBytesPerSecond; 
+0

Ancak "stream" ye erişimi var. Sentezleyici "akış" a yazar. –

+1

Yorumumu, "ekle" yi tıkladıkça mantığımın hatasını gördüğümde, yayınladıktan sonra doğrudan sildim. Üzgünüm arkadaşım. – Gabe

+0

Bunun için teşekkürler. "Süre, WAVE verilerinin toplam uzunluğu (sıkıştırılmış dosyalar için bir tahmin olabilir) ve saniye başına ortalama bayt olarak hesaplanır" Saniye başına ortalama bayt nerede bulabilirim? Bu CSCore kullanıyor. – jgm

0
using CSCore; 

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