代码之家  ›  专栏  ›  技术社区  ›  Rodney

如何在Silverlight应用程序的Microsoft Translate API中消除翻译结束时的“单击”声音

  •  2
  • Rodney  · 技术社区  · 14 年前

    然而,在每一次翻译结束时,都会有一个wierd-click噪音(听起来好像有人在打开或关闭麦克风)。

    Here is an online Silverlight app which demonstrates the issue . 输入一些内容并翻译(可以是同一种语言),然后听对话的结尾。

    我能做些什么来消除这种噪音吗?我想把WAV文件读到90%,然后在声音出现之前停止它,但我想从技术上理解为什么它会带着噪音回来,问题在哪里,这样我就能找到最好的解决方案。

    :Brad的有用线索显示问题出在 WaveMediaStreamSource

    这和 online project here

    所以。。。你知道当WaveMediaStreamSource转换时如何消除噼啪声吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Brad    14 年前

    我不确定这是否有用,但点击噪声似乎不在WAV文件中。

    我用过 Fiddler 找出从服务器返回的响应并将其保存到WAV文件。打开它 Audacity

    所以,单击可能是Silverlight stopping中组件的正常声音。但是,我有不同的理论。

        2
  •  0
  •   Peter Muller    13 年前

    我也有同样的问题。我相信每个人都有。我就是这样解决的。

    基本上,我在音频播放结束前1秒向执行回调的流添加了一个标记。然后,该回调会触发一个计时器,该计时器在700毫秒后调用,该方法会在音频完成之前停止音频(大约300毫秒)。我试过没有这个计时器,这是不一致的。如果你在终点前300米设置一个标记,它就不会一直开火。最好是提前一秒钟拿到,然后自己计时,等你准备好了就把它关掉。

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