Linuxová kouzla II: využití hlasové syntézy k oznamování událostí

Další z kouzel vytažených Jirkou Bencem a Milanem Vančurou z magického kufříku byla mluvící pošta. V KDE je možnost různých druhů notifikací včetně hlasových oznámení. A to nejen předem připravených statických hlášení, ale systém může např. přečíst předmět nově příchozího e-mailu. Ukážeme si tedy, jak pomocí hlasové syntézy přimět počítač k tomu, aby nám předčítal nadpisy došlé pošty lidským hlasem. Po předchozím díle plném náročných konfigurací si tentokrát trochu odpočineme. Samotná instalace hlasové syntézy není v openSuSE složitá:

Nainstalování systému EPOS

  1. Nainstalujeme balíček epos (v distribuci openSUSE).
  2. Přidáme si nové hlasy, např. tento: http://switch.dl.sourceforge.net/sourceforge/epos/epos-tdp.tgz
  3. Hlasy je třeba rozbalit do adresáře /usr/share/epos/inv/

Zprovoznění v KDE

  1. Nejpohodlnější je použít KTTSD (KDE speech system) v balíčku kdeaccessibility3.
  2. Je vhodné v KDE povolit aRts, zejména pokud karta nemá HW mixer.
  3. Konfigurace: Ovládací centrum -> Místní zvyklosti a zpřístupnění -> Hlasová syntéza:
  • Obecné: Povolit
  • Přidat hlasy: epos, čeština, klient --voice machac nebo --voice violka
  • Zvuk: přes aRts (pokud jsme je předtím zapnuli)

Přímo v nastavení lze nastavit hlášení z různých programů, např. Kopete, Kmail a podobně. Nejsme ale omezeni jen předvolenými variantami. Pomocí hlasové syntézy si můžeme nechat přečíst libovolný text, např. voláním ze skriptu pomocí dcop klienta:

dcop kttsd KSpeech sayText "můj text" 0

Je dobré vědět, že kódování textu se kttsd snaží uhodnout z nastavení locales (tj. např. proměnná prostředí LC_CTYPE). Protože není žádný způsob, jak kttsd říci, že chceme jiné kódování, je pravděpodobně nejlepší nastavit locale s kódováním UTF-8 (například "cs_CZ.UTF-8", což je v mnoha počeštěných distribucích defaultní nastavení) a případně převést text z jiného kódování do UTF-8 vhodným programem (jak na to, uvidíme níže).

Implementace efektu z přednášky

Rozhraní dcop využijeme k efektu ukazovaném na přednášce: systém nás upozorní na příchozí poštu a přečte nám předmět došlého dopisu.

Záhy zjistíme, že pro tyto účely nelze použít přednastavené notifikace v Kmailu. Naopak, jeho (hlasové) notifikace potřebujeme zcela vypnout. Důvod je prostý: notifikace z Kmailu se váží k události "Přijmout/poslat poštu", což je dávková úloha obsahující pouze údaj, kolik mailů v této právě stažené skupině bylo. Nemá konkrétní data každého z nich - např. předmět. Proto na to půjdeme jinak.

Tradičním programem spouštějícím se při příchodu mailu, je na UNIXových serverech program procmail. Někteří administrátoři na dnešních Linuxových serverů se procmailu, resp. syntaxe jeho konfiguračního souboru, obávají. My si ukážeme, jak je to snadné.

Standardně nainstalovaným poštovním serverem v SuSE linuxu je postfix a pomocí YaSTu si zvolíme i použití procmailu. Pokud nám náš poskytovatel Internetu nedává jinou možnost stahování pošty než dávkově, budeme muset zapnout spouštění procmailu v našem programu na stahování pošty (např. fetchmail). Samozřejmě pak dojde ke kumulaci hlášek o došlých mailech v příslušných intervalech.

Konfigurace ~/.procmailrc bude ale v obou případech stejná (a snadná):

:
0c
| ~/checkmail.sh

Jednotlivé "recepty" začínají v .procmailrc řetězcem ":0" a my chceme pracovat s kopií mailu, proto přidáme příznak "c". Originál příchozí zprávy je zpracován dalšími pravidly (pokud jsou) a následně uložen do příslušného adresáře. Kopie je, jak vidíme, poslána na standardní vstup skriptu ~/checkmail.sh. Příklad jednoduchého takového skriptu (bez jakéhokoliv zabezpečení) je zde:

#!/bin/bash

exec 2>~/checkmail.log

SUBJ=$(/usr/local/bin/2UTF | grep -m 1 ^Subject: | sed 's/^Subject: //')

if [ -z "$SUBJ" ] ; then
MESSAGE="s prázdným předmětem"
else
MESSAGE="s předmětem $SUBJ"
fi

MESSAGE="Přišel mail $MESSAGE"
#echo "mail: $MESSAGE" >&2

DISPLAY=:0.0 LC_ALL=cs_CZ.UTF-8 /opt/kde3/bin/dcop kttsd KSpeech sayText "$MESSAGE" 0

Vidíme, že skript převede zprávu do UTF-8 pomoci programu 2UTF (ten umí právě i kódování používaná poštovními klienty jako uvádění znakové sady předmětu mezi znaky "=" apod.). Následně skript najde první řádku začínající řetězcem "Subject: " a její obsah připraví pro výstup na hlasovou syntézu. Ve vlastním volání kttsd pomocí dcop vidíme, že nastavujeme dvě proměnné prostředí: DISPLAY a LC_ALL. Tím zajistíme výběr dcop serveru a údaj o kódování předávaného řetězce.

Program 2UTF v distribuci openSUSE není, je potřeba ho stáhnout z domovské
stránky projektu
.

Nyní je vše hotovo a nezbývá než si zkusit poslat mail. A samozřejmě vylepšit svá antispamová pravidla...

Linuxoví kouzelníci hledají asistenty pro realizaci těchto a jiných kouzel. Pokud máte zájem zašlete životopis v angličtině na jobs@suse.cz.

Autor: koty

Komentáře

rkoperdak odpověděl -

Ahoj, ja nemohu najit balicek EPOS, poradte prosim kde jej muzu stahnout. dekuji