微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Windows.Media.SpeechSynthesis 保存音频?

如何解决如何使用 Windows.Media.SpeechSynthesis 保存音频?

我将 Windows.Media.SpeechSynthesis 用于 TTS,并且在我的 WPF 应用程序中播放音频信号工作正常。我想保存一个音频信号,但是如果我调用 StorageFolder,我会收到一个错误:HRESULT: 0x80073D54 - 该进程没有包标识。如何解决?整个代码如下。我还想知道使用 Win 10 TTS 中的音频文件有哪些权利?我没有在任何地方找到它 - 但我并没有寻找那么多......

private async void Talk(string text)
{
    var stream = await speechSynthesizer.SynthesizeTextToStreamAsync(text);

    StorageFolder localfolder = ApplicationData.Current.LocalFolder;
    StorageFile sampleFile = await localfolder.CreateFileAsync("sample.wav",CreationCollisionoption.ReplaceExisting);
    using (var reader = new DataReader(stream))
    {
        await reader.LoadAsync((uint)stream.Size);
        IBuffer buffer = reader.ReadBuffer((uint)stream.Size);
        await FileIO.WriteBufferAsync(sampleFile,buffer);
    }
}

解决方法

最后,我找到了一个解决方案,如何通过 Naudio 将 tts 中的流保存到 *.wav 或 *.mp3。我不知道它是否清楚,但它是功能性的:

public bool ByteArrayToFile(string fileName,byte[] byteArray)
{
    try
    {
        using (var fs = new FileStream(fileName,FileMode.Create,FileAccess.Write))
        {
            fs.Write(byteArray,byteArray.Length);
            return true;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception caught in process: {0}",ex);
        return false;
    }
}

private async Task SaveAudio(string text)
{
    var stream = await speechSynthesizer.SynthesizeTextToStreamAsync(text);

    using (var reader = new DataReader(stream))
    {
        await reader.LoadAsync((uint)stream.Size);
        IBuffer buffer = reader.ReadBuffer((uint)stream.Size);
        DataReader dataReader = DataReader.FromBuffer(buffer);
        byte[] bytes = new byte[buffer.Length];
        dataReader.ReadBytes(bytes);
        //ByteArrayToFile("sample.wav",bytes);
        ConvertWavStreamToMp3File(bytes,TB_File.Text);
        MessageBox.Show("Audio was saved to file: " + TB_File.Text,"Info");
    }
}

public static void ConvertWavStreamToMp3File(byte[] wavFile,string savetofilename)
{
    using (var retMs = new MemoryStream())
    using (var ms = new MemoryStream(wavFile))
    using (var rdr = new WaveFileReader(ms))

    using (var wtr = new LameMP3FileWriter(savetofilename,rdr.WaveFormat,LAMEPreset.VBR_90))
    {
        rdr.CopyTo(wtr);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。