Привет, ребята!
Я работаю над проектом, в котором мне нужно будет создавать файлы WAV имен с использованием TTS.
У меня установлен MS-SAPI 5.1 SDK на Windows Server 2003, и я использую C # для написания программы TTS. Помимо голоса Microsoft Sam по умолчанию, у меня на сервере установлены голоса из NeoSpeech TTS.
У меня возникла проблема: программа не создает более 1 рабочего файла WAV.
Чтобы быть более конкретным, если я отправлю программе 4 имени, программа создаст 4 файла WAV. Однако правильно конвертируется только имя. Размер файла превышает 1 КБ, и файл также воспроизводится в медиаплеере.
Остальные 3 файла созданы, но имеют размер 1 КБ и не работают ни в одном медиаплеере.
Я новичок как в 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.
Означает ли это, что мой код правильный и что-то не так с голосами? Во-первых, я получил голос от своих клиентов, поэтому я ничего не могу с этим поделать. Во-вторых, это голоса, готовые к производству. Я почти уверен, что они хорошо протестированы, иначе мы бы много о нем слышали.
Я все еще склонен верить, что с кодом, который я написал, что-то не так.
Есть ли другие предложения? Я здесь по-настоящему поправляюсь, и любая помощь будет оценена по достоинству.