c# - 如何使用 Windows.Media.SpeechSynthesis 保存音频?
问题描述
我正在为 TTS 使用 Windows.Media.SpeechSynthesis 并在我的 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);
}
}
解决方案
最后,我找到了一个解决方案,如何将流从 tts 保存到 *.wav 或 Naudio 的 *.mp3 中。我不知道它是否清楚,但它是功能性的:
public bool ByteArrayToFile(string fileName, byte[] byteArray)
{
try
{
using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
fs.Write(byteArray, 0, 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);
}
}
推荐阅读
- azure - 如果我没有添加,Web App 从哪里获取证书?
- java - 使用 SonarQube Scanner 分析 java 代码时出错
- python - Influx DB Python'列表索引必须是整数而不是str'
- pdf - 使用 Ghostscript 从 PDF 转换为 PCL 时重音字的错误字符
- javascript - 实现npm包自定义组件VueJS
- spring-boot - 成功请求后,Mono 获取 OnCancel 而不是 OnSuccessOrError
- ios - 更新 PromiseKit 后出错:无法将“PMKFinalizer”类型的值转换为预期的参数类型“Promise”
' - node.js - 纱线显示找不到命令
- asp.net-mvc - Net MVC Telerik 应用程序在 MS Edge 中出现 UI 问题
- javascript - 为什么 Google Chrome 和 Firefox 中不显示 base64 编码的图像?