C# Convertir un Text to Speech (synthèse vocal) en fichier Audio

Signaler
Messages postés
1
Date d'inscription
jeudi 17 mars 2011
Statut
Membre
Dernière intervention
16 février 2012
-
Bonjour a tous,
Je cherche à sauvergarder une synthèse vocal dans un fichier au format Wav, MP3, ...
Synthèse vocal : L'ordinateur dicte un texte se trouvant dans une textbox.

Voici mon code

#region define [Selon l'OS    Si 32 bits --> System.Speech     Si 64 bits --> Microsoft.Speech]
// Si une des parties est grisées, cela signifie que le compilateur n'en tiendra pas compte, Cela déprendra de l'OS

#define MICROSOFT_SPEECH // Bien définir ceci avant toute chose sinon cela ne fonctionne pas
#if MICROSOFT_SPEECH
using Microsoft.Speech;
using Microsoft.Speech.Synthesis;
#else
using System.Speech;
using System.Speech.Synthesis;
#endif


#endregion

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Media;
using System.IO;



namespace TTS
{
    public partial class EcranTTS : Form
    {
        // Pour Microsoft.speech, Déclarez et instanciez en global le membre suivant :
        SoundPlayer _snd = new SoundPlayer();


        public EcranTTS()
        {
            InitializeComponent();
        }

        #region langues

        private void btLangages_Click(object sender, EventArgs e) // montre les langues installé sur l'ordi
        {
            SpeechSynthesizer s = new SpeechSynthesizer();
            var voix = s.GetInstalledVoices();
            foreach (InstalledVoice v in voix)
            {
                lbVoix.Items.Add(v.VoiceInfo.Name);
            }
        }


        #region French

        // ################################################## Synchrone #################################################
        private void btSynthetiser_Click(object sender, EventArgs e)
        {
            #if MICROSOFT_SPEECH
                SpeechSynthesizer s = new SpeechSynthesizer();
                String texte = tbSynthetiser.Text;
                String voix = "Microsoft Server Speech Text to Speech Voice (fr-FR, Hortense)";
                ConfigureSoundPlayer(s);
                s.SelectVoice(voix);
                s.Speak(texte);
                JouerSoundPlayer();
            #else
                SpeechSynthesizer s = new SpeechSynthesizer();
                String texte= tbSynthetiser.Text;
                String voix= "ScanSoft Virginie_Dri40_16kHz";
                s.SelectVoice(voix);
                s.Speak(texte);
            #endif
        }


        // ################################################## METHODE #################################################
        #region Pour microsoft.speech, j'ai besoin de ces 2 méthodes pour sortir un son audio


        private void ConfigureSoundPlayer(SpeechSynthesizer s) // nous informons le synthétiseur, que la sortie, ne sera pas la sortie standard mais un flux de données au format wave (SetOutputToWaveStream).
        {
            _snd.Stream = new MemoryStream();
            s.SetOutputToWaveStream(_snd.Stream);
        }


        private void JouerSoundPlayer()
        {
            _snd.Stream.Position = 0; // nous repositionnons la position du flux de données à 0, afin que la lecture démarre depuis le début 
            _snd.Play(); // Play pour jouer le son
        }

         
        #endregion


        // Afin d’éviter de figer l’interface utilisateur sur des PC surpuissants dotés de plusieurs cœurs,
        // il est impératif dans les applications modernes de développer en mode asynchrone.

        // ################################################## Asynchrone #################################################
        private void btSynAsync_Click(object sender, EventArgs e)
        {
            // SpeechSynthetizer : c'est la classe la plus importante. Elle contient toutes les methodes permettant de synthetiser la voix. Cet aussi l'objet de base de la synthèse vocal
            // PromptBuilder : permet de creer un document qui va servir a synthetiser la voix par l'intermediaire de SpeechSynthetizer. Cette classe permet aussi de serialiser ce document au format SSML.
            // PromptStyle : cette classe permet de definir un style a appliquer a un document PromptBuilder, cela pour comprendre la vitesse, le volume, la pronomciation...
            

            SpeechSynthesizer s = new SpeechSynthesizer();
            PromptBuilder builder = new PromptBuilder(new System.Globalization.CultureInfo("fr-fr"));      // Definition de la culture. ici le francais si "fr-fr" n'est pas installé il essayera une autre langue francais (ex : fr-be)
            builder.AppendText(tbSynthetiser.Text);         // AppendText() : cette méthode permet d'ajouter un texte simple à synthétiser, on peut passer en plus à la méthode la vitesse de diction souhaitée pour ce texte.
            s.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(s_SpeakCompleted);

            #if MICROSOFT_SPEECH
                ConfigureSoundPlayer(s);
            #endif
            s.SpeakAsync(builder);
        }



        void s_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
                return;
            }

            #if MICROSOFT_SPEECH
                JouerSoundPlayer();
            #endif
        }
        
        #endregion