Talsyntes:____"För Folk I Tiden"

Varning! Det som diskuteras här är inte alltid enkelt och det kan hända att vissa installationer/modifieringar kan göra ditt system oanvändbart. Inget för nybörjare. Gör alltid backup av känslig data innan du experimenterar.
Kategoriregler
Varning! Det som diskuteras här är inte alltid enkelt och det kan hända att vissa installationer/modifieringar kan göra ditt system oanvändbart. Inget för nybörjare. Gör alltid backup av känslig data innan du experimenterar.
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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?
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg av Hans Linde »

Jag provar lite till med Scaletempo.
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg av Hans Linde »

angående Zenity avvaktar jag på dina instruktioner.
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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. :-*
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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?
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg av Hans Linde »

Klar tecken.
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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".
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg av Hans Linde »

Hmm...jag minns inte vad vi hade för något som skulle förbättras nu.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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".
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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
Hans Linde
Inlägg: 3375
Blev medlem: 06 sep 2008, 07:46
OS: Crunchbang
Utgåva: Vet inte/ingen utgåva passar

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Inlägg 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.
Skriv svar

Återgå till "Experimentverkstad"