Zautomatyzowanie programu Balobolka z wykorzystaniem języka C

Balabolka to bezpłatny program komputerowy dla systemu Windows, który służy do syntezowania mowy z tekstu. Umożliwia odczytanie tekstów z różnych formatów plików (np. TXT, DOC, PDF, HTML) oraz edycję tekstu bezpośrednio w programie. Balabolka obsługuje różne syntezatory mowy zainstalowane w systemie oraz oferuje szereg opcji konfiguracyjnych, takich jak dostosowanie prędkości i tonu głosu, wybór języka, akcentu, jakości dźwięku oraz ustawienie przerw między zdaniem lub wyrazami. Program jest przydatny dla osób z zaburzeniami mowy, słuchu lub wzroku, a także dla osób, które chcą usłyszeć długi tekst, bez potrzeby czytania.

Zaprezentowane rozwiązanie zostało skompilowane w środowisku Visual Studio Code w języku C.


Opis problemu :

Program miał służyć do odczytywania po polsku wyrazów oraz ich odpowiedników w języku angielskim w normalnej prędkości oraz zwolnionej. Ręczne wpisywanie tych informacji przy każdym wyrazie zajmowało dużo czasu, dlatego postanowiłem wykorzystać formuły w języku C i stworzyć program, który zautomatyzuje te czynności.

Formułki w programie :

Odczytywanie po polsku i czekanie 1 sekundy.
<voice required="Name=Microsoft Paulina Desktop"><rate absspeed="0"><pitch absmiddle="0">Wyraz</pitch></rate></voice><silence msec="1000"/>
Odczytywanie po angielsku i czekanie 2 sekundy.
<voice required="Name=Microsoft Hazel Desktop"><rate absspeed="0"><pitch absmiddle="0">word</pitch></rate></voice><silence msec="2000"/>
Odczytywanie po angielsku i z prędkością 50%.
<voice required="Name=Microsoft Hazel Desktop"><rate absspeed="-5"><pitch absmiddle="0">word</pitch></rate></voice>

Plik slowa.txt

Przygotowane słowa w kolejności polskie słowo i angielskie

Program w języku C


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *slowa = fopen("slowa.txt", "r");
    FILE *wymowa = fopen("wymowa.txt", "w");
    char slowo[50];

    while (fgets(slowo, sizeof(slowo), slowa) != NULL)
    {
        // usuwamy znak nowej linii z końca slowa
        slowo[strcspn(slowo, "\n")] = 0;
        fprintf(wymowa, "<voice required=\"Name=Microsoft Paulina Desktop\"><rate absspeed=\"0\"><pitch absmiddle=\"0\">%s</pitch></rate></voice><silence msec=\"1000\"/\n>", slowo);
        if (fgets(slowo, sizeof(slowo), slowa) != NULL)
        {
            // usuwamy znak nowej linii z końca slowa
            slowo[strcspn(slowo, "\n")] = 0;
            fprintf(wymowa, "<voice required=\"Name=Microsoft Hazel Desktop\"><rate absspeed=\"0\"><pitch absmiddle=\"0\">%s</pitch></rate></voice><silence msec=\"2000\"/>\n<voice required=\"Name=Microsoft Hazel Desktop\"><rate absspeed=\"-5\"><pitch absmiddle=\"0\">%s</pitch></rate></voice>\n\n\n", slowo, slowo);
                }
    }

    fclose(slowa);
    fclose(wymowa);
    return 0;
}

Po kompilacji i uruchomieniu programu stworzył się plik o nazwie Wymowa.txt :

Powstały tekst można skopiować do programu Balabolka i odtworzyć .

Opis programu:

1. Na początku deklarowane są dwa wskaźniki do plików: „slowa” i „wymowa”.

FILE *slowa = fopen("slowa.txt", "r");
FILE *wymowa = fopen("wymowa.txt", "w");

Funkcja fopen otwiera plik o podanej nazwie i zwraca wskaźnik do tego pliku, który jest używany w pozostałych operacjach na pliku.

2. Następnie odczytujemy pierwsze słowo z pliku „slowa.txt” przy pomocy funkcji fscanf. Słowo to jest zapisywane w tablicy znaków slowo.

char slowo[50];
fscanf(slowa, "%s", slowo);

3. Następnie do pliku „wymowa.txt” zapisywana jest linia tekstu, która zawiera składnię XML, a wewnątrz niej pierwsze słowo. Właściwe miejsca w tekście są zastępowane zawartością zmiennej „slowo”.

fprintf(wymowa, "<voice required=\"Name=Microsoft Paulina Desktop\"><rate absspeed=\"0\"><pitch absmiddle=\"0\">%s</pitch></rate></voice><silence msec=\"1000\"/>", slowo);

4. Następnie odczytujemy drugie słowo z pliku „slowa.txt” i ponownie zapisujemy składnię XML do pliku „wymowa.txt”. W tym przypadku w składni jest użyta inna nazwa syntezatora mowy oraz dodatkowy tag <silence>, który powoduje wstawienie przerwy o podanej długości (w milisekundach) między wyrazami.

fscanf(slowa, "%s", slowo);
fprintf(wymowa, "<voice required=\"Name=Microsoft Hazel Desktop\"><rate absspeed=\"0\"><pitch absmiddle=\"0\">%s</pitch></rate></voice><silence msec=\"2000\"/>\n<voice required=\"Name=Microsoft Hazel Desktop\"><rate absspeed=\"-5\"><pitch absmiddle=\"0\">%s</pitch></rate></voice>", slowo, slowo);

5. Na końcu pliki są zamykane, aby zakończyć operacje na plikach.

fclose(slowa);
fclose(wymowa);

:while(fgets(slowo, sizeof(slowo), slowa) != NULL) { // … } i slowo[strcspn(slowo, „\n”)] = 0; służą do odczytania każdego wiersza z pliku „slowa.txt” i usunięcia znaku końca linii z bufora.


Kod na Githubie