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