2016-02-09 16 views
5

mam jakiś prosty kod generujący plik wave za pomocą TTS, a następnie odtwarzanie go:Długość w czasie plik wave

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

Wszystko działa bez zarzutu, ale chcę wiedzieć, zanim zacznę grać na fali plik, jak długo to potrwa. Czy jest jakiś sposób na obliczenie tego, czy jest on gdzieś dostępny?

Jeśli jest on gdzieś dostępny, w jaki sposób jest obliczany? Zakładam, że jest to związane z ilością danych w strumieniu, ale w jaki sposób?

+0

podobne pytanie zostało już udzielone tutaj http://stackoverflow.com/questions/82319/how-can-i-determine-the-length-of-a-wav-file-in-c –

+0

Nie będzie sposobu, nic jest niemożliwe. Ten ma mnie uzależniony. Wezmę to, co wymyślę, jeśli coś wymyślę - na to wydarzenie odejdę w dal z moim ogonem między nogami. – Gabe

+0

Zgodnie z zamieszczonym w tym artykule artykułem nie ma _realizowanego_ sposobu, jednak rozwiązanie Genti jest dobrym sposobem na osiągnięcie twoich wyników. Zobacz opis komentarzy Genti dla szczegółów obliczania długości. – Gabe

Odpowiedz

2

można wykorzystywać CSCore lub NAudio:

CSCore (wyciąg z this sample, pozycja odtwarzania i całkowity czas stosuje 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; 
} 

Zobacz także the MSDN docs for TimeSpan.

Czas liczony jest od całkowitej długości danych fal (które mogą być oszacowanie plików skompresowanych), a średnia bajtów na sekundę (według NAudio source w własności TotalTime):

totalTimeInSeconds = LengthInBytes/AverageBytesPerSecond; 
+0

Ma jednak dostęp do 'stream'. Syntezator zapisuje do 'strumienia'. –

+1

Usunąłem swój komentarz bezpośrednio po opublikowaniu go, ponieważ widziałem błąd mojej logiki po kliknięciu "dodaj". Przepraszam przyjacielu. – Gabe

+0

Dzięki za to. "Czas trwania jest obliczany na podstawie całkowitej długości danych WAVE (która może być estymacją dla plików skompresowanych) i średniej liczby bajtów na sekundę" Gdzie znaleźć średnią bajtów na sekundę? To używa CSCore. – jgm

0
using CSCore; 

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