65.9K
CodeProject 正在变化。 阅读更多。
Home

文本转 WAV 转换器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.94/5 (11投票s)

2005年8月7日

CPOL

3分钟阅读

viewsIcon

98533

downloadIcon

1792

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

Sample Image - Main Window.jpg

引言

通常,您可以使用 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 日 - 该程序的第一个版本
© . All rights reserved.