0

我是 C# 的新手,我似乎找不到我的代码的问题。我正在尝试从 Google Translate text-to-speech 网站获取音频文件并播放它,但我不断收到错误消息:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll
Additional information: The wave header is corrupt.

有人可以让我知道我的代码中有什么问题吗?方法是:

    public static void PlayWord(string Query)
    {
        string GoogleTranslateURL = "http://translate.google.com/translate_tts?tl=en";
        System.Net.WebRequest req = System.Net.WebRequest.Create(GoogleTranslateURL + (string.IsNullOrEmpty(Query) ? "" : "&q=" + Query));

        using (var ms = new MemoryStream())
        {
            using (Stream webStream = req.GetResponse().GetResponseStream())
            {
                var buffer = new byte[4096];
                int read;
                while (webStream != null && (read = webStream.Read(buffer, 0, buffer.Length)) > 0)
                    ms.Write(buffer, 0, read);
            }
            using (SoundPlayer player = new SoundPlayer(ms))
            {
                if (ms.CanSeek) ms.Seek(0, System.IO.SeekOrigin.Begin);
                player.Stream = null;
                player.Stream = ms;
                player.Play();
            }
        }
    }
4

3 回答 3

0
        string GoogleTranslateURL = @"http://translate.google.com/translate_tts?tl=en&q=pop";
        System.Net.WebRequest req = System.Net.WebRequest.Create(GoogleTranslateURL);

        string a = req.GetResponse().ContentType;


        using (Stream webStream = req.GetResponse().GetResponseStream())
        {
            FileStream stream = new FileStream(@"C:\Projects\EverydayProject\pop.wav", FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl, FileShare.ReadWrite, 100, FileOptions.None);

            webStream.CopyTo(stream);
            stream.Close();
            webStream.Close();
        }


        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe";
        startInfo.Arguments = @"C:\Projects\EverydayProject\pop.wav";
        var process = Process.Start(startInfo);

        if(!process.HasExited)
        {
            process.Refresh();
            Thread.Sleep(1000);
        }

        process.CloseMainWindow();
        process.Close();

        if (File.Exists(@"C:\Projects\EverydayProject\pop.wav"))
            File.Delete(@"C:\Projects\EverydayProject\pop.wav");

问题不在 HTTP 请求中!这对我有用,问题出在 SoundPlayer 类中。检查如何使用 SoundPlayer。

于 2014-10-05T00:32:18.750 回答
0

SoundPlayer只能播放WAV文件,这里是msdn所说的:

SoundPlayer 类为加载和播放 .wav 文件提供了一个简单的接口。

但是 google 用 mp3 文件回复,所以请尝试使用MediaPlayer

var mp = new MediaPlayer();
mp.Open(new Uri(GoogleTranslateURL + (string.IsNullOrEmpty(Query) ? "" : "&q=" + Query)));
mp.Play();
于 2014-10-05T01:52:46.697 回答
-1

尝试:

Player.Stream.Position = 0;

于 2014-10-05T01:32:40.583 回答