ja, ich hatte die fertige Lösung einige Monate am Laufen. Mittlerweile habe ich das ganze wieder abgestellt, weil die Ansage des Anrufers bei Telefonanrufen zu langsam war. Beim Abnehmen des Telefons wurde immer noch der Name des Anrufers durchgesagt, was eher gestört hat.
Hier der Code für eigene Experimente:
1.) speak_mbrola.pl
Code:
# noloop=start
my $file_idx = -1;
# noloop=stop
my $mbrola_timer = new Timer;
sub speak_mbrola {
my %parms = @_;
print_log "[speak_mbrola] Speak: $parms{text}";
# 1. create random number for file name
my $file_idx_new;
do {
$file_idx_new = int(rand(100));
} while ($file_idx == $file_idx_new);
$file_idx = $file_idx_new;
# 2. create mp3 file
my $mp3_file = '/audio/mbrola' . $file_idx . '.mp3';
my $mp3_file_path = '/data/apacheroot' . $mp3_file;
my $mp3_file_url = 'http://hoelderlin' . $mp3_file;
my $command = "/data/mic/dev/eib/my_scripts/mbrola_txt2mp3.sh \"$parms{text}\" $mp3_file_path";
system($command);
my $speak_command = 'set $t_sc_speak "' . $mp3_file_url . '"';
# 3 send file to squeezecenter
set $mbrola_timer 5, $speak_command;
}
mbrola_txt2mp3.sh
Code:
#!/bin/sh TEXT="$1" MP3_FILE="$2" ROOT=/usr/local/mbrola RULES=$ROOT/txt2pho/preproc/Rules.lst HADIFIX=$ROOT/txt2pho/preproc/Hadifix.abk DATA=$ROOT/de3/de3 echo $TEXT |\ preproc $RULES $HADIFIX |\ txt2pho |\ mbrola $DATA - -.au |\ sox -t au - -t raw -r 32000 - resample |\ lame -r -x -s 32 -m m --quiet --tt "$3" --ta "$4" - "$2" 2>/dev/null > $MP3_FILE
s. Aufruf (TTS) ganz am Ende der Datei
squeezecenter_control.pl
Code:
use URI::Escape;
# *********************************************************
# 1.) connect to SC
# *********************************************************
# noloop=start
my $host_port="$config_parms{squeezecenter_host_port}";
$squeezecenter = new Socket_Item(undef, undef, $host_port,
'slimserver_cli', 'tcp','record');
&login;
# noloop=stop
sub login {
print_log "[Squeezecenter] login to squeezecenter ...";
start $squeezecenter;
set_echo $squeezecenter 0;
sleep 1;
my $login="$config_parms{squeezecenter_login}";
my $passwd="$config_parms{squeezecenter_passwd}";
set $squeezecenter 'login ' . $login . ' ' . $passwd;
set $squeezecenter 'subscribe power,play,unknownir';
}
sub check_connection {
unless (connected $squeezecenter) {
# maybe Squeezecenter was restartet, so connect again
print_log "[Squeezecenter] error occured, no connection to squeezecenter!";
stop $squeezecenter;
&login;
}
}
# *********************************************************
# 2.) react to notifications from the SC CLI interface
# *********************************************************
if (my $data = said $squeezecenter) {
my $log_src = '[Squeezecenter]';
if ($data =~ m/.* power 0 .*$/) {
print_log "$log_src power aus";
} elsif ($data =~ m/.* power 1 .*$/) {
print_log "$log_src power an";
set $EG_WZ_Multimedia ON;
} else {
print_log "$log_src unknown text: $data";
}
}
# *********************************************************
# 3.) send commands to SC via CLI interface
# *********************************************************
# noloop=start
my $sc_states = "PowerOn,PowerOff,PLGoodMorning,VolMute,Stop";
#my $playlist = 'playlist play ' . uri_escape('/volume1/music/Squeeze/playlists/GutenMorgen.m3u');
my $playlist = 'playlist play ' . uri_escape( $config_parms{squeezecenter_pl_morning} );
my %sc_commands = ('poweron' => 'power 1', 'poweroff' => 'power 0', 'plgoodmorning' => $playlist, 'volmute' => 'mixer muting 0', 'stop' => 'stop');
$v_sc_control = new Voice_Cmd("Set the house squeezecenter control to [$sc_states]");
$t_sc_speak = new Text_Cmd('Speak (.*)');
# Testen mit ./mh/bin/mhsend -run "Speak http://hoelderlin/audio/test.mp3"
my $sc_speak_timer = new Timer;
# noloop=stop
sub sc_control {
my $command = shift;
$command = $sc_commands{lc($command)} if $sc_commands{lc($command)};
print_log "[Squeezecenter] sending: $command ...";
&check_connection;
set $squeezecenter $command;
}
sub sc_control_speak {
my $mp3_url = shift;
print_log "[Squeezecenter] play url: $mp3_url ...";
&check_connection;
# 1. remember configuration
my $vol_before = 30;
my $path_before = '';
set $squeezecenter 'mixer volume ?';
if (my $vol_state = said_next $squeezecenter) {
if ($vol_state =~ m/.* mixer volume (.*)$/) {
$vol_before = $1;
}
}
set $squeezecenter 'path ?';
if (my $path_state = said_next $squeezecenter) {
if ($path_state =~ m/.* path (.*)$/) {
$path_before = $1;
}
}
# 2. play speech file
set $squeezecenter 'stop';
#sleep(2);
set $squeezecenter 'mixer volume 60';
set $squeezecenter 'playlist play ' . uri_escape( $mp3_url );
# 3. restore configuration
my $mixer_cmd = 'set $squeezecenter \'mixer volume ' . $vol_before . '\'';
#set $squeezecenter 'playlist play ' . $path_before;
set $sc_speak_timer 15, $mixer_cmd;
}
# execute SC commands
if ($state = said $v_sc_control) {
sc_control($state);
}
# play TTS speak message
if (my $mp3_url = said $t_sc_speak) {
sc_control_speak($mp3_url);
}


.
Einen Kommentar schreiben: