
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

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 :


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.
