C# Сохранить текст в речь в файл MP3

Мне интересно, есть ли способ сохранить текст в речевые данные в формате mp3 или Wav для последующего воспроизведения?

SpeechSynthesizer reader = new SpeechSynthesizer();
reader.Rate = (int)-2;
reader.Speak("Hello this is an example expression from the computers TTS engine in C-Sharp);

Я пытаюсь сохранить это внешне, чтобы потом воспроизвести его. Каков наилучший способ сделать это?

3 ответа

Решение

Существует несколько вариантов, таких как сохранение в существующий поток. Если вы хотите создать новый WAV-файл, вы можете использовать метод SetOutputToWaveFile.

reader.SetOutputToWaveFile(@"C:\MyWavFile.wav");

Не мой ответ, скопируйте пасту из Как я могу использовать LAME для кодирования WAV в mp3 C#


Самый простой способ в.Net 4.0:

Используйте визуальную студию Nuget Package manager console:

Install-Package NAudio.Lame

Code Snip: отправьте речь в поток памяти, затем сохраните как mp3:

//reference System.Speech
using System.Speech.Synthesis; 
using System.Speech.AudioFormat;

//reference Nuget Package NAudio.Lame
using NAudio.Wave;
using NAudio.Lame; 


using (SpeechSynthesizer reader = new SpeechSynthesizer()) {
    //set some settings
    reader.Volume = 100;
    reader.Rate = 0; //medium

    //save to memory stream
    MemoryStream ms = new MemoryStream();
    reader.SetOutputToWaveStream(ms);

    //do speaking
    reader.Speak("This is a test mp3");

    //now convert to mp3 using LameEncoder or shell out to audiograbber
    ConvertWavStreamToMp3File(ref ms, "mytest.mp3");
}

public static void ConvertWavStreamToMp3File(ref MemoryStream ms, string savetofilename) {
    //rewind to beginning of stream
    ms.Seek(0, SeekOrigin.Begin);

    using (var retMs = new MemoryStream())
    using (var rdr = new WaveFileReader(ms))
    using (var wtr = new LameMP3FileWriter(savetofilename, rdr.WaveFormat, LAMEPreset.VBR_90)) {
        rdr.CopyTo(wtr);
    }
}

Часто, если что-то работает на рабочей станции разработчика, но не на рабочем сервере, это проблема с разрешениями. две мысли: Lame создает временные файлы где-нибудь? Если это так, процесс IIS требует разрешения на запись туда. При записи выходного файла процессу IIS снова требуется разрешение на запись. ConvertWavStreamToMp3File(ref ms, "mytest.mp3"); "mytest.mp3", вероятно, должен быть полным путем, используя Server.MapPath()

Другие вопросы по тегам