Kirjoittaja Aihe: Tekstitiedostot äänikirjaksi festival-puhesyntetisaattorilla  (Luettu 2644 kertaa)

Tommi S.

  • Käyttäjä
  • Viestejä: 240
    • Profiili
Netissä törmää aina joskus todella mielenkiintoisiin kirjoituksiin, jotka voivat olla erittäin pitkiä. Ruudulta lukeminen ei ole kovin mukavaa, eikä aina ole aikaa istua koneen ääressä, joten ajattelin että olisi tosi kätevää tehdä pitkistä tekstinpätkistä äänikirjoja jotka voisi laittaa kannettavaan soittimeen ja kuunnella silloin kun ei ole koneen ääressä.

Tarkoitukseen löytyy puhesyntetisaattori nimeltä festival, jota aloin kokeilemaan. Festivalin mukana tulee scripti nimeltä text2wave, jolla voi suoraan tehdä tekstitiedostosta äänitiedoston. Sitä käytetään näin:
Koodia: [Valitse]
text2wave teksti.txt -o output.wavTuo lukee tuollaisenaan kaiken oletusäänellä, mutta ääntä voi vaihtaa seuraavasti:
Koodia: [Valitse]
text2wave teksti.txt -o output.wav -eval "(voice_rab_diphone)"Tuossa siis syötetään festivalille komento (voice_rab_diphone) joka vaihtaa ääneksi äänen rab_diphone.
Kun keksin miten äänen saa vaihdettua niin yritin vaihtaa äänen suomenkieliseksi syöttämällä festivalille komennon (language_finnish), mutta se ei jostain syystä toiminut tuon text2wave:n kanssa. Yritin sitten löytää vaihtoehtoisen keinon, ja tässä on tulos.

1. Tallennetaan haluttu teksti tekstitiedostoon. Tiedoston merkistön täytyy olla ISO8859-1, tai muuten ääkköset eivät toimi oikein (ääni lukee ä:n ja ö:n tilalle "tuntematon merkki"). Gedit:llä (tekstieditori, sovellukset->apuohjelmat) voi merkistön valita silloin kun tallentaa "Tallenna nimellä..."-toiminnolla.

2. Käynnistetään festival hakemistossa johon tekstitiedosto on tallennettu. Olisi varmaan parasta että hakemistossa ei ole mitään muuta kuin tuo yksi tekstitiedosto.

3. Annetaan festivalille seuraavat komennot:
Koodia: [Valitse]
(language_finnish)
(set! tts_hooks (list utt.synth save_tts_output))
(tts "teksti.txt" nil)
Ensimmäinen rivi vaihtaa kielen suomeksi. Tämän voi korvata myös sillä että käynnistää festivalin komennolla festival --language finnish.
Toinen rivi muuttaa tts(text-to-speech)-toimintoa siten että se vain syntetisoi tekstin ja tallentaa jokaisen lauseen äänitiedostona (normaalisti tts lukee tekstin ääneen).
Kolmas rivi sitten tekee varsinaisen työn, eli lukee tekstitiedoston äänitiedostoiksi (jokainen lause tulee siis omaan tiedostoonsa).

Nyt hakemistossa on monta tiedostoa jotka on nimetty tyyliin tts_file_1.wav, tts_file_2.wav, jne. nousevassa numerojärjestyksessä.

Seuraava ongelma oli miten nämä tiedostot liitetään yhdeksi tiedostoksi. Tähän löytyi kätevä ohjelma nimeltä sox, jota varten tein seuraavanlaisen skriptin:
Koodia: [Valitse]
#!/bin/bash
evencount=2
count=1

while [ -f tts_file_$evencount.wav ]
do
let oddcount=evencount-1
sox tts_file_$oddcount.wav tts_file_$evencount.wav temp.wav
rm tts_file_$oddcount.wav tts_file_$evencount.wav
mv temp.wav tts_file_$count.wav
let evencount=evencount+2
let count++
done

let oddcount=evencount-1
if [ -f tts_file_$oddcount.wav ]
then
mv tts_file_$oddcount.wav tts_file_$count.wav
fi

if [ -f tts_file_2.wav ]
then
bash combine_waves.sh
fi
Skripti tallennetaan hakemistoon jossa tiedostot ovat, nimellä combine_waves.sh.

Kun tuon skriptin käynnistää komennolla "bash combine_waves.sh" niin se yhdistää kaikki tts_file_-tiedostot yhdeksi tiedostoksi nimeltä tts_file_1.wav. Tästä voi sitten tehdä oggin oggenc-komennolla ja siirtää kannettavaan soittimeen.

Tarvittavat ohjelmat ovat suurinpiirtein seuraavat:
festival
festivaliin tarvittavat äänet
sox
oggenc (tai muu muunnin)

Kommentit ja parannusehdotukset tervetulleita!

Tommi S.

  • Käyttäjä
  • Viestejä: 240
    • Profiili
Sellaisen parannuksen virittelin että tuon äänitiedoston luomisen voi suorittaa yhdellä komennolla.

1. Luodaan tyhjä hakemisto jonne kopioidaan muunnettava tekstitiedosto.

2. Kopioidaan alussa mainittu combine_waves.sh skripti hakemistoon.

3. Siirrytään hakemistoon ja suoritetaan seuraava komento:
Koodia: [Valitse]
festival -b '(language_finnish)' '(set! tts_hooks (list utt.synth save_tts_output))' '(tts "teksti.txt" nil)'; bash combine_waves.shTuon "teksti.txt":n paikalle tulee siis tekstitiedoston nimi.

Kun komento valmistuu on hakemistossa äänitiedosto nimeltä tts_file_1.wav, joka sisältää tekstitiedoston tekstin puhuttuna.