Sida 32 av 98

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:43
av Konservburk
Hans Linde skrev: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.
Om jag får till det som jag vill så ska det gå att trycka på en "restart"-tangent för att böja om meningen med de nya inställningarna.

Så dynamiskt som du egentligen vill ha det är vad jag vet helt omöjligt om man inte ändrar i mbrolas källkod... vi har inte tillgång till den.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:43
av Hans Linde
Ja, r6 fixar det. :)

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:46
av Hans Linde
Restart av en mening är faktiskt bättre än paus.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 20:50
av Konservburk
Du kan fundera på om skalorna är bra... eller om de bör huggas något, och isf hur mycket. Det kanske t.o.m. är någon som behöver utvidgas?

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 14 okt 2008, 21:07
av Hans Linde
först...
Det är speed, volume o freq, som jag kan ha en uppfattning ang skalas värde.
Jag återkommer om det.

Jag började tänka efter vad det är för "resa" vi gjort.
vi är nu inne på Mbrola-spåret bla pga röstens tydlighet.

Är våra möjlighet att justera rösternas egenskaper
vid högre hastigheter den samma den samma,
jämfört med Festival (mm som vi provat)?

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 11:57
av Hans Linde
Jag har varit i kontakt med diverse universite och företag, och avvaktar svar.
Det verkar inte omöjligt att komma över bättre röster,
men vi får se och de passar i din "maskin".

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 12:15
av Hans Linde
Jag har också gjort lite till på Scaletempo.

Det är alltså de yttre skalvärden som jag tycker är tillräckliga.
Jag har då valt att gå något utanför "okay".

--
081015 12:00 utvärdering av Mbrola/Scaletempo skalor.

speed -40 - +70
freq -60 - +60
volum behåll skala

Övriga tillsvidare ingen kommentar.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 12:43
av Hans Linde
Jaghar nu igen gjortettförsök med Scaletempo skalorna,
ochjag får ge ddig rätt att det troligen går att finna en förbättring,
med hjälp av det. Fast att leta och justera på det viset som nu erbjuds
som kommer jag ingen vart. Utanblir för uttröttad för att kunna jämföra
variationerna. Jag kan inte tro att jag kan komma till någon slutsats
utan att lyssna och justera samtidigt är möjligt.
Eftersomproblemet är ganska likt, även om det är värre på Festival-rösterna,
så om det var lättare att åstkomman en "testbänk" med det så kanjag "jobba" med det.
Det måste iaf bli ett värde som vi använder för alla röster och tex graderas
efterr hastighet. Att en användare ska "trixa" med dettaser jag som uteslutet.

Mao om du kan åstakomma ettannat sätt att testa hoppas jag
kunna bidra mera.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 16:53
av Konservburk
Hans Linde skrev:Jaghar nu igen gjortettförsök med Scaletempo skalorna,
ochjag får ge ddig rätt att det troligen går att finna en förbättring,
med hjälp av det. Fast att leta och justera på det viset som nu erbjuds
som kommer jag ingen vart. Utanblir för uttröttad för att kunna jämföra
variationerna. Jag kan inte tro att jag kan komma till någon slutsats
utan att lyssna och justera samtidigt är möjligt.
Eftersomproblemet är ganska likt, även om det är värre på Festival-rösterna,
så om det var lättare att åstkomman en "testbänk" med det så kanjag "jobba" med det.
Det måste iaf bli ett värde som vi använder för alla röster och tex graderas
efterr hastighet. Att en användare ska "trixa" med dettaser jag som uteslutet.

Mao om du kan åstakomma ettannat sätt att testa hoppas jag
kunna bidra mera.
Jag har fixat till så att det blir mer "lätt-testat" nu...

* Inställningsvärdet registreras i r7 utan att du behöver stänga inställningsfönstret. Det gäller dock bara för alla skalningsinställningar. Listinställningsfönster måste du fortfarande stänga för att värdet ska ändras. Och du måste fortfande alltid starta om uppspelningen för att ändringarna ska märkas.

* Jag har lagt till ~/bin/talsyntes.sh loop (F4) som automatiskt startar om uppläsningen hela tiden tills du stannar den med stop-kommandot.

* Jag har även lagt till ~/bin/talsyntes.sh list (F6) som visar en lista över vilka inställningsvärden du har valt, samt vad dessa motsvarar efter omskalning. Det verkliga värdet kan vara bra att veta ifall du hittar någon bra inställning. Då slipper du leta reda på den igen om vi senare ändrar på skalan.

För att det ska bli enkelt att testa olika inställningsvärden gör du alltså så här:
* Markera en kort text (ett par ord).
* Starta uppläsnings loopen: ~/bin/talsyntes.sh loop (F4).
* Öppna ett eller flera inställingsfönster och börja ändra värden.

Eftesom jag blev tvungen att ändra en del i ~/.talsyntes så är det bäst att du kör ~/bin/talsyntes uninstall det första du gör så att inget gammalt ligger kvar och stör.

Kod: Markera allt

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

mkdir -p "$DATA_DIR" "$VOICES_DIR" "$SETTINGS_DIR"

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
get_dialog() {
   cat "$SETTINGS_DIR"/dialog 2>&- ||
   which zenity 2>&- ||
   which Xdialog 2>&- ||
   echo "$0: missing zenity or Xdialog" >&2
}
case "$1" in
stop|start)
   pkill -P $(pgrep -u"$(id -u)" -d, "${SCRIPT##*/}") mplayer
;;
pause)
   find "$DIR" -name mplayer.\*.fifo -type p -exec sh -c 'echo pause >{}' \;
;;
list)
   dialog="$(get_dialog)"
   ps -opid=,ppid=,args= $(pgrep -u"$(id -u)" "${SCRIPT##*/}") |
   grep -vE "(^|[[:blank:]]+)$$([[:blank:]]+|$)" | grep "$*$" |
   while read pid
   do pkill -P "${pid%% *}" "${dialog##*/}"
   done
;;
*)
   ps -opid=,ppid=,args= $(pgrep -u"$(id -u)" "${SCRIPT##*/}") |
   grep -vE "(^|[[:blank:]]+)$$([[:blank:]]+|$)" |
   grep -q "$*$" && exit
;;
esac

create_dialog() {
   dialog="$(get_dialog)"
   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" --print-partial \
            --min-value -100 --max-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 --no-wrap --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --fixed-font --msgbox "$2" 0 0
      ;;
      esac
   ;;
   *) return ;;
   esac
   LC_ALL=sv_SE.UTF-8 "${dialog:-:}" --title "$APP" "$@"
}
metacity_info() {
   echo '
      KEY="/apps/metacity/global_keybindings"
      CMD="/apps/metacity/keybinding_commands"
      PREFIX="run_command_"
      SUFFIX=""
   '
}
compiz_info() {
   echo '
      KEY="/apps/compiz/general/allscreens/options"
      CMD="/apps/compiz/general/allscreens/options"
      PREFIX="run_command"
      SUFFIX="_key"
   '
}
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)
      }
   '
}
get_speed() {
   2>&- scale_mapping 5 1 0.2 <"$SETTINGS_DIR"/speed || echo 1.0
}
get_freq() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/freq || echo 1.0
}
get_volume() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/volume || echo 1.0
}
get_rate() {
   2>&- scale_mapping 1000 16000 48000 <"$SETTINGS_DIR"/rate || echo 16000
}
get_scale() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/scale || echo 1.0
}
get_stride() {
   2>&- scale_mapping 1 60 400 <"$SETTINGS_DIR"/stride || echo 60
}
get_overlap() {
   2>&- scale_mapping 0 0.2 1 <"$SETTINGS_DIR"/overlap || echo 0.2
}
get_search() {
   2>&- scale_mapping 0 14 200 <"$SETTINGS_DIR"/search || echo 14
}
get_method() {
   2>&- cat "$SETTINGS_DIR"/method || echo tempo
}
get_accel() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/accel || echo 1.0
}
get_voice() {
   2>&- readlink "$SETTINGS_DIR"/voice
}

find -L "$SETTINGS_DIR" -maxdepth 1 -name voice -type l -exec rm {} \;
ls "$VOICES_DIR"/[a-z][a-z][1-9]:* >/dev/null 2>&- &&
test -x "$SCRIPT" &&
test -x "$DIR/mbrola" ||
set install

cd "$DIR"
case "$1" in
loop)
   while "$SCRIPT" start ; do :; done
;;
start)
   xclip -o | grep -q . || exit
   test -h "$SETTINGS_DIR/voice" || exec "$SCRIPT" adjust voice
   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_DIR/$2":* 2>&-)
   then shift
   else voice="$(get_voice)"
   fi
   voice="${voice##*/}"
   speed="$(get_speed)"
   freq="$(get_freq)"
   volume="$(get_volume)"
   rate="$(get_rate)"
   scale="$(get_scale)"
   stride="$(get_stride)"
   overlap="$(get_overlap)"
   search="$(get_search)"
   method="$(get_method)"
   accel="$(get_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}"

   xclip -o |
   espeak -v mb-"${voice%:*}" |
   "$DIR/mbrola" -e \
      -t "${speed:-1}" \
      -f "${freq:-1}" \
      -v "${volume:-1}" \
      -l "${rate:-16000}" \
      "$VOICES_DIR/$voice" - -.wav |
   mplayer -really-quiet -input file="$FIFO" $scaletempo -demuxer audio -
;;
list)
   cd "$SETTINGS_DIR"
   list=$(
      echo "Nuvarande inställningar"
      echo
      for option in \
         voice speed freq rate volume accel \
         scale stride overlap search method dialog
      do if test -h "$option"
         then
            setting=$(readlink "$option")
            setting="${setting##*/}" && value=""
         else
            setting="$(cat $option 2>&-)"
            value="$(get_$option)"
         fi
         test "$option" = dialog &&
         setting="${value##*/}" && value=""
         test "$option" = method &&
         setting="${setting:-tempo}" && value=""
         printf "%s:\t\t%s\t\t%s\n" \
            "$option" "${setting:-0}" "${value:+(}$value${value:+)}"
      done #| sort
   )
   create_dialog info "$list"
   exit
;;
reset)
   cd "$SETTINGS_DIR"
   case "$2" in
   '')
      create_dialog question "Återställ standardinställningarna?" || exit
      rm -f \
         dialog speed freq volume rate scale stride overlap search method accel
   ;;
   dialog|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 voice dialog |
         create_dialog list radio "Välj inställning" speed
      )
      test $# -gt 1 && exec "$SCRIPT" "$@" || exit
exit
   esac
   value=$(cat "$SETTINGS_DIR/$2" 2>&-)
   case "$2" in
   voice)
      case "$3" in
      '')
         voice=$(readlink "$SETTINGS_DIR"/voice)
         voice=$(
            ls "$VOICES_DIR"/[a-z][a-z][1-9]:* 2>&- |
            create_dialog list radio "Välj röst" "^${voice#../}$"
         ) && test -n "$voice" && voice="$VOICES_DIR/$voice"
      ;;
      *)
         voice=$(ls "$VOICES_DIR/$3":* 2>&-)
      ;;
      esac &&
      ln -sf "$voice" "$SETTINGS_DIR"/voice
      exit
   ;;
   dialog)
      case "$3" in
      '')
         value=$(
            which zenity Xdialog 2>&- |
            create_dialog list radio "Välj dialogrutesystem" "${value:-zenity}"
         ) && echo "$value" >"$SETTINGS_DIR/$2"
      ;;
      zenity|Xdialog)
         echo "$3" >"$SETTINGS_DIR/$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" >"$SETTINGS_DIR/$2"
      ;;
      tempo|pitch|both|none)
         echo "$3" >"$SETTINGS_DIR/$2"
      ;;
      esac
      exit
   ;;
   *) exit
   ;;
   esac
   case "$3" in
   '')
      { create_dialog scale "$title" "${value:-0}" || echo "$value"; } |
      while read value
      do test -n "$value" && echo "$value" >"$SETTINGS_DIR/$2"
      done
   ;;
   *)
      echo "$3" |
      awk -vvalue="$value" '{
         value = ($1) ? value + $1 : 0
         value = (value < 100) ? value : 100
         value = (value > -100) ? value : -100
         print(value)
      }' >"$SETTINGS_DIR/$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"
   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_DIR"/[a-z][a-z][1-9]:* 2>&-
   cd "$DATA_DIR"
   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%%:*}" >"$VOICES_DIR/$voice" 2>&- ||
         unzip -p "${file##*/}" "${voice%%:*}/${voice%%:*}" \
            >"$VOICES_DIR/$voice"
      fi
      echo $progress
   done |
   create_dialog progress "Hämtar Röster..."
   bind_key() {
      eval $("$1"_info)
      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 loop"
      bind_key "$wm" "F5" "$SCRIPT adjust"
      bind_key "$wm" "F6" "$SCRIPT list"
      bind_key "$wm" "F7" "$SCRIPT reset"
      bind_key "$wm" "F8" "$SCRIPT uninstall"
      bind_key "$wm" "F9" "$SCRIPT install"
      bind_key "$wm" "F1" "<Control>$SCRIPT voice"
      bind_key "$wm" "F2" "<Control>$SCRIPT speed"
      bind_key "$wm" "F3" "<Control>$SCRIPT freq"
      bind_key "$wm" "F4" "<Control>$SCRIPT rate"
      bind_key "$wm" "F5" "<Control>$SCRIPT volume"
      bind_key "$wm" "F6" "<Control>$SCRIPT accel"
      bind_key "$wm" "F7" "<Control>$SCRIPT scale"
      bind_key "$wm" "F8" "<Control>$SCRIPT stride"
      bind_key "$wm" "F9" "<Control>$SCRIPT overlap"
      bind_key "$wm" "F10" "<Control>$SCRIPT search"
      bind_key "$wm" "F11" "<Control>$SCRIPT method"
      bind_key "$wm" "F12" "<Control>$SCRIPT dialog"
   done
   create_dialog info "$APP installerad"
   exec "$SCRIPT" voice
;;
uninstall)
   create_dialog question "Avinstallera $APP?" || exit
   unbind_keys() {
      eval $("$1"_info)
      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"
   create_dialog info "$APP avinstallerad"
;;
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: 15 okt 2008, 17:03
av Hans Linde
Kul
Jag ska titta på med en gång.

Jag har varit i kontakt med ett 20tal personer/företag till, men det är ingen
så resulterat i något avgörande än, men det verkar värt att
fortsätta.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 17:16
av Hans Linde
Burr!

Den där "uninstall" var som en "självmordbombare" i mjukvaruversion.
Efter alla den svett.
den kommer jag ha mardrömmar om. :(

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 17:24
av Hans Linde
installation flyter på, men slut resultatet uteblir.

Fel
Barnprocessen felar.
alla F-tangenter ger sådan fel ref till ny kopplad-funktion.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 17:43
av Konservburk
Hans Linde skrev:Fel
Barnprocessen felar.
alla F-tangenter ger sådan fel ref till ny kopplad-funktion.
Är det bara tangentkopplingarna som stular? Eller fungerar ingenting alls?

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 18:16
av Hans Linde
Nja det blir ju samma sak ur min-nivå.
Jag har inte kör terminal kommadon. Ska jag?

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 18:21
av Konservburk
Hans Linde skrev:Nja det blir ju samma sak ur min-nivå.
Jag har inte kör terminal kommadon. Ska jag?
Om inte bindningarna fungerar direkt så är det bäst att försöka från terminalen. Då märker man om det blir något helt galet fel med en massa felmeddelanden, eller om det fungerar som det ska... och isf är det åter igen tangentbindningarna som inte riktigt vill.

Kod: Markera allt

~/bin/talsyntes.sh adjust
~/bin/talsyntes.sh start

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 18:21
av Hans Linde
Då har jag kör i terminal
loop
list
de funkar fint.
Jag trycker också F1 "stop" och rösten tystnar. Dock kommer samma felmeddelande upp.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 18:26
av Hans Linde
Även
start
adust
funkar fint via terminal.

De här terminal kommando är lite för kraftfull för min smak :-\ .
Det är lätt att fixa fel. Men om jag gör fel, då känns det oåterkallerligt. :'(
Så därför "provar inte gärna något i terminal, på den PC vi jobbar.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 18:30
av Konservburk
Hans Linde skrev:Då har jag kör i terminal
loop
list
de funkar fint.
Jag trycker också F1 "stop" och rösten tystnar. Dock kommer samma felmeddelande upp.
Jag har klantat mig ordentligt ser jag. Tanken var att flytta några av kommandona till ctrl-Fn för att få mer plats. Men jag har av misstag lagt ctrl-koden famför kommandot istället för framför tangenten.

r8: buggfix

Kod: Markera allt

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

mkdir -p "$DATA_DIR" "$VOICES_DIR" "$SETTINGS_DIR"

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
get_dialog() {
   cat "$SETTINGS_DIR"/dialog 2>&- ||
   which zenity 2>&- ||
   which Xdialog 2>&- ||
   echo "$0: missing zenity or Xdialog" >&2
}
case "$1" in
stop|start)
   pkill -P $(pgrep -u"$(id -u)" -d, "${SCRIPT##*/}") mplayer
;;
pause)
   find "$DIR" -name mplayer.\*.fifo -type p -exec sh -c 'echo pause >{}' \;
;;
list)
   dialog="$(get_dialog)"
   ps -opid=,ppid=,args= $(pgrep -u"$(id -u)" "${SCRIPT##*/}") |
   grep -vE "(^|[[:blank:]]+)$$([[:blank:]]+|$)" | grep "$*$" |
   while read pid
   do pkill -P "${pid%% *}" "${dialog##*/}"
   done
;;
*)
   ps -opid=,ppid=,args= $(pgrep -u"$(id -u)" "${SCRIPT##*/}") |
   grep -vE "(^|[[:blank:]]+)$$([[:blank:]]+|$)" |
   grep -q "$*$" && exit
;;
esac

create_dialog() {
   dialog="$(get_dialog)"
   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" --print-partial \
            --min-value -100 --max-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 --no-wrap --text "$2"
      ;;
      *Xdialog)
         set -- --stdout --fixed-font --msgbox "$2" 0 0
      ;;
      esac
   ;;
   *) return ;;
   esac
   LC_ALL=sv_SE.UTF-8 "${dialog:-:}" --title "$APP" "$@"
}
metacity_info() {
   echo '
      KEY="/apps/metacity/global_keybindings"
      CMD="/apps/metacity/keybinding_commands"
      PREFIX="run_command_"
      SUFFIX=""
   '
}
compiz_info() {
   echo '
      KEY="/apps/compiz/general/allscreens/options"
      CMD="/apps/compiz/general/allscreens/options"
      PREFIX="run_command"
      SUFFIX="_key"
   '
}
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)
      }
   '
}
get_speed() {
   2>&- scale_mapping 5 1 0.2 <"$SETTINGS_DIR"/speed || echo 1.0
}
get_freq() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/freq || echo 1.0
}
get_volume() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/volume || echo 1.0
}
get_rate() {
   2>&- scale_mapping 1000 16000 48000 <"$SETTINGS_DIR"/rate || echo 16000
}
get_scale() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/scale || echo 1.0
}
get_stride() {
   2>&- scale_mapping 1 60 400 <"$SETTINGS_DIR"/stride || echo 60
}
get_overlap() {
   2>&- scale_mapping 0 0.2 1 <"$SETTINGS_DIR"/overlap || echo 0.2
}
get_search() {
   2>&- scale_mapping 0 14 200 <"$SETTINGS_DIR"/search || echo 14
}
get_method() {
   2>&- cat "$SETTINGS_DIR"/method || echo tempo
}
get_accel() {
   2>&- scale_mapping 0.2 1 5 <"$SETTINGS_DIR"/accel || echo 1.0
}
get_voice() {
   2>&- readlink "$SETTINGS_DIR"/voice
}

find -L "$SETTINGS_DIR" -maxdepth 1 -name voice -type l -exec rm {} \;
ls "$VOICES_DIR"/[a-z][a-z][1-9]:* >/dev/null 2>&- &&
test -x "$SCRIPT" &&
test -x "$DIR/mbrola" ||
set install

cd "$DIR"
case "$1" in
loop)
   while "$SCRIPT" start ; do :; done
;;
start)
   xclip -o | grep -q . || exit
   test -h "$SETTINGS_DIR/voice" || exec "$SCRIPT" adjust voice
   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_DIR/$2":* 2>&-)
   then shift
   else voice="$(get_voice)"
   fi
   voice="${voice##*/}"
   speed="$(get_speed)"
   freq="$(get_freq)"
   volume="$(get_volume)"
   rate="$(get_rate)"
   scale="$(get_scale)"
   stride="$(get_stride)"
   overlap="$(get_overlap)"
   search="$(get_search)"
   method="$(get_method)"
   accel="$(get_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}"

   xclip -o |
   espeak -v mb-"${voice%:*}" |
   "$DIR/mbrola" -e \
      -t "${speed:-1}" \
      -f "${freq:-1}" \
      -v "${volume:-1}" \
      -l "${rate:-16000}" \
      "$VOICES_DIR/$voice" - -.wav |
   mplayer -really-quiet -input file="$FIFO" $scaletempo -demuxer audio -
;;
list)
   cd "$SETTINGS_DIR"
   list=$(
      echo "Nuvarande inställningar"
      echo
      for option in \
         voice speed freq rate volume accel \
         scale stride overlap search method dialog
      do if test -h "$option"
         then
            setting=$(readlink "$option")
            setting="${setting##*/}" && value=""
         else
            setting="$(cat $option 2>&-)"
            value="$(get_$option)"
         fi
         test "$option" = dialog &&
         setting="${value##*/}" && value=""
         test "$option" = method &&
         setting="${setting:-tempo}" && value=""
         printf "%s:\t\t%s\t\t%s\n" \
            "$option" "${setting:-0}" "${value:+(}$value${value:+)}"
      done #| sort
   )
   create_dialog info "$list"
   exit
;;
reset)
   cd "$SETTINGS_DIR"
   case "$2" in
   '')
      create_dialog question "Återställ standardinställningarna?" || exit
      rm -f \
         dialog speed freq volume rate scale stride overlap search method accel
   ;;
   dialog|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 voice dialog |
         create_dialog list radio "Välj inställning" speed
      )
      test $# -gt 1 && exec "$SCRIPT" "$@" || exit
exit
   esac
   value=$(cat "$SETTINGS_DIR/$2" 2>&-)
   case "$2" in
   voice)
      case "$3" in
      '')
         voice=$(readlink "$SETTINGS_DIR"/voice)
         voice=$(
            ls "$VOICES_DIR"/[a-z][a-z][1-9]:* 2>&- |
            create_dialog list radio "Välj röst" "^${voice#../}$"
         ) && test -n "$voice" && voice="$VOICES_DIR/$voice"
      ;;
      *)
         voice=$(ls "$VOICES_DIR/$3":* 2>&-)
      ;;
      esac &&
      ln -sf "$voice" "$SETTINGS_DIR"/voice
      exit
   ;;
   dialog)
      case "$3" in
      '')
         value=$(
            which zenity Xdialog 2>&- |
            create_dialog list radio "Välj dialogrutesystem" "${value:-zenity}"
         ) && echo "$value" >"$SETTINGS_DIR/$2"
      ;;
      zenity|Xdialog)
         echo "$3" >"$SETTINGS_DIR/$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" >"$SETTINGS_DIR/$2"
      ;;
      tempo|pitch|both|none)
         echo "$3" >"$SETTINGS_DIR/$2"
      ;;
      esac
      exit
   ;;
   *) exit
   ;;
   esac
   case "$3" in
   '')
      { create_dialog scale "$title" "${value:-0}" || echo "$value"; } |
      while read value
      do test -n "$value" && echo "$value" >"$SETTINGS_DIR/$2"
      done
   ;;
   *)
      echo "$3" |
      awk -vvalue="$value" '{
         value = ($1) ? value + $1 : 0
         value = (value < 100) ? value : 100
         value = (value > -100) ? value : -100
         print(value)
      }' >"$SETTINGS_DIR/$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"
   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_DIR"/[a-z][a-z][1-9]:* 2>&-
   cd "$DATA_DIR"
   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%%:*}" >"$VOICES_DIR/$voice" 2>&- ||
         unzip -p "${file##*/}" "${voice%%:*}/${voice%%:*}" \
            >"$VOICES_DIR/$voice"
      fi
      echo $progress
   done |
   create_dialog progress "Hämtar Röster..."
   bind_key() {
      eval $("$1"_info)
      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 loop"
      bind_key "$wm" "F5" "$SCRIPT adjust"
      bind_key "$wm" "F6" "$SCRIPT list"
      bind_key "$wm" "F7" "$SCRIPT reset"
      bind_key "$wm" "F8" "$SCRIPT uninstall"
      bind_key "$wm" "F9" "$SCRIPT install"
      bind_key "$wm" "<Control>F1" "$SCRIPT voice"
      bind_key "$wm" "<Control>F2" "$SCRIPT speed"
      bind_key "$wm" "<Control>F3" "$SCRIPT freq"
      bind_key "$wm" "<Control>F4" "$SCRIPT rate"
      bind_key "$wm" "<Control>F5" "$SCRIPT volume"
      bind_key "$wm" "<Control>F6" "$SCRIPT accel"
      bind_key "$wm" "<Control>F7" "$SCRIPT scale"
      bind_key "$wm" "<Control>F8" "$SCRIPT stride"
      bind_key "$wm" "<Control>F9" "$SCRIPT overlap"
      bind_key "$wm" "<Control>F10" "$SCRIPT search"
      bind_key "$wm" "<Control>F11" "$SCRIPT method"
      bind_key "$wm" "<Control>F12" "$SCRIPT dialog"
   done
   create_dialog info "$APP installerad"
   exec "$SCRIPT" voice
;;
uninstall)
   create_dialog question "Avinstallera $APP?" || exit
   unbind_keys() {
      eval $("$1"_info)
      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"
   create_dialog info "$APP avinstallerad"
;;
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: 15 okt 2008, 18:33
av Hans Linde
En av Professorerna på Sth Universitet hörde just av sig och trodde att det skulle finnas
"tillgängliga" röster av kvalite på KTH http://www.speech.kth.se/info/
o
Thesaurus Lex http://www.thesauruslex.com/thesmeny.htm.

Detta och 5 andra spår tycker jag har varit värda att följa upp.
Det blir imorgon.

Re: Talsyntes/Festival/Scaletempo/Ubuntu-AMD64

Postat: 15 okt 2008, 18:35
av Hans Linde
"Jag har klantat mig ordentligt ser jag. Tanken var att flytta några av kommandona till ctrl-Fn för att få mer plats. Men jag har av misstag lagt ctrl-koden famför kommandot istället för framför tangenten.
"


Aah.. ja just det...det var vad jag tänkte föreslå.. ;D ;D ;D

Jag ser annars fram emot :'( "ensådärkrasmpkoppladhandiCtlFläge" :'(