文本转 WAV 转换器
利用 Windows 窗体和语音 API 从文本创建 WAV 文件

引言
通常,您可以使用 Microsoft Word 或记事本等程序创建文档。如果它遵循一定的格式约定,那么大多数人都可以访问它。但是,如果您创建的内容可能需要部分视力或盲人访问,您会怎么做?
使用文本传达某些内容将非常困难或不可能。使用此程序,您可以将文本文件或您在程序文本区域中键入的内容转换为 WAV 音频,以便可以听到其中包含的信息。
背景
为了实现该程序的目标,您需要使用 Speech
API,我选择将其与 C# 结合使用。虽然生成的语音可能存在局限性,但最重要的是原始文本中包含的信息。如果文本不合适,那么对转换器的任何改进都无法使生成的文件更有用。
源代码
查找要转换的文本文件
第一步。正如我在介绍中所述,您可以转换您在程序文本区域中键入的任何内容,但这里的功能有限,因此最好使用外部程序创建文本文件。
private void Browse_Click(object sender, EventArgs e)
{
string fileName;
OpenFileDialog OpenFile = new OpenFileDialog();
try
{
OpenFile.CheckFileExists = true;
OpenFile.CheckPathExists = true;
OpenFile.DefaultExt = "txt";
OpenFile.DereferenceLinks = true;
OpenFile.Filter = "Text files (*.txt)|*.txt|" +
"RTF files (*.rtf)|*.rtf|" +
"Word Documents (*.doc)|*.doc|" +
"Works 6 and 7 (*.wps)|*.wps|" +
"Windows Write (*.wri)|*.wri|" +
"WordPerfect document (*.wpd)|*.wpd";
OpenFile.Multiselect = false;
OpenFile.RestoreDirectory = true;
OpenFile.ShowHelp = true;
OpenFile.ShowReadOnly = false;
OpenFile.Title = "Select a file to convert";
OpenFile.ValidateNames = true;
if (OpenFile.ShowDialog() == DialogResult.OK)
{
fileName = OpenFile.FileName;
StreamReader sr = new StreamReader(OpenFile.OpenFile());
aText.Text = sr.ReadToEnd();
}
}
catch
{
MessageBox.Show("Something is wrong here", "Text2Audio");
}
finally
{
if(sr != null)
{
sr.Close();
}
}
}
处理文件流时,必须使用 try-catch
块,并可选择使用 finally
块。这意味着您可以最大限度地减少运行时由例如文件损坏引起的问题。虽然我在 catch
部分使用了相当简单且模棱两可的错误消息,但如果您为普通用户创建它,最好使其更具体。使用过于技术性或过于模棱两可的消息只会限制可能的受众。
转换为音频
private void Convert_Click(object sender, EventArgs e)
{
SaveFileDialog cfile = new SaveFileDialog();
try
{
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpVoice speech = new SpVoice();
cfile.Filter = "wav files (*.wav)|*.wav";
cfile.Title = "Save to a wave file";
cfile.FilterIndex = 2;
cfile.RestoreDirectory = true;
if (cfile.ShowDialog()== DialogResult.OK)
{
SpeechStreamFileMode SpFileMode =
SpeechStreamFileMode.SSFMCreateForWrite;
SpFileStream SpFileStream = new SpFileStream();
SpFileStream.Open(cfile.FileName, SpFileMode, false);
speech.AudioOutputStream = SpFileStream;
speech.Speak(aText.Text, SpFlags);
speech.WaitUntilDone(Timeout.Infinite);
SpFileStream.Close();
}
}
catch
{
MessageBox.Show("Something's gone wrong here.");
}
MessageBox.Show("Conversion successful!", "Text2Audio");
}
这可能是流程中最复杂的部分。虽然这里的文件流操作并不困难(因为我们之前使用了它的反向操作),但转换为音频却很困难。同样,您必须使用 try-catch
块来最大限度地减少问题。
此方法将音频输出流设置为我们创建的文件流。我还使用了线程,因此此部分在转换完成后停止,而且不会比这更早。如果它只将文本的一半转换成 WAV 文件,那就毫无意义了!
关注点
也许 Speech
API 最烦人的地方是语音。它有严重的局限性,并且会做诸如说“括号”之类的事情,而不是仅仅改变强调。这可以通过在将文本发送到转换之前对其进行一些自动修改来改进。此外,只有一个声音,这限制了我们这些会说英语的人使用该程序。
建议
我很乐意接受有关改进此代码的任何建议。您只需将它们发送到我的电子邮件地址,我将尽快回复。
此项目的使用
请注意,如果您想在您自己的项目/解决方案中使用此代码的任何部分,您可以这样做,前提是您包含一条注释,说明创建代码的人是我,我的电子邮件地址以及您从哪里获取的代码。
这完全是开源的。如果您想将此代码用于商业项目,那么您必须向我发送一封包含请求的电子邮件,我将决定是否允许您继续进行。我将尽快阅读并回复发送给我的任何电子邮件。
历史
- 2005 年 8 月 7 日 - 该程序的第一个版本