Sida 31 av 98

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:40
av Hans Linde
Vad nu?

- Typsnittet är fel även här. ska jag leta upp de kommandon som fixade det? ( är det samma +)
- Det här är en Scaletempo övning och det behöver en funktionsbeskrivning. F7-12 påverkar inte rösten
vid en "snabb-test".
- vi har en provat ut en revsion på "r4-temat" som funkar på i386C än.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:45
av Hans Linde
- vi har en provat ut en revsion på "r4-temat" som funkar på i386C än.

Hmm... det där var nog inte rätt, vid närmare eftertanke. Det blir samma sak
fast jag har inte reset o röst-valet på F-tang.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:50
av Konservburk
Hans Linde skrev:- Typsnittet är fel även här. ska jag leta upp de kommandon som fixade det? ( är det samma +)
Det är nog samma ja. Jag har tänkt mig att det ska byggas in. Men först ska jag undersöka hur det är med zenity.
Hans Linde skrev:- Det här är en Scaletempo övning och det behöver en funktionsbeskrivning. F7-12 påverkar inte rösten
Om du ska använda scaletempo hjälper det inte att öka farten med den vanliga mbrola-parametern. Du måste ändra på accel och/eller scale för att de andra scaletempo-parametrarna ska ha någon effekt.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:50
av Konservburk
Hans Linde skrev:- vi har en provat ut en revsion på "r4-temat" som funkar på i386C än.

Hmm... det där var nog inte rätt, vid närmare eftertanke. Det blir samma sak
fast jag har inte reset o röst-valet på F-tang.
Vissa tangentbindningar fungerar med compiz, men andra fungerar inte?

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:55
av Hans Linde
Okay då väntar jag med det här:

iconv -f utf-8 -t iso8859-1 ~/bin/talsyntes.sh > ~/bin/talsyntes2.sh
chmod +x ~/bin/talsyntes2.sh
~/bin/talsyntes2.sh adjust


Jag tror att det var kommadot som fixade typsnittsproblemet.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:55
av Hans Linde
Jag provar lite till med Scaletempo.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 13:56
av Hans Linde
angående Zenity avvaktar jag på dina instruktioner.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 14:18
av Hans Linde
Se man på. Det blev tid över för en utökning av "önskelistan". :)
Jag vill skriva en siffra -9 _0_9 ( -9 -- 9) för att ställa in värdet. :-*

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 14:25
av Hans Linde
Jag har försummat mitt "hälsoprogram" den senaste tid. :(
Vad det nu kan bero på.. ;D ;D

Jag försvinner för en simtur, om det inte är något omgående som önskas?

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 15:53
av Hans Linde
Klar tecken.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 17:50
av Hans Linde
Jag har nu gjort en djupdykning i Scaletempo "redigering".
Det är just det. Scaletempo erbjuder flera justeringar,
men de förändrar ljud endast till viss del, för att sedan
helt förstöra den.
Det är viktigt att vet att jag inte är ljudtekniker
eller har konskap om Scaletempo, utan endast utgått
får det information som jag kommit till del här.

Det här är noteringarna jag gjort under test.
-------
081014 16:30 Scaletempo test

F1-F4 justeras för högst hörbara hastighet.

Hast +70
Läge -30
Tät 0


Den rösten tas till Scaletempo.


pitch:

accel 0-20
F8-10 ingen skillnad
gate ?? påverkar hastighet, inte kvalite.


tempo:

accel -10
F7-10 som "gate"


pitch o tempo:
ingen justering

Slutsats- jag kan inte förbättra rösten med Scaletempo, även om den ändra på flera saker.

-------------

Du sa tidigare att du inte kunde utvädera Scaletempo pga att du inte kunde
lyssna vid de hastigheter som jag vill ut till.
Jag har inte lyckats göra några betydande förbättring vid något rösthastighet.
Därför undra jag förståss om jag gör något helt fel.

De justeringar som kan göras från "adjust" F4 är av stort värde.
Den noterade hastigheten är att betrakta som ett ändläge för funktion (hörbarhet), men det
förlora kvaliten innan hastigheten har uppnåtts.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 19:37
av Konservburk
Hans Linde skrev:Jag har nu gjort en djupdykning i Scaletempo "redigering".
Det är just det. Scaletempo erbjuder flera justeringar,
men de förändrar ljud endast till viss del, för att sedan
helt förstöra den.
Det är viktigt att vet att jag inte är ljudtekniker
eller har konskap om Scaletempo, utan endast utgått
får det information som jag kommit till del här.
Grejen är att scaletempo har många parametrar som delvis beror av varandra, dvs ingenting verkar hända om man inte har höjt/sänkt någon annan parameter tillräckligt mycket.
Hans Linde skrev:Det här är noteringarna jag gjort under test.
-------
081014 16:30 Scaletempo test

F1-F4 justeras för högst hörbara hastighet.

Hast +70
Läge -30
Tät 0



Den rösten tas till Scaletempo.


pitch:

accel 0-20
F8-10 ingen skillnad
Åter igen... när du testar med scaletempo så bör du (åtminstone till att börja med) ha mbrola-parametrarna inställda på standardvärdet, dvs 0. För att öka farten med scaletemo så höjer du antingen scale eller accel eller båda två. När du gjort det så ska de andra parametrarna börja märkas av.
Hans Linde skrev:pitch o tempo:
ingen justering

Slutsats- jag kan inte förbättra rösten med Scaletempo, även om den ändra på flera saker.
De här inställningarna märks inte alls av när många av parametrarna ligger nära standardvärdet. Men i vissa lägen blir det stor skillnad... om du sätter allting till 0, ~/bin/talsyntes.sh reset och sendan ändrar på enbart accel till ungefär 20. Jämför därefter tempo med pitch så hör du att det i vissa lägen faktiskt blir stor skillnad.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 19:42
av Konservburk
r5:
* Jag har lagt in zenity-dialoger. Förhoppningsvis strular det mindre än vad Xdialog har gjort.
* Det går numera att köra ~/bin/talsyntes.sh uninstall för att rensa upp.
* Jag har gjort ett försök att automatiskt laga trasig teckenkodning, men jag vet inte om det faktiskt fungerar som jag hade tänkt mig.

Kod: Markera allt

#!/bin/sh
# r5
case "$-" in *i*) return ;; esac
export LC_ALL=C
#exec 2>&-
APP="Talsyntes"
DIR=~/".talsyntes"
SCRIPT="$DIR/talsyntes.sh"
mkdir -p "$DIR/data" "$DIR/voices"

if test "x$SCRIPT" != "x$0" && cp -f "$0" "$SCRIPT" 2>&-
then
   iconv -f utf-8 -t iso8859-1 "$0" >/dev/null 2>&- ||
   iconv -f iso8859-1 -t utf-8 "$0" >"$SCRIPT"
   chmod +x "$SCRIPT" && exec "$SCRIPT" "$@"
fi

create_dialog() {
   DIALOG=$(
      cat dialog 2>&- ||
      which zenity 2>&- ||
      which Xdialog 2>&- ||
      echo "$0: missing zenity or Xdialog" >&2
   )
   case "$1" in
   list)
      type="$2"
      title="$3"
      while read item
      do echo "$item" | grep -qE "($4)" && default=true || default=false
         case "$DIALOG" in
         *zenity)
            set "$@" "$default" "${item##*/}"
         ;;
         *Xdialog)
            set "$@" "${item##*/}" "${item##*/}"
            "$default" && set "$@" on || set "$@" off
         ;;
         esac
      done
      shift 4
      case "$DIALOG" in
      *zenity)
         set -- --width 400 --height 400 --list \
            --"$type"list --text "$title" --column "" --column "" "$@"
      ;;
      *Xdialog)
         set -- --stdout --separator "|" --no-tags \
            --"$type"list "$title" 400x400 0 "$@"
      ;;
      esac
   ;;
   scale)
      case "$DIALOG" in
      *zenity)
         set -- --scale --text "$2" --min-value -100 --value "$3"
      ;;
      *Xdialog)
         set -- --stdout --rangebox "$2" 10 60 -100 100 "$3"
      ;;
      esac
   ;;
   progress)
      case "$DIALOG" in
      *zenity)
         set -- --width 300 --progress --auto-close --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --gauge "$2" 5 60
      ;;
      esac
   ;;
   question)
      case "$DIALOG" in
      *zenity)
         set -- --question --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --yesno "$2" 10 60
      ;;
      esac
   ;;
   info)
      case "$DIALOG" in
      *zenity)
         set -- --info --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --msgbox "$2" 10 60
      ;;
      esac
   ;;
   *) return ;;
   esac
   LC_ALL=sv_SE.UTF-8 "${DIALOG:-:}" --title "$APP" "$@"
}

find -L "$DIR" -maxdepth 1 -name voice -type l -exec rm {} \;

ls "$DIR"/voices/[a-z][a-z][1-9]:* >/dev/null 2>&- &&
test -x "$SCRIPT" &&
test -x "$DIR/mbrola" ||
set install

cd "$DIR"
case "$1" in
stop)
   pkill -P $(pgrep -d, "${SCRIPT##*/}") mplayer
;;
pause)
   find "$DIR" -name mplayer.\*.fifo -type p -exec sh -c 'echo pause >{}' \;
;;
start)
   test -h "$DIR/voice" || exec "$SCRIPT" adjust voice
   "$SCRIPT" stop
   find "$DIR" -name mplayer.\*.fifo -type p -exec rm -f {} \;
   FIFO="$DIR/mplayer.$$.fifo"
   trap 'rm -f "$FIFO"' EXIT
   test -p "$FIFO" || mkfifo "$FIFO"
   if voice=$(ls voices/"$2":* 2>&-)
   then shift
   else voice="$(readlink voice)"
   fi
   voice="${voice#voices/}"

   scale_mapping() {
      awk -vmin="$1" -vdef="$2" -vmax="$3" -vbend="${4:-1}" '
         function f(x)
         {
            factor = (a != b) ? 2*a*b*log(a/b)/(a-b) : (a+b)
            return factor * log(x) * x / (x^2-1) - ((a < b) ? a : b) / bend
         }
         BEGIN {
            a = (max - def)
            b = (def - min)
            if (max < min) { a = -a; b = -b; }
            x0=2; x1=3; y0=f(x0); y1=f(x1); lim=1e-4
            while( x1>1 && ( (x1-x0)>lim || (x0-x1)>lim) ) {
               y1 = f(x1); x2 = x1 - (x1 - x0) * y1 / (y1 - y0)
               x0 = x1; x1 = x2; y0 = y1;
            }
            incl = (x1>1) ? x1 : 1
         }
         {
            expo = $1 / 100
            if (incl != 1) expo = (incl^expo - 1/incl^expo) / (incl - 1/incl)
            expo = (expo + 1) / 2
            if (a != b) expo = ((a / b)^(2 * expo) - 1) / ((a / b)^2 - 1)
            printf("%f\n", min + (max - min) * expo)
         }
      '
   }

   speed=$(2>&- scale_mapping 5 1 0.2 <speed)
   freq=$(2>&- scale_mapping 0.2 1 5 <freq)
   volume=$(2>&- scale_mapping 0.2 1 5 <volume)
   rate=$(2>&- scale_mapping 1000 16000 48000 <rate)
   scale=$(2>&- scale_mapping 0.2 1 5 <scale)
   stride=$(2>&- scale_mapping 1 60 400 <stride)
   overlap=$(2>&- scale_mapping 0 0.2 1 <overlap)
   search=$(2>&- scale_mapping 0 14 200 <search)
   method=$(2>&- cat <method)
   accel=$(2>&- scale_mapping 0.2 1 5 <accel)

   scaletempo="$scaletempo${scaletempo+:}scale=${scale:-1}"
   scaletempo="$scaletempo${scaletempo+:}stride=${stride:-60}"
   scaletempo="$scaletempo${scaletempo+:}overlap=${overlap:-0.20}"
   scaletempo="$scaletempo${scaletempo+:}search=${search:-14}"
   scaletempo="$scaletempo${scaletempo+:}speed=${method:-tempo}"
   scaletempo="-af scaletempo=$scaletempo -speed ${accel:-1}"

   speed="$2"
   freq="$3"
   volume="$4"
   rate="$5"

   xclip -o |
   espeak -v mb-"${voice%:*}" |
   "$DIR/mbrola" -e \
      -t "${speed:-1}" \
      -f "${freq:-1}" \
      -v "${volume:-1}" \
      -l "${rate:-16000}" \
      "$DIR/voices/$voice" - -.wav |
   mplayer -really-quiet -input file="$FIFO" $scaletempo -demuxer audio -
;;
reset)
   case "$2" in
   '')
      rm -f speed freq volume rate scale stride overlap search method accel
   ;;
   speed|freq|volume|rate|scale|stride|overlap|search|method|accel)
      rm -f "$2"
   ;;
   esac
;;
adjust)
   case "$2" in '')
      set "$1" $(
         printf "%s\n" \
            speed freq volume rate scale stride overlap search method accel |
         create_dialog list radio "Välj inställnig" speed
      ) || exit
   esac
   value=$(cat "$2" 2>&-)
   case "$2" in
   voice)
      case "$3" in
      '')
         voice=$(readlink voice)
         voice=$(
            ls voices/[a-z][a-z][1-9]:* 2>&- |
            create_dialog list radio "Välj röst" "${voice:-^$}"
         ) && test -n "$voice" && voice="voices/$voice"
      ;;
      *)
         voice=$(ls "voices/$2":*) 2>&-
      ;;
      esac &&
      ln -sf "$voice" voice
      exit
   ;;
   dialog)
      case "$3" in
      '')
         value=$(
            which zenity Xdialog |
            create_dialog list radio "Välj dialogrutesystem" "${value:-^$}"
         ) && echo "$value" >"$2"
      ;;
      zenity|Xdialog)
         echo "$3" >"$2"
      ;;
      esac
      exit
   ;;
   speed) title="Uppläsningshastighet" ;;
   freq) title="Röstläge" ;;
   volume) title="Uppläsningsvolym" ;;
   rate) title="Rösttäthet" ;;
   scale|stride|overlap|search|accel) title="scaletempo: $2" ;;
   method)
      case "$3" in
      '')
         value=$(
            printf "%s\n" tempo pitch both none |
            create_dialog list radio "scaletempo: $2" "${value:-tempo}"
         ) && echo "$value" >"$2"
      ;;
      tempo|pitch|both|none)
         echo "$3" >"$2"
      ;;
      esac
      exit
   ;;
   *) exit
   ;;
   esac
   case "$3" in
   '')
      value=$(create_dialog scale "$title" "${value:-0}") &&
      echo "$value" >"$2"
   ;;
   *)
      echo "$3" |
      awk -vvalue="$value" '{
         value = ($1) ? value + $1 : 0
         value = (value < 100) ? value : 100
         value = (value > -100) ? value : -100
         print(value)
      }' >"$2"
   ;;
   esac
;;
install)
   URL="http://tcts.fpms.ac.be/synthesis/mbrola"
   TMP=$(mktemp)
   trap 'rm -f "$TMP"' EXIT
   wget -qO- "$URL"/mbrcopybin.html |
   sed -n '
      s|.*"\(bin/[^"]*.zip\)"[^>]*>[^<]*LINUX i386.*|\1 (0.3Mb)|p
      s|.*"\(dba/[^/]*/[^"]*\)"[^>]*>\([^:]*:\s*[^<]*\).*|\1\t\2|p
   ' >"$TMP"
   cd "$DIR"
   voices=$(
      cd /usr/share/espeak-data/voices/mb &&
      echo mb-[a-z][a-z][1-9] |
      sed 's/mb-//g;s/\(.\)\s\(.\)/\1|\2/g'
   )
   voices=$(
      grep -E "/($voices)/" <"$TMP" | cut -f2 |
      create_dialog list check "Välj språk" '^(sw|us|en)[[:digit:]]:' |
      sed 's/:[^|]*//g'
   )
   test -n "$voices" || exit
   rm -f voices/[a-z][a-z][1-9]:* 2>&-
   cd data
   grep -E "(^bin|/$voices/)" <"$TMP" |
   awk '{
      size[NR]=size[NR-1]+substr($NF,2,length($NF)-4)
      $NF=""
      voice[NR]=$0
   } END {
      for(i=1; i<=NR; i++) {
         print(100*size[i]/size[NR],voice[i])
      }
   }' |
   while read progress file voice
   do test -f "${file##*/}" ||
      wget -q "$URL/$file" 2>&1
      if test -z "$voice"
      then
         unzip -p "${file##*/}" mbrola-linux-i386 >"$DIR"/mbrola
         chmod +x "$DIR"/mbrola
      else
         unzip -p "${file##*/}" "${voice%%:*}" >"$DIR/voices/$voice" 2>&- ||
         unzip -p "${file##*/}" "${voice%%:*}/${voice%%:*}" \
            >"$DIR/voices/$voice"
      fi
      echo $progress
   done |
   create_dialog progress "Hämtar Röster..."
   bind_key() {
      eval $("$SCRIPT" "_$1")
      gconftool-2 -a "$KEY" |
      awk '$1~/^'"$PREFIX"'[0-9]+'"$SUFFIX"'$/ && $3~/^'"$2"'$/{print($1)}' |
      while read binding
      do gconftool-2 -u "$KEY/$binding"
      done
      ID=$(
         gconftool-2 -a "$KEY" |
         sed -n "s/^\s*$PREFIX\([0-9]\+\)$SUFFIX\s*=\s*/\1\t/p" |
         sort -n |
         awk '{if($1-prev>1)exit;prev=$1}END{print(prev+1)}'
      )
      gconftool-2 \
         -s -t str "$KEY/$PREFIX${ID:-1}$SUFFIX" "$2" \
         -s -t str "$CMD/${PREFIX#run_}${ID:-1}" "$3"
   }
   for wm in metacity compiz
   do bind_key "$wm" "F1" "$SCRIPT stop"
      bind_key "$wm" "F2" "$SCRIPT pause"
      bind_key "$wm" "F3" "$SCRIPT start"
      bind_key "$wm" "F4" "$SCRIPT adjust"
      bind_key "$wm" "F5" "$SCRIPT volume"
      bind_key "$wm" "F6" "$SCRIPT rate"
      bind_key "$wm" "F7" "$SCRIPT scale"
      bind_key "$wm" "F8" "$SCRIPT stride"
      bind_key "$wm" "F9" "$SCRIPT overlap"
      bind_key "$wm" "F10" "$SCRIPT search"
      bind_key "$wm" "F11" "$SCRIPT method"
      bind_key "$wm" "F12" "$SCRIPT accel"
   done
   create_dialog info "$APP installerad"
   exec "$SCRIPT" voice
;;
uninstall)
   create_dialog question "Avinstallera $APP?" || exit
   unbind_keys() {
      eval $("$SCRIPT" "_$1")
      gconftool-2 -a "$CMD" |
      grep -F "$SCRIPT" |
      sed -n 's/[^0-9]*\([0-9]\+\)[^0-9]*/\1/p' |
      while read binding
      do gconftool-2 -u "$CMD/${PREFIX#run_}$binding"
         gconftool-2 -u "$KEY/$PREFIX$binding$SUFFIX"
      done
   }
   unbind_keys metacity
   unbind_keys compiz
   rm -rf "$DIR"
;;
_metacity)
   echo '
      KEY="/apps/metacity/global_keybindings"
      CMD="/apps/metacity/keybinding_commands"
      PREFIX="run_command_"
      SUFFIX=""
   '
;;
_compiz)
   echo '
      KEY="/apps/compiz/general/allscreens/options"
      CMD="/apps/compiz/general/allscreens/options"
      PREFIX="run_command"
      SUFFIX="_key"
   '
;;
voice|dialog|speed|freq|volume|rate|scale|stride|overlap|search|method|accel)
   exec "$SCRIPT" adjust "$@"
;;
*)
   exec "$SCRIPT" start "$@"
;;
esac

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:14
av Hans Linde
Okay , jag ska göra ett nytt försök med Scaletempo.
Föresten skrev jag gate, ska vara scale.
(min handstil är sämre än läsförmågan="acceleradanalfabetism") :o :(

Ur terminal:

i386c@i386c-ubuntu:~$ ~/bin/talsyntes.sh
mplayer: could not connect to socket
mplayer: No such file or directory
i386c@i386c-ubuntu:~$


och det pratas en stund.


Jag provar tangenterna.
Det funkar bra.
Fönstren är tydligare.
Tab-funktion är annorlunda och i övrigt ok (men något mindre logisk än Dialog (synn))
Typsnitt är korrekt.

Slutbetyg, "mycket väl godkänt".

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:16
av Hans Linde
Hmm...jag minns inte vad vi hade för något som skulle förbättras nu.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:20
av Konservburk
Hans Linde skrev:Hmm...jag minns inte vad vi hade för något som skulle förbättras nu.
Planen är nog att jag ska försöka med "hugga upp i meningar"-metoden igen. Jag vet inte hur svårt det blir, eller om det ens är möjligt... men jag har tänkt mig att det ska finnas en "starta om nuvarade mening"-funktion, samt "hoppa till förra/nästa mening".

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:22
av Hans Linde
Det är det ett fel.


Det sker ingen reglering.

Dvs F4 adjust, välj "speed" eller "freq", men det är ingen skillnad på rösten ,
när man startar om.
Har inte tittat på de andra i adjust.

F5 för volume , samma fel.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:27
av Konservburk
Hans Linde skrev:Det är det ett fel.


Det sker ingen reglering.

Dvs F4 adjust, välj "speed" eller "freq", men det är ingen skillnad på rösten ,
när man startar om.
Har inte tittat på de andra i adjust.

F5 för volume , samma fel.
Hoppsan... jag har visst haft sönder speed,freq,rate och volume när jag ordnade med zenity. Men jag ser var felet är, så det behövs ingen felsökning den här gången.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:28
av Konservburk
r6: buggfix

Kod: Markera allt

#!/bin/sh
# r6
case "$-" in *i*) return ;; esac
export LC_ALL=C
#exec 2>&-
APP="Talsyntes"
DIR=~/".talsyntes"
SCRIPT="$DIR/talsyntes.sh"
mkdir -p "$DIR/data" "$DIR/voices"

if test "x$SCRIPT" != "x$0" && cp -f "$0" "$SCRIPT" 2>&-
then
   iconv -f utf-8 -t iso8859-1 "$0" >/dev/null 2>&- ||
   iconv -f iso8859-1 -t utf-8 "$0" >"$SCRIPT"
   chmod +x "$SCRIPT" && exec "$SCRIPT" "$@"
fi

create_dialog() {
   DIALOG=$(
      cat dialog 2>&- ||
      which zenity 2>&- ||
      which Xdialog 2>&- ||
      echo "$0: missing zenity or Xdialog" >&2
   )
   case "$1" in
   list)
      type="$2"
      title="$3"
      while read item
      do echo "$item" | grep -qE "($4)" && default=true || default=false
         case "$DIALOG" in
         *zenity)
            set "$@" "$default" "${item##*/}"
         ;;
         *Xdialog)
            set "$@" "${item##*/}" "${item##*/}"
            "$default" && set "$@" on || set "$@" off
         ;;
         esac
      done
      shift 4
      case "$DIALOG" in
      *zenity)
         set -- --width 400 --height 400 --list \
            --"$type"list --text "$title" --column "" --column "" "$@"
      ;;
      *Xdialog)
         set -- --stdout --separator "|" --no-tags \
            --"$type"list "$title" 400x400 0 "$@"
      ;;
      esac
   ;;
   scale)
      case "$DIALOG" in
      *zenity)
         set -- --scale --text "$2" --min-value -100 --value "$3"
      ;;
      *Xdialog)
         set -- --stdout --rangebox "$2" 10 60 -100 100 "$3"
      ;;
      esac
   ;;
   progress)
      case "$DIALOG" in
      *zenity)
         set -- --width 300 --progress --auto-close --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --gauge "$2" 5 60
      ;;
      esac
   ;;
   question)
      case "$DIALOG" in
      *zenity)
         set -- --question --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --yesno "$2" 10 60
      ;;
      esac
   ;;
   info)
      case "$DIALOG" in
      *zenity)
         set -- --info --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --msgbox "$2" 10 60
      ;;
      esac
   ;;
   *) return ;;
   esac
   LC_ALL=sv_SE.UTF-8 "${DIALOG:-:}" --title "$APP" "$@"
}

find -L "$DIR" -maxdepth 1 -name voice -type l -exec rm {} \;

ls "$DIR"/voices/[a-z][a-z][1-9]:* >/dev/null 2>&- &&
test -x "$SCRIPT" &&
test -x "$DIR/mbrola" ||
set install

cd "$DIR"
case "$1" in
stop)
   pkill -P $(pgrep -d, "${SCRIPT##*/}") mplayer
;;
pause)
   find "$DIR" -name mplayer.\*.fifo -type p -exec sh -c 'echo pause >{}' \;
;;
start)
   test -h "$DIR/voice" || exec "$SCRIPT" adjust voice
   "$SCRIPT" stop
   find "$DIR" -name mplayer.\*.fifo -type p -exec rm -f {} \;
   FIFO="$DIR/mplayer.$$.fifo"
   trap 'rm -f "$FIFO"' EXIT
   test -p "$FIFO" || mkfifo "$FIFO"
   if voice=$(ls voices/"$2":* 2>&-)
   then shift
   else voice="$(readlink voice)"
   fi
   voice="${voice#voices/}"

   scale_mapping() {
      awk -vmin="$1" -vdef="$2" -vmax="$3" -vbend="${4:-1}" '
         function f(x)
         {
            factor = (a != b) ? 2*a*b*log(a/b)/(a-b) : (a+b)
            return factor * log(x) * x / (x^2-1) - ((a < b) ? a : b) / bend
         }
         BEGIN {
            a = (max - def)
            b = (def - min)
            if (max < min) { a = -a; b = -b; }
            x0=2; x1=3; y0=f(x0); y1=f(x1); lim=1e-4
            while( x1>1 && ( (x1-x0)>lim || (x0-x1)>lim) ) {
               y1 = f(x1); x2 = x1 - (x1 - x0) * y1 / (y1 - y0)
               x0 = x1; x1 = x2; y0 = y1;
            }
            incl = (x1>1) ? x1 : 1
         }
         {
            expo = $1 / 100
            if (incl != 1) expo = (incl^expo - 1/incl^expo) / (incl - 1/incl)
            expo = (expo + 1) / 2
            if (a != b) expo = ((a / b)^(2 * expo) - 1) / ((a / b)^2 - 1)
            printf("%f\n", min + (max - min) * expo)
         }
      '
   }

   speed=$(2>&- scale_mapping 5 1 0.2 <speed)
   freq=$(2>&- scale_mapping 0.2 1 5 <freq)
   volume=$(2>&- scale_mapping 0.2 1 5 <volume)
   rate=$(2>&- scale_mapping 1000 16000 48000 <rate)
   scale=$(2>&- scale_mapping 0.2 1 5 <scale)
   stride=$(2>&- scale_mapping 1 60 400 <stride)
   overlap=$(2>&- scale_mapping 0 0.2 1 <overlap)
   search=$(2>&- scale_mapping 0 14 200 <search)
   method=$(2>&- cat <method)
   accel=$(2>&- scale_mapping 0.2 1 5 <accel)

   scaletempo="$scaletempo${scaletempo+:}scale=${scale:-1}"
   scaletempo="$scaletempo${scaletempo+:}stride=${stride:-60}"
   scaletempo="$scaletempo${scaletempo+:}overlap=${overlap:-0.20}"
   scaletempo="$scaletempo${scaletempo+:}search=${search:-14}"
   scaletempo="$scaletempo${scaletempo+:}speed=${method:-tempo}"
   scaletempo="-af scaletempo=$scaletempo -speed ${accel:-1}"

   speed="${speed:-$2}"
   freq="${freq:-$3}"
   volume="${volume:-$4}"
   rate="${rate:-$5}"

   xclip -o |
   espeak -v mb-"${voice%:*}" |
   "$DIR/mbrola" -e \
      -t "${speed:-1}" \
      -f "${freq:-1}" \
      -v "${volume:-1}" \
      -l "${rate:-16000}" \
      "$DIR/voices/$voice" - -.wav |
   mplayer -really-quiet -input file="$FIFO" $scaletempo -demuxer audio -
;;
reset)
   case "$2" in
   '')
      rm -f speed freq volume rate scale stride overlap search method accel
   ;;
   speed|freq|volume|rate|scale|stride|overlap|search|method|accel)
      rm -f "$2"
   ;;
   esac
;;
adjust)
   case "$2" in '')
      set "$1" $(
         printf "%s\n" \
            speed freq volume rate scale stride overlap search method accel |
         create_dialog list radio "Välj inställnig" speed
      ) || exit
   esac
   value=$(cat "$2" 2>&-)
   case "$2" in
   voice)
      case "$3" in
      '')
         voice=$(readlink voice)
         voice=$(
            ls voices/[a-z][a-z][1-9]:* 2>&- |
            create_dialog list radio "Välj röst" "${voice:-^$}"
         ) && test -n "$voice" && voice="voices/$voice"
      ;;
      *)
         voice=$(ls "voices/$2":*) 2>&-
      ;;
      esac &&
      ln -sf "$voice" voice
      exit
   ;;
   dialog)
      case "$3" in
      '')
         value=$(
            which zenity Xdialog |
            create_dialog list radio "Välj dialogrutesystem" "${value:-^$}"
         ) && echo "$value" >"$2"
      ;;
      zenity|Xdialog)
         echo "$3" >"$2"
      ;;
      esac
      exit
   ;;
   speed) title="Uppläsningshastighet" ;;
   freq) title="Röstläge" ;;
   volume) title="Uppläsningsvolym" ;;
   rate) title="Rösttäthet" ;;
   scale|stride|overlap|search|accel) title="scaletempo: $2" ;;
   method)
      case "$3" in
      '')
         value=$(
            printf "%s\n" tempo pitch both none |
            create_dialog list radio "scaletempo: $2" "${value:-tempo}"
         ) && echo "$value" >"$2"
      ;;
      tempo|pitch|both|none)
         echo "$3" >"$2"
      ;;
      esac
      exit
   ;;
   *) exit
   ;;
   esac
   case "$3" in
   '')
      value=$(create_dialog scale "$title" "${value:-0}") &&
      echo "$value" >"$2"
   ;;
   *)
      echo "$3" |
      awk -vvalue="$value" '{
         value = ($1) ? value + $1 : 0
         value = (value < 100) ? value : 100
         value = (value > -100) ? value : -100
         print(value)
      }' >"$2"
   ;;
   esac
;;
install)
   URL="http://tcts.fpms.ac.be/synthesis/mbrola"
   TMP=$(mktemp)
   trap 'rm -f "$TMP"' EXIT
   wget -qO- "$URL"/mbrcopybin.html |
   sed -n '
      s|.*"\(bin/[^"]*.zip\)"[^>]*>[^<]*LINUX i386.*|\1 (0.3Mb)|p
      s|.*"\(dba/[^/]*/[^"]*\)"[^>]*>\([^:]*:\s*[^<]*\).*|\1\t\2|p
   ' >"$TMP"
   cd "$DIR"
   voices=$(
      cd /usr/share/espeak-data/voices/mb &&
      echo mb-[a-z][a-z][1-9] |
      sed 's/mb-//g;s/\(.\)\s\(.\)/\1|\2/g'
   )
   voices=$(
      grep -E "/($voices)/" <"$TMP" | cut -f2 |
      create_dialog list check "Välj språk" '^(sw|us|en)[[:digit:]]:' |
      sed 's/:[^|]*//g'
   )
   test -n "$voices" || exit
   rm -f voices/[a-z][a-z][1-9]:* 2>&-
   cd data
   grep -E "(^bin|/$voices/)" <"$TMP" |
   awk '{
      size[NR]=size[NR-1]+substr($NF,2,length($NF)-4)
      $NF=""
      voice[NR]=$0
   } END {
      for(i=1; i<=NR; i++) {
         print(100*size[i]/size[NR],voice[i])
      }
   }' |
   while read progress file voice
   do test -f "${file##*/}" ||
      wget -q "$URL/$file" 2>&1
      if test -z "$voice"
      then
         unzip -p "${file##*/}" mbrola-linux-i386 >"$DIR"/mbrola
         chmod +x "$DIR"/mbrola
      else
         unzip -p "${file##*/}" "${voice%%:*}" >"$DIR/voices/$voice" 2>&- ||
         unzip -p "${file##*/}" "${voice%%:*}/${voice%%:*}" \
            >"$DIR/voices/$voice"
      fi
      echo $progress
   done |
   create_dialog progress "Hämtar Röster..."
   bind_key() {
      eval $("$SCRIPT" "_$1")
      gconftool-2 -a "$KEY" |
      awk '$1~/^'"$PREFIX"'[0-9]+'"$SUFFIX"'$/ && $3~/^'"$2"'$/{print($1)}' |
      while read binding
      do gconftool-2 -u "$KEY/$binding"
      done
      ID=$(
         gconftool-2 -a "$KEY" |
         sed -n "s/^\s*$PREFIX\([0-9]\+\)$SUFFIX\s*=\s*/\1\t/p" |
         sort -n |
         awk '{if($1-prev>1)exit;prev=$1}END{print(prev+1)}'
      )
      gconftool-2 \
         -s -t str "$KEY/$PREFIX${ID:-1}$SUFFIX" "$2" \
         -s -t str "$CMD/${PREFIX#run_}${ID:-1}" "$3"
   }
   for wm in metacity compiz
   do bind_key "$wm" "F1" "$SCRIPT stop"
      bind_key "$wm" "F2" "$SCRIPT pause"
      bind_key "$wm" "F3" "$SCRIPT start"
      bind_key "$wm" "F4" "$SCRIPT adjust"
      bind_key "$wm" "F5" "$SCRIPT volume"
      bind_key "$wm" "F6" "$SCRIPT rate"
      bind_key "$wm" "F7" "$SCRIPT scale"
      bind_key "$wm" "F8" "$SCRIPT stride"
      bind_key "$wm" "F9" "$SCRIPT overlap"
      bind_key "$wm" "F10" "$SCRIPT search"
      bind_key "$wm" "F11" "$SCRIPT method"
      bind_key "$wm" "F12" "$SCRIPT accel"
   done
   create_dialog info "$APP installerad"
   exec "$SCRIPT" voice
;;
uninstall)
   create_dialog question "Avinstallera $APP?" || exit
   unbind_keys() {
      eval $("$SCRIPT" "_$1")
      gconftool-2 -a "$CMD" |
      grep -F "$SCRIPT" |
      sed -n 's/[^0-9]*\([0-9]\+\)[^0-9]*/\1/p' |
      while read binding
      do gconftool-2 -u "$CMD/${PREFIX#run_}$binding"
         gconftool-2 -u "$KEY/$PREFIX$binding$SUFFIX"
      done
   }
   unbind_keys metacity
   unbind_keys compiz
   rm -rf "$DIR"
;;
_metacity)
   echo '
      KEY="/apps/metacity/global_keybindings"
      CMD="/apps/metacity/keybinding_commands"
      PREFIX="run_command_"
      SUFFIX=""
   '
;;
_compiz)
   echo '
      KEY="/apps/compiz/general/allscreens/options"
      CMD="/apps/compiz/general/allscreens/options"
      PREFIX="run_command"
      SUFFIX="_key"
   '
;;
voice|dialog|speed|freq|volume|rate|scale|stride|overlap|search|method|accel)
   exec "$SCRIPT" adjust "$@"
;;
*)
   exec "$SCRIPT" start "$@"
;;
esac

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:36
av Hans Linde
Planen är nog att jag ska försöka med "hugga upp i meningar"-metoden igen. Jag vet inte hur svårt det blir, eller om det ens är möjligt... men jag har tänkt mig att det ska finnas en "starta om nuvarade mening"-funktion, samt "hoppa till förra/nästa mening".

Det blir nog bra om du får det att fungera.

Mitt önskemål om dynamisk-justering är ett kliv bort, men om du tittar på det du sa kanske det här passar in i "övningen".

Nu måste man trycka "stop" för att justera något och justera något kommer man alltid att behöva någon gång.
Då skulle det vara bra om programmet kunde starta där det slutade. Det blir ju en "sorts pause" på sätt och vis.
.......Det där hade jag tänkt förklara , men det blev så krångligt, så jag hoppas du ser alternativ o vändningar själv...
Poäng är iaf att jag inte behöver börja om, eller hålla reda på hur långt i text jag läst.