问候各位!
我正在做一个项目,我将不得不使用 TTS 创建名称的 WAV 文件。
我在 Windows Server 2003 上安装了 MS-SAPI 5.1 SDK 并使用 C# 编写 TTS 程序。除了默认的 Microsoft Sam 语音外,我还在服务器上安装了来自 NeoSpeech TTS 的语音。
我遇到的问题是,该程序不会产生超过 1 个工作 WAV 文件。
更具体地说,如果我向程序发送 4 个名称,程序会创建 4 个 WAV 文件。但是,只有名字被正确转换。文件大小大于 1 kb,并且文件也在媒体播放器中播放。
其他 3 个文件已创建,但大小为 1 kb,无法在任何媒体播放器中使用。
我是 C# 和 MS-SAPI 的新手,但我相信我在创建代码方面做得不错。我花了几天的时间试图弄清楚这一点,但我现在没有精力了。
非常感谢您对此问题的任何见解。谢谢你的时间。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using SpeechLib;
using System.Threading;
namespace TTS_Text_To_Wav
{
class Gender
{
public static String MALE = "Male";
public static String FEMALE = "Female";
}
class Languages
{
public static String ENGLISH = "409;9";
public static String SPANISH = "40a";
}
class Vendor
{
public static String VOICEWARE = "Voiceware";
public static String MICROSOFT = "Microsoft";
}
class SampleTTS
{
static void Main(string[] args)
{
SampleTTS processor = null;
try
{
processor = new SampleTTS();
// get unprocessed items
ArrayList unProcessedItems = new ArrayList();
unProcessedItems.Add("Kate");
unProcessedItems.Add("Sam");
unProcessedItems.Add("Paul");
unProcessedItems.Add("Violeta");
if (unProcessedItems != null)
{
foreach (string record in unProcessedItems)
{
// convert text to wav
processor.ConvertStringToSpeechWav(record, "c:/temp/" + record + ".wav", Vendor.VOICEWARE, Gender.MALE, Languages.ENGLISH);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
void ConvertStringToSpeechWav(String textToConvert, String pathToCreateWavFile, String vendor, String gender, String language)
{
SpVoice voice = null;
SpFileStream spFileStream = null;
try
{
spFileStream = new SpFileStream();
voice = new SpVoice();
spFileStream.Format.Type = SpeechAudioFormatType.SAFT8kHz16BitMono;
spFileStream.Open(pathToCreateWavFile, SpeechStreamFileMode.SSFMCreateForWrite, false);
voice.Voice = voice.GetVoices("Vendor=" + vendor + ";Gender=" + gender, "Language=" + language).Item(0);
voice.AudioOutputStream = spFileStream;
voice.Speak(textToConvert, SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
voice.WaitUntilDone(Timeout.Infinite);
}
catch (Exception e)
{
throw new Exception("Error occured in ConvertStringToSpeechWav()\n" + e.Message);
}
finally
{
if (spFileStream != null)
{
spFileStream.Close();
}
}
}
}
}
编辑:
我似乎注意到了一些新的行为。该代码适用于系统上的 Microsoft 语音。只有 NeoSpeech 的声音我似乎有这个问题。
这是否意味着我的代码是正确的,而声音有问题?一方面,我从客户那里得到了声音,所以我对此无能为力。其次,这些是生产就绪的声音。我很确定它们经过了很好的测试,否则我们会听到很多关于它的信息。
我仍然倾向于相信我编写的代码有问题。
还有其他可用的建议吗?我在这里得到了真正的修复,任何帮助将不胜感激。