C#

Synteza mowy z użyciem Microsoft Speech Platform SDK v.11.0

Artur Protasewicz

W artykule przedstawiono, jak uzyskać efekt syntezy mowy przez komputer.
Zostało to osiągnięte z użyciem języka C#.
Skorzystano z Microsoft Speech Platform SDK w wersji 11.0.

1 Wymagania programu
     1.1 Środowisko programowania
     1.2 System operacyjny
2 Czynności wstępne
     2.3 Instalacja bibliotek związanych z syntezą mowy
          2.3.1 Biblioteki Microsoft Speech
          2.3.2 Przykładowe głosy
               2.3.2.1 Uwagi do pobieranych głosów syntezatora - zrzut ekranu rejestru
     2.4 Linki do pobrania bibliotek z internetu
     2.5 Utworzenie referencji do Microsoft Speech Object Library 11.0
3 Fragment programu generujący mowę
     3.6 Kod C#
     3.7 Zrzut ekranu programu
4 Prezentacja czytania tekstu przez syntezator mowy
5 Przydatne linki

Wymagania programu

Środowisko programowania

Microsoft Visual Studio C# Express 2010
Microsoft .NET Framework 4.0

System operacyjny

Windows 7 Professional SP1
lub
Windows 10 Professional

Czynności wstępne

Instalacja bibliotek związanych z syntezą mowy

Biblioteki Microsoft Speech

Instalacja SpeechPlatformRuntime x86
Instalacja MicrosoftSpeechPlatformSDK x86

Przykładowe głosy

Instalacja MSSpeech_TTS_pl-PL_Paulina
Instalacja MSSpeech_TTS_it-IT_Lucia

Uwagi do pobieranych głosów syntezatora - zrzut ekranu rejestru

Nie wszystkie głosy dostępne do pobrania rejestrują się w kluczu Speech Server, który jest związany SDK 11.0. Ostateczny rezultat jest widoczny w rejestrze Windows. Należy pominąć głosy zawierające w nazwie pliku fragment "TELE". Część głosów rejestruje się w kluczu Speech. Przyczyny takiego działania plików instalacyjnych nie były sprawdzane. Dla celów artkułu wystarczająca była poprawna instalacja minimum dwóch głosów w różnych językach.

Poniżej widok kluczy rejestru:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech Server\v11.0\Voices]

Widok rejestru.png

Linki do pobrania bibliotek z internetu

Pobierz: Microsoft Speech Platform - Runtime (Version 11)
Pobierz: Microsoft Speech Platform - Software Development Kit (SDK) (Version 11)
Pobierz: Microsoft Speech Platform - Runtime Languages (Version 11)

Utworzenie referencji do Microsoft Speech Object Library 11.0

W otwartym projekcie należy wybrać z menu głównego Project / Add Reference.

Menu Add Reference.png

Kolejnym krokiem jest wybór odpowiedniej referencji w oknie dialogowym Add Reference. Jest to Microsoft Speech Object Library 11.0.

Okno_Add_Reference_COM.png

Fragment programu generujący mowę

Pokazano jedynie najistotniejszy fragment programu. Pełny program wymagałby dodania fragmentów związanych z:

  • Zakończeniem syntezy w dowolnym momencie (Zakończ)
  • Wstrzymaniem syntezy (Pauza)
  • Wznowieniem syntezy po przerwie (Wznów)

Kod C#

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using SpeechLib;

namespace nsTextToSpeech
{
    public partial class FormTextToSpeech : Form
    {
        List<ISpeechObjectToken> voices; // Lista głosów syntezatora TTS
        SpVoice reader;                  // Obiekt przekształcający
                                         // tekst na mowę lub pseudomowę
        int voiceCount;                  // Ilość dostępnych głosów

        public FormTextToSpeech()
        {
            InitializeComponent();

            // Utworzenie i wyświetlenie listy dostępnych głosów

            reader = new SpVoice();
            voices = new List<ISpeechObjectToken>();
            ISpeechObjectTokens t = reader.GetVoices();
            richTextBox1.Text = "Dostępne głosy\n";
            foreach (ISpeechObjectToken item in t)
            {
                voices.Add(item);
                richTextBox1.Text += '\t' + item.GetDescription() + '\n';
            }

            voiceCount = voices.Count;

            // Zdarzenia przycisków rozpoczynających syntezę mowy

            speakButton1.Click += new EventHandler(speakButton_Click);
            speakButton2.Click += new EventHandler(speakButton_Click);
        }

        private void speakButton_Click(object sender, EventArgs e)
        {
            // Ustawienie indeksu głosu, który ma zostać użyty

            int voiceIndex = -1;

            if (voiceCount == 2) // zainstalowane są dokładnie 2 głosy
            {
                if ((sender as Button) == speakButton1)
                {
                    // Jeżeli kliknięto speakButton1
                    voiceIndex = 0;
                }
                else if ((sender as Button) == speakButton2)
                {
                    // Jeżeli kliknięto speakButton2
                    voiceIndex = 1;
                }
                else
                {
                    // W tym programie innej możliwości nie ma
                    return;
                }
            }
            else
            {
                // Zakończ, jeżeli indeks głosu jest różny od zero lub jeden
                return;
            }

            // Tablica z dwoma tekstami, odpowiednio dla języka
            // używanego przez syntezator mowy i ilości zainstalowanych głosów

            // Uwaga: Nie używaj zbyt długich tekstów, 
            // bo nie będzie można ich przerwać

            string[] Text =
            {  
                // https://pl.wikipedia.org/wiki/Lorem_ipsum
                // Oryginalny tekst tłumaczenia na polski (fragment)  

                @"Nie ma zatem takiego człowieka,    
                który kocha cierpienie samo w sobie, 
                kto by do niego dążył 
                lub chciał go doświadczyć...",

                // https://pl.lipsum.com              
                // Psudotekst po łacińsku (fragment)

                @"Lorem ipsum dolor sit amet, 
                consectetur adipiscing elit, 
                sed do eiusmod tempor incididunt 
                ut labore et dolore magna aliqua..." 
            };

            reader = new SpVoice(); // Utworzenie obiektu głos dowolny, zaistalowany
            reader.Voice = (SpObjectToken)voices[voiceIndex]; // Przypisanie do obiektu głos
                                                              // konkretnego głosu
                                                              // mówiącego w konkretnym języku (tu: polski i włoski)
            //Napisy (patrz: załączony zrzut ekranu)
            richTextBox1.Text += "Bieżący głos:\n\t";
            string s = reader.Voice.Id.ToString() + '\n' + "\tMowa...\n";
            richTextBox1.Text += s.Substring(s.LastIndexOf("\\") + 1);
            Application.DoEvents();
            reader.Speak(Text[voiceIndex]); // Uruchomienie syntezy mowy

                                            // Uwaga: Syntezy mowy nie będzie można przerwać
                                            // - nie zaprogramowano do tego odpowiedniego zdarzenia
                                            // - nie da się zamknąć programu,
                                            //   aż nie skończy czytanie tekstu

                                            // Nie używaj zbyt długich tekstów

            richTextBox1.Text += "\tKoniec tekstu.\n"; // Synteza zakończona
            Application.DoEvents();
        }
    }
}

Zrzut ekranu programu

Zrzut_ekranu_programu.png

Prezentacja czytania tekstu przez syntezator mowy

Do poniższej prezentacji został użyty tekst "Lorem ipsum" używany zwykle do sprawdzania rozłożenia tekstu na stronie internetowej. Użyto syntezatora mowy włoskiej i głosu żeńskiego Lucia. Ponieważ oryginał tekstu jest łaciński, prezentowaną mowę powinno się raczej nazwać mową w pseudojęzyku lub pseudomową. Przykładem syntezatora, który posiada język łaciński jest eSpeak na licencji Open Source. MS Speech SDK 11.0 nie zawiera tego języka.

Lorem ipsum it-IT Lucia MS Speech SDK 11.0.zip

Przydatne linki

Microsoft Speech Platform, MSDN Developer Network
Microsoft Speech Platform SDK 11 Documentation, MSDN Developer Network
Microsoft Speech Platform Native Code API Documentation, MSDN Developer Network
Speech Synthesis API Overview, MSDN Developer Network
Syntezator mowy Sam, Artur Protasewicz, 4programmers.net, Delphi, Windows XP

C#

1 komentarz

Jakby ktoś szukał gotowego programu do generowania plików dźwiękowych z tekstu, to polecam: http://www.cross-plus-a.com/balabolka.htm