Ankündigung

Einklappen
Keine Ankündigung bisher.

Misterhouse und Squeezebox

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • katmic
    antwortet
    Hi,

    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;
        
    }
    2.) Der Inhalt des Shellscripts sieht so aus:

    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
    3.) Und hier noch eine Funktion, die das erste mbrola.pl verwendet,
    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:


  • djtark
    antwortet
    aktueller Stand ?

    Hallo zusammen,

    gibts hierzu Updates ?

    Einen Kommentar schreiben:


  • katmic
    antwortet
    So, jetzt habe ich immerhin schonmal rausbekommen wie ich die mbrola au-Files nach mp3 wandeln kann:

    Ich habe mbrola wie hier
    https://knx-user-forum.de/57890-post14.html
    beschrieben installiert.

    Das au-file von mbrola kann dann mit
    Code:
    sox test.au -t raw -r 32000 - resample |  lame -r -x -s 32 -m m --quiet --tt "$3" --ta "$4" - "$2" 2>/dev/null > test.mp3
    nach mp3 konvertiert werden.

    Unter Ubuntu musste ich dann noch eine Lib für Sox nachinstallieren:
    Code:
    sudo apt-get install libsox-fmt-base
    Jetzt muss ich nur noch das mp3 zum Squeezecenter-NAS rüberschieben und dann die CLI-Schnittstelle anpassen. Wenn ich fertig bin poste ich den kompletten Code.

    Gruss
    Michael

    Einen Kommentar schreiben:


  • katmic
    antwortet
    Da gibt es doch ein paar Unterschiede. Wenn z.B. gerade Musik gehört wird, muss diese ausgeblendet werden, die MH-Durchsage abgespielt werden, danach sollte die ursprüngliche Playlist oder Radiosender weiter gespielt werden. Es ist also etwas mehr Logik notwendig, die in MH realisiert werden muss.
    Um zu streamen wie beim Internetradio benötigst Du einen eigenen Streaming-Server wie Icecast. Ich denke, da ist der Aufwand deutlich groesser als das Abspielen einer Wave-Datei einzuleiten.

    Gruss
    Michael

    Einen Kommentar schreiben:


  • DirkNienhaus
    antwortet
    HI,

    ja funktionieren wird es, das denke ich auch. Ich fände es "schick", wenn es im Squeezecenter einen "Kanal" für Misterhouse gäbe, den man einfach aktiv schaltet, sobald MH etwas zu sagen hat.
    Also Misterhouse als Streamingserver und das Squezzecenter als Client (behandelt wie ein Internetradio-Kanal).

    Any comments?

    Einen Kommentar schreiben:


  • katmic
    antwortet
    Zitat von DirkNienhaus Beitrag anzeigen
    Hi Michael,
    Es sei denn, MH würde die Audiodaten direkt zum Squeezecenter schicken, aber wie? Die Misterhouse Wave-Dateien scheinen mir da nicht die eleganteste Lösung zu sein...
    Warum nicht, ich denke so wird es funktionieren. MH erzeugt mit festival oder mbrola eine Wave-Datei, die dann in das Squeezecenter-Verzeichnis kopiert wird. Dann kann sie per Squeezecenter CLI-Befehl von MH aus abgespielt werden.

    Ich glaub ich setze mich nächste Woche da mal dran, wenn das Wetter nicht zu schön ist .


    Gruss
    Michael

    Einen Kommentar schreiben:


  • DirkNienhaus
    antwortet
    Zitat von katmic Beitrag anzeigen
    Ich plane noch eine Squeezebox für das Bad, da wären dann morgendliche Ansagen ein echter Mehrwert.
    Hi Michael,
    genau dafür hätte ich es auch gerne

    Aber das Problem ist wohl, das es kein TTS Plugin für das Squeezecenter gibt. Somit kommt man mit xAp nicht weiter, denke ich. Es sei denn, MH würde die Audiodaten direkt zum Squeezecenter schicken, aber wie? Die Misterhouse Wave-Dateien scheinen mir da nicht die eleganteste Lösung zu sein...

    Schwierig...

    Einen Kommentar schreiben:


  • katmic
    antwortet
    Hallo Dirk,

    da ich mit xPL/xAp Probleme hatte, habe ich dann grundlegende Funktionen wie Squeezebox An/Aus, Playlist starten, Lautsärke über das CLI Interface realisiert.
    Die Sprachausgabe hatte ich erstmal nach hinten gestellt, auch weil ich momentan nur eine mögliche Ausgabemöglichkeit, nämlich die Squeezebox im Wohnzimmer, habe. Ich plane noch eine Squeezebox für das Bad, da wären dann morgendliche Ansagen ein echter Mehrwert.

    Gruss,
    Michael

    Einen Kommentar schreiben:


  • DirkNienhaus
    antwortet
    Hallo Michael,

    bist du in dem Punkt "Sprachausgabe über Squeezebox" in Verbindung mit xPL/xAP weitergekommen? Das würde mich dann mal interessieren

    Einen Kommentar schreiben:


  • katmic
    antwortet
    Nachdem ich 2 Abende mehr oder weniger erfolglos verbracht habe, möchte ich den Thread nochmal aufwärmen.

    Oben genannte Lösungen zur Ansteuerung der Squeezebox über Misterhouse funktionieren über das Web-Interface, das funktioniert zwar, ich hätte aber lieber eine Lösung über xPL/xAP, da damit auch die Sprachausgabe funktionieren soll.

    Meine Konfiguration: SC auf Synology 207+, Misterhouse auf Mini-ITX, Entwicklung unter Windows XP.

    Ich habe xPL im Squeezecenter aktiviert, leider sehe ich mit dem xPLHAL-Manager unter Windows den Squeezecenter-XPL-Node nicht.
    Daraufhin habe ich unter Squeezecenter das xAP-Plugin installiert. Jetzt sehe ich wenigstens mit dem xFx-Viewer unter Windows die xAP-SC-Nachrichten. Den MH-xAP-Hub sehe ich aber immer nicht (den MH-xPL-Hub auch nicht).

    Hat jemand eine funtkionierende Integration MH und Squeezebox mit xPL oder xAP am Laufen? Gibt es vielleicht auch ein kleines Beispiel-Skript, z.B. zur Ausgabe von Text auf der SB mit xPL oder xAP?

    Mit Forumssuche oder Google habe ich leider nichts passendes gefunden.

    Gruss,
    Michael

    Einen Kommentar schreiben:


  • katmic
    antwortet
    Zitat von aggie89go Beitrag anzeigen
    oder siehe auch:

    Yahoo! Groups
    Danke, sieht vielversprechend aus, ich werde das mal versuchen!


    Gruss,
    katmic

    Einen Kommentar schreiben:


  • aggie89go
    antwortet
    oder siehe auch:

    Yahoo! Groups

    Einen Kommentar schreiben:


  • aggie89go
    antwortet
    Hast du es schon mal mit dem Perl-script mp3_slimserver.pl aus den Code-Beispielen versucht?

    Einen Kommentar schreiben:


  • katmic
    hat ein Thema erstellt Misterhouse und Squeezebox.

    Misterhouse und Squeezebox

    Ich teste momentan Eibd/Misterhouse, erste Logiken funktionieren schon.

    Misterhouse läuft bei mir auf einem Mini-ITX unter Ubuntu-Linux.
    Leider finde ich nichts in der Doku, wie man die Sprachausgabe auf der Squeezebox ausgibt. Benötige ich dafür xAP/xPL? Hat das schonmal jemand realisiert?

    Desweiteren wäre für mich noch interessant durch ein Event getriggert eine vorhandene Playlist auf der Squeezebox zu starten. Gibts da schon was fertiges?


    Gruss,
    katmic
Lädt...
X