2010-11-10 3 views
2

J'utilise MS Translator pour renvoyer un fichier WAV de texte pour activer "parler" dans mon application Silverlight 4. Cependant, à la fin de chaque traduction, il y a un bruit de clic bizarre (on dirait que quelqu'un allume ou éteint un microphone).Comment se débarrasser du son "clic" à la fin de la traduction dans Microsoft Translate API dans l'application Silverlight

Here is an online Silverlight app which demonstrates the issue. Tapez quelque chose dedans et traduisez-le (peut être la même langue) et écoutez la fin de la conversation.

Y a-t-il quelque chose que je puisse faire pour me débarrasser de ce bruit? Je pensais lire le fichier WAV à 90% et l'arrêter avant le son mais je voudrais comprendre techniquement pourquoi il revient avec le bruit et où le problème est afin que je puisse trouver la meilleure solution pour cela.

MISE À JOUR: ci-dessous, il semble utile de plomb Après Brad que le problème est dans le WaveMediaStreamSource qui convertit le fichier WAV retourné dans un format Silverlight peut utiliser.

Ceci est le même mentionné/utilisé dans le online project here.

Alors ... une idée de comment se débarrasser du son crépitant lorsque WaveMediaStreamSource le convertit?

Répondre

2

Je ne sais pas si cela est utile, mais il semble que le bruit de clic ne soit pas dans le fichier WAV lui-même.

J'ai utilisé Fiddler pour extraire la réponse revenant du serveur et enregistrée dans un fichier WAV. Ouverture que dans Audacity, je peux clairement entendre la traduction à la fin ... pas de clic. Par conséquent, ce clic peut être le son normal du composant dans l'arrêt Silverlight. Cependant, j'ai une théorie différente.

Le fichier WAV lui-même est échantillonné à 8 kHz. C'est un peu bizarre. Je parie que le bruit de clic est un artefact de la carte son ou du logiciel (Silverlight/pilote audio/Windows lui-même, etc.) up-sampling à un taux plus approprié. Ceci est testable. Essayez de créer un fichier WAV et utilisez Fiddler ou un autre outil proxy HTTP pour renvoyer votre fichier WAV au lieu de ce qui a été demandé au serveur Microsoft. Voyez si votre WAV (à 44,1 kHz par exemple) a le même problème.

+0

Merci pour la réponse Brad, c'est une piste - pouvez-vous me donner quelques conseils sur ce que vous entendez par retuning le fichier WAV dans Fiddler? Est-ce différent de simplement intégrer le son dans votre application SL et de le jouer avec un MediaElement? – Rodney

+0

Ok, j'ai compris ce que vous vouliez dire - en sauvant le corps de la réponse dans Fiddler vous avez le fichier wav 8khz qui, comme vous l'avez souligné, n'a pas le crépitement à la fin. J'ai creusé plus profondément dans le code et ajouté quelques points à mon post original (je pense que c'est le WaveMediaStreamSource qui le fait alors, mais je ne sais toujours pas comment le réparer!) – Rodney

+0

Intéressant. Malheureusement, je n'ai jamais codé pour Silverlight auparavant, donc je n'ai aucun moyen d'aider davantage. Encore une fois, je regarderais ce qui se passe quand l'audio s'arrête. Si la fréquence d'échantillonnage change brusquement pendant la lecture, il y a peut-être un problème. – Brad

0

J'ai eu le même problème. Je suis sûr que tout le monde le fait. Voici comment je l'ai résolu.

Fondamentalement, j'ai ajouté un marqueur au flux qui a effectué le rappel 1 seconde avant la fin de la lecture de l'audio. Ce rappel déclenche alors une temporisation appelée 700 ms plus tard et cette méthode arrête l'audio (environ 300 ms) avant qu'elle ne soit terminée. Je l'ai essayé sans ce minuteur et c'était inconsistant. Il semble que si vous mettez un marqueur à tirer 300ms avant la fin, il ne tirera pas toujours. Mieux vaut l'avoir une seconde avant et ensuite lancer votre propre minuterie pour le couper lorsque vous êtes prêt.

Voici les extraits de code pertinents. J'espère que ça peut aider quelqu'un d'autre. Il y a plein d'autres astuces pour écrire un lecteur audio fluide, mais ce code devrait résoudre au moins votre problème de clic.

public void Page_Loaded(object sender, EventArgs args) 
    { 

     mediaElement.MediaOpened += new RoutedEventHandler(mediaElement_MediaOpened); 
     mediaElement.MarkerReached += new TimelineMarkerRoutedEventHandler(mediaElement_MarkerReached); 
    } 



    Timer t; 
    void mediaElement_MarkerReached(object sender, TimelineMarkerRoutedEventArgs e) 
    { 
     // almost completed playing the file so lets stop before the annoying click is heard 
     t = new Timer(handleStopTimerDone, "", 700, 0); 
    } 

    public void handleStopTimerDone(object state) 
    { 
     // stop the audio playing 
     Stop(); 
    } 




    private void mediaElement_MediaOpened(object sender, RoutedEventArgs e) 
    { 
     TimeSpan duration = mediaElement.NaturalDuration.TimeSpan; 
     TimelineMarker newMarker = new TimelineMarker(); 
     newMarker.Time = new TimeSpan(duration.Ticks - 10000000); 
     while (mediaElement.Markers.Count > 0) 
     { 
      mediaElement.Markers.RemoveAt(0); 
     } 
     mediaElement.Markers.Add(newMarker); 


    } 


    public void Stop() 
    { 

      this.Dispatcher.BeginInvoke(delegate() 
      { 
       mediaElement.AutoPlay = false; 
       mediaElement.Stop(); 
       mediaElement.Position = TimeSpan.FromSeconds(0); 
       if (memData != null) 
       { 
        WaveMediaStreamSource wavMss = new WaveMediaStreamSource(memData); 
        mediaElement.SetSource(wavMss); 
       } 
      }); 
    } 
Questions connexes