2016-02-09 19 views
5

ho qualche semplice codice che genera un file wave utilizzando TTS e poi giocare:Lunghezza in tempo di un file 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(); 
    } 
} 

Tutto sta funzionando benissimo, ma voglio sapere prima di iniziare a suonare l'onda file per quanto tempo continuerà. C'è un modo per calcolarlo o è disponibile da qualche parte?

Se è disponibile da qualche parte, come viene calcolato? Suppongo che sia correlato alla quantità di dati nello stream, ma come?

+0

la domanda simile aveva già una risposta qui http://stackoverflow.com/questions/82319/how-can-i-determine-the-length-of-a-wav-file-in-c –

+0

Ci sarà un modo, niente è impossibile. Questo mi ha incatenato. Pubblicherò quello che mi viene in mente, se mi viene in mente qualcosa - in quell'evento andrò in lontananza con la mia coda tra le mie gambe. – Gabe

+0

Come postato nell'articolo collegato non esiste un modo _reliable_ di farlo prima, tuttavia la soluzione di Genti è un buon modo per raggiungere i risultati. Vedi i commenti alla descrizione di Genti per i dettagli del calcolo della lunghezza. – Gabe

risposta

2

È possibile utilizzare CSCore o NAudio:

CSCore (estratto da this sample, posizione di riproduzione e durata totale sono utilizzati 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; 
} 

Vedere anche the MSDN docs for TimeSpan.

La durata viene calcolata la lunghezza totale dei dati WAVE (che può essere un preventivo file compressi) ei byte medie per secondo (come da NAudio source in struttura TotalTime):

totalTimeInSeconds = LengthInBytes/AverageBytesPerSecond; 
+0

Lui ha accesso al 'stream' però. Il sintetizzatore scrive sul 'stream'. –

+1

Ho eliminato il mio commento direttamente dopo averlo postato come ho visto l'errore della mia logica quando ho cliccato su "aggiungi". Scusa amico mio. – Gabe

+0

Grazie per questo. "La durata è calcolata dalla lunghezza totale dei dati WAVE (che può essere una stima per i file compressi) e dei byte medi al secondo" Dove trovo i byte medi al secondo? Questo sta usando CSCore. – jgm

0
using CSCore; 

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