Przejdź do treści

Milena polski syntezator mowy dla systemu Linux

Menu

Aplikacje pomocnicze

Dykcjonarz

Powrót do menu

Jest to prosty program pozwalający na stworzenie słownika przeznaczonego dla pojedynczego tekstu (np. książki) w celu prawidłowej wymowy przez Milenę nazw własnych. Pobiera wszystkie wyrazy z tekstu i wypisuje te, które nie pasują do słownika Mileny a w całym tekście pisane są wyłącznie wielką literą (oprócz początku zdania), zawierają apostrof lub dowolną literę z zakresu poza polskimi.

Program jest bardzo prowizoryczny, ale do czasu opracowania pełnego słownika wymawialnych wyrazów może być przydatny...

Sposób użycia:

dykcjonarz [opcje]... <plik> > plik_slownika
Gdzie możliwe opcje to:
-L <lang>
Kod języka (może występować wielokrotnie)
-u <slownik>
Plik słownika użytkownika
-m /sciezka/do/morfologik.txt
Używa pliku morfologika do eliminacji znanych słów
-b /sciezka/do/pl_basewords.dat
Używa pliku basewords do eliminacji znanych słów
-B
Jeśli nie podano -m ani -b, nie próbuje znaleźć domyślnej lokalizacji pliku pl_basewords.txt (użyteczne tylko przy testach)

Milenizer

Powrót do menu

Milenizer to konwerter tekstu na format przeznaczony dla Mileny. Tekstem wejściowym może być:

  1. niesformatowany tekst w dowolnym kodowaniu. Następuje tu wyłącznie konwersja na ISO-8859-2.
  2. sformatowany tekst w dowolnym kodowaniu. Oprócz konwersji na ISO-8859-2 milenizer próbuje połączyć linie w akapity, w miarę możliwości lącząc również przeniesienia wyrazów. Możliwe jest wymuszone zakończenie akapitu pustą linią lub rozpoznawanie końca akapitu po długości linii.
  3. tekst w formacie rtf.
  4. tekst w formacie doc.
  5. tekst w formacie odt.

W przypadku formatów "doc" i "odt" Milenizer używa zewnętrznych konwerterów (odpowiednio Antiword i odt2txt).

Na wyjściu otrzymuje się tekst w postaci akceptowanej przez Milenę (każdy akapit w jednej linii). Możliwy jest również półautomatyczny podział tekstu na rozdziały, z opcjonalną autonumeracją rozdziałów, uwzględnianiem tytułów rozdziałów oraz wyróżnieniem prologu oraz epilogu lub ostatniego rozdziału.

Milenizer może również służyć jako prosty konwerter z RTF na TXT. Na wyjściu otrzymuje się wtedy plik tekstowy w kodowaniu UTF-8.

Sposób użycia:

milenizer [opcje] <plik>

Dostępne opcje:

opcje rozformatowania

-u <minlen>
-U <minlen>
Włączenie rozformatowania. Jeśli <minlen> wynosi 0, uznaje się, że akapity są oddzielone pustą linią. W przeciwnym przypadku akapitem kończącym jest akapit o długości nie większej niż <minlen>. Opcja -U powoduje dodatkowo ignorowanie numeracji stron (tzn. linii zawierających wyłącznie cyfry oraz nastepujących po nich pustych)
-d
nie uznaje linii zaczynających sie od '-' za dialogi.

opcje podziału na rozdziały

-s <sciezka>
włącza tryb podziału na pliki rozdziałów. W tym trybie pierwsza linia traktowana jest jako linia tytułowa i rozpoczyna każdy plik. Jeśli nie podano żadnej z opcji -a/-A, pierwsza linia każdego rozdziału jest traktowana jako tytułowa rozdziału i oddzielona kropką od tytułu książki. Po linii tytułowej zawsze występuje pusty wiersz. Każdy plik kończony jest oddzielonym pustym wierszem zdaniem "koniec rozdziału" lub (dla ostatniego) "koniec książki". Jeśli podano opcje -p/-P, prolog kończony jest zdaniem "koniec prologu". Kolejne pliki mają postać <sciezka>_<numer>.txt, gdzie <numer> jest dwu- lub trzycyfrową liczbą oznaczającą kolejny plik.
-x
Tworzy dodatkowy plik indeksu dla milena_nokia
-S <separator>
Podaje znak separujący rozdziały (domyslnie '#'). Znak ten powinien byc pierwszym widocznym znakiem linii. Wszelkie białe znaki za separatorem są ignorowane.

opcje autonumeracji rozdziałow

-a
włącza autonumerację rozdziałow
-A
włącza autonumeracje, dodatkowo pierwsza linia rozdziału traktowana jest jako tytuł rozdziału.
-l
wyróżnia ostatni rozdział
-p
-P
wyróżnia prolog. Jesli podano -P pierwsza linia traktowana jest jako tytuł prologu.
-e
-E
wyróżnia epilog. Jesli podano -E pierwsza linia traktowana jest jako tytuł epilogu.

Opcje -p/-P i -e/-E działają niezależnie od tego czy podano -a czy -A. Wystąpienie którejkolwiek z opcji -p/-P/-e/-E/-l bez opcji -a/-A jest nielegalne. Wszystkie opcje autonumeracji są ignorowane, jeśli nie podano opcji -s.

opcje konwersji

-c <kodowanie>
podaje kodowanie pliku wejściowego. Jeśli nie podano tej opcji, program próbuje wydedukowac kodowanie na podstawie zawartości pliku. Jeśli program skompilowano z biblioteką enca, będzie ona użyta do określenia kodowania. W przeciwnym przypadku dopuszczalne są tylko trzy wejściowe kodowania (UTF-8, ISO-8859-2, CP-1250).
-r
powoduje że program dokona wyłącznie konwersji z formatu RTF na tekst w kodowaniu UTF-8 (przydatne przy ręcznej obróbce plikow). Podanie tej opcji spowoduje, ze wszystkie opcje oprocz -o, -i oraz -f będą ignorowane.
-i
powoduje, że przy konwersji z UTF-8 znaki spoza dopuszczalnego zakresu będą ignorowane. Nie dotyczy to znaków o kodach wyższych niż \uFFFF.
-I
powoduje, że przy konwersji z UTF-8 znaki spoza dopuszczalnego zakresu będą wypisywane jako szesnastkowe encje zgodne z HTML. Opcja przeznaczona przede wszystkim do przygotowania tekstu do dalszej obróbki.

pozostałe opcje

-h
wypisuje treść pomocy
-o <nazwa_pliku>
program zapisze wynik konwersji do podanego pliku (domyślnie program wypisuje wynik na standardowe wyjście).
-f <tryb>
określa tryb traktowania przypisów (footnotes) przy konwersji plikow w formacie RTF. Dopuszczalne są następujace tryby:
  • d - ignorowanie przypisow (domyślnie);
  • n - przypisy w postaci czytelnej na ekranie. Każdy przypis w treści oznaczany jest [n] (gdzie <n> to numer przypisu). Po akapicie wypisywana jest linia "---", a po niej wszystkie przypisy wystepujące w akapicie.
  • e - jak wyżej, ale wszystkie przypisy są grupowane i wypisane na końcu.
  • a - podobnie jak 'n', lecz przypisy wypisane są w formie czytelnej dla syntezatora mowy.
  • i - przypisy w postaci czytelnej dla syntezatora mowy będą wypisane bezpośrednio w miejscu wystąpienia przypisu w treści.

Uwagi co do konwersji na ISO-2.

Milenizer rozpoznaje litery do kodu \u017f oraz "ș" i "ț" ("s" i "t" z przecinkiem). W przypadku napotkania znaku literowego niewystępującego w ISO-2:

  1. Litery "ș" i "ț" ("s" i "t" z przecinkiem) zamienione zostają odpowiednio na "ş" i "ţ";
  2. Litery "à", "è", "ì" i "ù"( "a","e","i","u" z akcentem gravis) zostają zamienione na odpowiednie litery z akutem (odpowiednio "á", "é", "í" i "ú").Pozwala to na rozróżnienie np. angielskich i francuskich słów o podobnej pisowni ("collège" - "kol~!eż", ale "college" - "kolidż");
  3. Litery "þ" (thorn) i "ð" (eth) zostają zamienione odpowiednio na "t" i "d";
  4. Litera "ñ" występująca przed samogłoską zostaje zamieniona na "ńj", w pozostałych przypadkach na "ń";
  5. Litery "å", "æ", "ø", "œ" "ij" i "ŋ" zamienione zostają odpowiednio na "o", "ä", "ö", "ö", "ij", "ng";
  6. Pozostałe litery zostaja zamienione na ich odpowiedniki bez akcentu.

Taki sposób konwersji w wielu przypadkach pozwala na prawidłową (lub przynajmniej nie rażąco błędną) wymowę obcojęzycznych wyrazów bez konieczności wprowadzania ich do słownika.

Dodatkowo częściowo rozpoznawana jest cyrylica i przekładana fonetycznie według uproszczonych zasad odpowiadających językowi rosyjskiemu. Oprócz liter z alfabetu rosyjskiego rozpoznawane są również litery charakterystyczne dla alfabetów ukraińskiego i białoruskiego. Translacja jest w fazie eksperymentalnej, nie należy się więc spodziewać dobrych rezultatów, ale czytany tekst powinien być zrozumiały.

Milena_book

Powrót do menu

Jest to bardzo prosty skrypt w bashu służący do szybkiej konwersji książki będącej wynikiem działania milenizera (czyli kompletu plików txt) na komplet plików mp3.

Sposób użycia:

milena_book [opcje] <katalog>

Przy pierwszym uruchomieniu skrypt tworzy plik ~/.milena_bookrc, w którym należy ustawić wszystkie parametry, w szczególności parametr "voice" wskazujący ścieżkę do pliku językowego Mbroli.

Opcje:

-H
odczyt godzin w formacie HH:MM:SS i HH:MM
-u <plik>
dodatkowy słownik uzytkownika
-f <plik>
dodatkowy plik frazera
-m <plik>
dodatkowy plik konfiguracji mbroli
-L <lang>
plik języka

Skrypt znajduje wszystkie pliki z rozszerzeniem .txt w podanym katalogu i tworzy z nich pliki mp3, zamieniając w nazwie rozszerzenie .txt na .mp3. Do pracy wymagany jest lame.

Milena_say

Powrót do menu

Również prosty skrypt w bashu, umożliwiający bezpośrednie odczytanie tekstu (z pliku lub parametrów w linii poleceń). Potrzebuje jednego z programów aplay lub sox (wykrywane są automatycznie).

Sposób użycia:

milena_say [opcje] [tekst]
milena_say [opcje] -F <plik>
Jeśli nie podano opcji -F ani tekstu, będzie on odczytany ze standardowego wejścia. W przypadku czytania ze standardowego wejścia lub pliku tekst musi być zakodowany w ISO-8859-2.

Opcje:

-F <plik>
czytaj tekst z pliku
-H
odczyt godzin w formacie HH:MM:SS i HH:MM
-u <plik>
dodatkowy słownik uzytkownika
-f <plik>
dodatkowy plik frazera
-m <plik>
dodatkowy plik konfiguracji mbroli
-L <lang>
plik języka

Milena_submixer

Powrót do menu
UWAGA!
Program nie jest już rozwijany, jego rolę przejęła Milena ABC. Niniejszy wpis pozostawiono jedynie dla miłośników historii...

Submixer to program umożliwiający zgranie oryginalnej ścieżki dźwiękowej filmu z czytanymi przez Milenę napisami oraz utworzenie nowego pliku, zawierającego zmiksowany materiał. Ponieważ submixer automatycznie dopasowuje poziom głośności oryginalnej ścieżki do poziomu czytanego tekstu, a jednocześnie dba o to, aby poza dialogami poziom oryginału był wysoki, komfort oglądania (i słuchania) filmu jest dużo wyższy niż przy stosowaniu programów czytających bezpośrednio napisy (np. subplayer). Również automatyczna regulacja tempa czytania w miejscach zagęszczenia dialogów pozwala na bardziej prawidłową synchronizację czytanego tekstu z oryginałem. Dzięki submixerowi można również oglądać filmy z lektorem np. na telefonach komórkowych (czytanie napisów w rozdzielczości 320x240 jest niespecjalnie wygodne).

Aby utworzyć film z wgranymi napisami, należy najpierw skonwertować napisy na jedyny znany submixerowi format JACOsub oraz zrzucić oryginalną ścieżkę audio do pliku wav. Można to zrobić pojedynczym poleceniem, np.:

mplayer -dumpjacosub -ao pcm:fast -vo null -vc null -sub napisy.txt film.avi

(bliższe informacje - patrz dokumentacja mplayera). Po wykonaniu tego polecenia w bieżącym katalogu pojawią się pliki audiodump.wav i dumpsub.jss.

Plik dumpsub.jss należy teraz przejrzeć, usunąć zbędne linie oraz połączyć następujące po sobie kwestie, a następnie zapisać w kodowaniu ISO-8859-2. W najprostszym przypadku można po prostu przepuścić plik przez milenizer, np:

milenizer -o dumpsub_jss.txt dumpsub.jss

Najlepszym sposobem będzie jednak wykorzystanie Mileny ABC, która pozwoli na szybką edycję pliku oraz utworzenie słownika obcojęzycznych zwrotów. Dodatkowo w Milenie ABC planowane jest częściowe zautomatyzowanie edycji napisów (kod automatycznie łączący kwestie w całość jest w fazie eksperymentalnej).

Uwaga!
Mplayer czasem potrafi przy dumpjacosub wypluć nieprawidłową linię TIMERES (np. TIMERES wynosi 25, a rzeczywista rozdzielczośc 100). Taki przypadek można wykryć od razu patrząc na początek pliku: jeśli w pierwszej linii jest #TIMERES=25 (lub zamiast 25 inna liczba różna od 100), a w dalszej części występują zapisy np. 00:11:22.32 (ostatni człon oznaczający ilość jednostek czasowych jest nie mniejszy niż TIMERES) należy po prostu zmienić wartość w pierwszej linii na 100.

Teraz można przystąpić do tworzenia ścieżki audio. Wydajemy polecenie (przykładowo):

milena_submixer -u dumpsub_jss.dic audiodump.wav dumpsub_jss.txt newaudio.wav

Proces tworzenia ścieżki dźwiękowej potrwa kilka minut. Po jego zakończeniu możemy sprawdzić poprawność odtwarzając plik w mplayerze:

mplayer -audiofile newaudio.wav film.avi

Wynikowy plik wav będzie miał te same parametry (wielkość, częstotliwość próbkowania, ilośc kanałów) jak plik źródłowy. Jedynym ograniczeniem jest tu ilość kanałów (maksymalnie dwa, czyli mono lub stereo).

Teraz można już stworzyć wynikowy film. Tworzymy go za pomocą mencodera, przykładowo:

mencoder -audiofile newaudio.wav -oac mp3lame -lameopts cbr:br=128:mode=3 \
    -ovc copy film.avi -o nowy_film.avi

Ponieważ wspominałem o tworzeniu wersji dla komórki, oto przykładowy skrypt tworzący film w formacie strawnym dla Nokii (w rozdzielczości 320x240):

#!/bin/bash
a=`ffmpeg -i "$1" 2>&1 | grep 'Stream.*Video' 2>/dev/null | tr ',' ' '`
w=""
h=""
if [ "$a" != "" ] ; then
	for b in $a; do
		if echo -n $b | grep -E '^[0-9]+x[0-9]+$' ; then
			w=`echo $b | cut -dx -f1`
			h=`echo $b | cut -dx -f2`
			break
		fi
	done
fi

if [ "$#" != 2 ] && [ "$#" != "3" ] ; then
	echo Sposób użycia: $0 '<infile> <outfile.3gp> [audiotrack.wav]'
	exit 1
fi

left=0
top=0
rite=0
bot=0

let "th=($h*320)/$w"
if let "$th>=180" ; then
	let "top=(240-$th)/2"
	let "bot=240-(th+top)"
else
	top=30
	bot=30
	th=180
	let "nw=($h*16)/9"
	let "left=($w-$nw)/2"
	let "rite=$w-($nw+$left)"
	let "left=2*($left/2)"
	let "rite=2*($rite/2)"
fi

echo $left $rite $top $bot

let "tw=320+$left+$rite"
sx=""
if [ $left != "0" ] ; then
	sx="$sx -cropleft "$left
fi
if [ $rite != "0" ] ; then
	sx="$sx -cropright "$rite
fi
if [ $top != "0" ] ; then
	sx="$sx -padtop "$top
fi
if [ $bot != "0" ] ; then
	sx="$sx -padbottom "$bot
fi



if [ "$3" != "" ] ; then
ffmpeg -i "$1" -s ${tw}x${th} -i "$3" -map 0:1 -map 1:0 \
	-vcodec mpeg4 -acodec libfaac \
	$sx -r 15 -y -aspect 4:3  "$2"

else
ffmpeg -i "$1" -s ${tw}x${th} -vcodec mpeg4 -acodec libfaac \
	$sx -r 15 -y -aspect 4:3 "$2"

fi

Uwaga!
Przy pierwszym uruchomieniu zostanie utworzony plik ~/.milena_submixer (dokładny opis znaczenia poszczególnych wartości w załączonym pliku README). O ile domyślne parametry regulacju głośności powinny być prawidłowe, o tyle wartości tempa i wysokości głosu należy dopasować do swoich upodobań.