如何摆脱"";点击";Silverlight应用程序中Microsoft Translate API中翻译结束时的声音

如何摆脱"";点击";Silverlight应用程序中Microsoft Translate API中翻译结束时的声音,silverlight,silverlight-4.0,translation,wav,Silverlight,Silverlight 4.0,Translation,Wav,我正在使用MS Translator发回一个WAV文本文件,以便在我的Silverlight 4应用程序中启用“对话” 然而,在每次翻译结束时,都会有一种尖锐的咔嗒声(听起来好像有人在打开或关闭麦克风) 。输入并翻译(可以是同一种语言),然后听对话的结尾 我能做些什么来消除这种噪音吗?我想把WAV文件读到90%,然后在发出声音之前停止,但我想从技术上理解为什么它会带着噪音回来,问题出在哪里,这样我才能找到最好的解决方案 更新:在Brad给出下面有用的线索之后,问题似乎在于如何将返回的WAV转换为

我正在使用MS Translator发回一个WAV文本文件,以便在我的Silverlight 4应用程序中启用“对话”

然而,在每次翻译结束时,都会有一种尖锐的咔嗒声(听起来好像有人在打开或关闭麦克风)

。输入并翻译(可以是同一种语言),然后听对话的结尾

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

更新:在Brad给出下面有用的线索之后,问题似乎在于如何将返回的WAV转换为Silverlight可以使用的格式

这与本手册中提到/使用的相同


所以。。。知道如何消除WaveMediaStreamSource转换时发出的噼啪声吗?

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

我过去常常从服务器中找出响应并将其保存到WAV文件中。打开它,我可以清楚地听到翻译到最后。。。没有点击

因此,这种咔哒声可能是Silverlight停止中组件的正常声音。然而,我有一个不同的理论


WAV文件本身的采样频率为8kHz。这有点奇怪。我敢打赌,咔嗒声是声卡或软件(silverlight/音频驱动程序/windows本身等)将采样提高到更合适的速率的产物。这是可以测试的。尝试创建一个WAV文件,并使用Fiddler或其他HTTP代理工具返回您的WAV,而不是从Microsoft服务器请求的WAV。查看您的WAV(例如44.1kHz)是否存在相同的问题。

我也有同样的问题。我相信每个人都是这样。下面是我如何解决它的

基本上,我在流中添加了一个标记,在音频播放结束前1秒执行回调。然后,该回调会触发一个在700ms后调用的计时器,该方法会在音频完成之前停止音频(大约300ms)。我在没有定时器的情况下试过,结果不一致。如果你在比赛结束前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);
                }
            });
    }

谢谢你的回答,布拉德,这是一个线索-你能给我一些提示,告诉我你在Fiddler中重新调整不同的WAV文件是什么意思吗?这与将声音嵌入SL应用程序并使用MediaElement播放不同吗?好的,我明白了你的意思-通过将响应体保存在Fiddler中,你得到了8khz wav文件,正如你所指出的,该文件的结尾没有裂纹。我已经深入研究了代码,并在我的原始帖子中添加了一些要点(我认为当时是WaveMediaStreamSource在做这件事,但我仍然不知道如何修复它!)很有趣。不幸的是,我以前从未为Silverlight编写过代码,因此我没有任何方法可以进一步提供帮助。同样,我会研究音频停止时会发生什么。如果在播放过程中采样率突然改变,则可能存在问题。此外,我以前在其他.NET应用程序中遇到过问题,在这些应用程序中,垃圾收集器会在播放WAV时收集内存中WAV的资源。这将导致令人讨厌的噪音,因为缓冲区只是内存中的随机位。也许这就是发生在你身上的事情,但只是在很短的一段时间内。尝试为WaveMediaStreamSource和实际播放的资源创建全局变量。或者至少,在一个不会消失的课堂上。