2016-02-09 5 views
5

Ich habe einigen einfachen Code eine Wave-Datei mit TTS zu erzeugen und spielt es dann:Länge in der Zeit eine Wave-Datei

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

Alles funktioniert gut, aber ich mag wissen, bevor ich die Welle zu spielen beginnen Datei, wie lange es dauern wird. Gibt es eine Möglichkeit, dies zu berechnen, oder ist es irgendwo verfügbar?

Wenn es irgendwo verfügbar ist, wie wird es berechnet? Ich nehme an, dass es sich auf die Menge der Daten im Stream bezieht, aber wie?

+0

ähnliche Frage wurde bereits hier beantwortet http://stackoverflow.com/questions/82319/how-can-i-determine-the-length-of-a-wav-file-in-c –

+0

Es wird einen Weg geben, nichts ist unmöglich. Dieser hat mich süchtig. Ich poste, was mir einfällt, wenn mir etwas einfällt - bei diesem Ereignis werde ich mit meinem Schwanz zwischen meinen Beinen in die Ferne gehen. – Gabe

+0

Wie in dem verlinkten Artikel gepostet, gibt es keine _reliable_ Art und Weise, dies zu tun, jedoch ist die Lösung von Genti ein guter Weg, um Ihre Ergebnisse zu erzielen. Siehe Kommentare von Genti's Beschreibung für Details zur Längenberechnung. – Gabe

Antwort

2

können Sie verwenden CSCore oder NAudio:

CSCORE (extrahiert aus this sample, aktuelle Wiedergabeposition und Gesamtdauer here verwendet werden):

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

Siehe auch the MSDN docs for TimeSpan.

Die Dauer wird von der Gesamtlänge der Wellendaten berechnet (die eine Schätzung für komprimierte Dateien sein kann) und der durchschnittlichen Bytes pro Sekunde (entsprechend den NAudio source in Eigenschaft TotalTime):

totalTimeInSeconds = LengthInBytes/AverageBytesPerSecond; 
+0

Er hat jedoch Zugriff auf den 'Stream'. Der Synthesizer schreibt in den 'Stream'. –

+1

Ich löschte meinen Kommentar direkt nach dem Posten, als ich den Fehler meiner Logik sah, als ich auf "add" klickte. Entschuldigung, mein Freund. – Gabe

+0

Danke dafür. "Die Dauer berechnet sich aus der Gesamtlänge der WAVE-Daten (die eine Schätzung für komprimierte Dateien sein können) und den durchschnittlichen Bytes pro Sekunde." Wo finde ich die durchschnittlichen Bytes pro Sekunde? Dies verwendet CSCore. – jgm

0
using CSCore; 

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