Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Wiregate-Plugin für Sprachausgabe

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

    #31
    Hi vlamers,
    Klappt es denn jetzt richtig? Oder kann ich noch irgendwie helfen?
    Auch nochmal eine Verständnisfrage von mir: warum nutzt du mpd und nicht aplay?
    Fry

    Kommentar


      #32
      Hi,

      Bin leider in der Arbeit bis 22 Uhr. Danach teste ich
      Sind mehrere Gründe:

      1. Der wichtigste: aplay versagt nach der Umstellung auf pulseaudio den Dienst. Alternative paplay. Der nimmt aber nur 1 File.

      2. mit mpd hab ich die Möglichkeit von externen Geräten die playlist in einer Web Oberfläche darzustellen.(visu tablet)(relaxx o.ä)

      3. Einfache Steuerung per mpc (lautstärke über GAs (rolladen funktion-lang-kurz)

      4. Mpd kann crossfaden

      5. Es laufen sowieso 4 Instanzen als zuspieler für dass kleine multiroom

      Gruß vlamers

      ***censored***

      Edit:

      Hmm seltsam bei mir hat "apt-get install sox" funktioniert. Webmin nutze ich für sowas nicht.

      Kommentar


        #33
        Zitat von Fry Beitrag anzeigen
        map s/^\.\///, @playlist;
        Irgendwie mag dass nicht.
        Wo muss dass den hin im Code? Denke mal in subRoutine bestmatch? Oder egal wohin hauptsache bevor @_ in die mpd playlist übergeben wird?

        (Teste dass gerade mit Webmin und Handy, heute Abend hoffe ich es zum laufen zu bekommen)

        Gruß

        Kommentar


          #34
          Zitat von vlamers Beitrag anzeigen
          Irgendwie mag dass nicht.
          Wo muss dass den hin im Code? Denke mal in subRoutine bestmatch? Oder egal wohin hauptsache bevor @_ in die mpd playlist übergeben wird?
          Arbeite dich ein wenig in Perl ein, und du wirst drei Sachen lieben lernen: Regexp, Hashes und die Kommandozeile. Man kann so unglaublich viel mit Perl machen. Eigentlich ist es DIE Sprache für den Quick Hack. (Ich kenne allerdings weder Ruby noch Python wirklich...)

          Zu deiner Frage: Letzteres. Genau vor der Übergabe in die mpd-Playlist.

          Viel Erfolg heute abend!

          Fry

          Kommentar


            #35
            Ich versuchs ja.
            Ist aber Mühsam! Komplett andere Branche, und die Logik die dahinter steht kann ich teilweise nicht nachvollziehen.

            Da hatte ich dass map auch geschrieben. Funktioniert hat es nicht, weil Die Dateinamen mit Leerzeichen geschrieben werden. Das versteht der mpc nicht.
            Dateiname: Die aktuelle Aussentemperatur betraegt.mp3
            und für den mpc müsste dass so sein: Die\ aktuelle\ Aussentemperatur\ betraegt.mp3

            Ich versuche dass mal in dass map mit einzubauen.

            Gruß

            Edit: sorry. In einem kleinen Script OK. Aber in deinem Script ist mir dass zu "heiß". Magst du mir nochmals helfen und mir sagen wo ich dass einbauen kann, so dass er die GA noch findet, aber die Dateinamen für die mp3´s anpasst??

            Kommentar


              #36
              poste doch mal das Codefragment, wo du mpc mit der Playlist aufrufst.
              Ich glaube, da gibt es eine einfache Lösung...
              Fry

              Kommentar


                #37
                hier:

                Code:
                map s/^\.\///, @_;
                print LOG $datetime.' '.$channel.':'.(join ' ', @_)."\n";
                
                    system "MPD_PORT=$Port MPD_HOST=$IP mpc add @_";
                    system "MPD_PORT=$Port", "MPD_HOST=$IP", "mpc", "play";
                Bin gerade am lesen wie sich dass map aufbaut.
                Im grunde brauch ich ein:
                map s/^ (weils am Anfang steht)
                map s/^+ (weils öfter vorkommt)
                map s/^+\ (ein Leerzeichen dahinter weil ich dass suche)
                Weiter bin ich noch nicht gekommen

                Danke für die Hilfe!

                Gruß

                Kommentar


                  #38
                  system mit einer Kommandozeile als String ist immer sch...

                  Besser eine Liste der Argumente übergeben.

                  Also statt

                  Code:
                   map s/^\.\///, @_;
                   system "MPD_PORT=$Port MPD_HOST=$IP mpc add @_";
                  system "MPD_PORT=$Port", "MPD_HOST=$IP", "mpc", "play";
                  Probiers mal so:

                  Code:
                  map s/^\.\///, @_;
                  $ENV{MPD_PORT}=$Port;
                  $ENV{MPD_HOST}=$IP;
                  system "mpc", "add", @_;
                  system "mpc", "play";
                  Gute Nacht! - ich seh morgen früh wieder rein, hoffentlich mit einer Erfolgsmeldung :-) ... ansonsten helfe ich natürlich gern weiter.

                  Fry

                  PS. Wenn es bei dir läuft, mach ich vielleicht auch noch auf pulseaudio und mpd. Hab ich bisher vermieden wegen des Konfigurationsaufwandes, aber da könntest du mir ja mal deine Konfig-Dateien schicken...

                  Kommentar


                    #39
                    Hi,

                    also dass ersetzen der system Zeilen hat nicht funktioniert. Aber ich hab mich auch nicht wirklich damit befasst (map war wichtiger )

                    klar kann ich dir die configs schicken. Ist nicht wirklich viel.
                    Hier wäre eine Version zu finden:
                    https://knx-user-forum.de/code-schni...-sammlung.html

                    Ich hab ein paar sachen geändert, sind aber noch testweise ob dass trotzdem noch rund läuft.
                    Aber ich schicke dir auch gerne aktuelle.

                    Das mappen krieg ich zumindest heute nicht mehr hin:
                    Code:
                     map s/\s+/,/g, @_;
                    macht mir zumindest mal Kommas rein.
                    Aber mit "/" scheint dass ein Sonderfall zu sein da er immer einen error bringt. Wie krieg ich den slash da rein? (Hab alle klammern durch, geht leider nix)

                    Kommentar


                      #40
                      Guten Morgen!

                      Du brauchst die Slashes nicht. Bei Aufruf von Systemkommandos nimmt man am besten die Form

                      Code:
                      system "aplay", @playlist;
                      und nicht

                      Code:
                      system "aplay @playlist";
                      genau wegen der Spaces Problems.

                      Eine andere Möglichkeit wäre, die Dateinamen mit Anführungsstrichen zu versehen:

                      Code:
                      system "aplay \"".(join "\" \"", @playlist)."\"";
                      Wenn du aber unbedingt alle Spaces mit Backslashes versehen willst:

                      Code:
                      map s/ /\\ /g, @playlist;
                      Viele Grüße,
                      Fry

                      Kommentar


                        #41
                        noch was: wenn man wirklich Slashes (nicht Backslashes) in einer Ersetzung einbringen will (ich bezweifle dass du das willst), geht das so:

                        Code:
                        s/ /\/ /g;
                        oder schöner

                        Code:
                        s! !/ !g;
                        VG, Fry

                        Kommentar


                          #42
                          Natürlich Backslash dass hätte ich gestern schon gehabt. Warum auch immer hab ich mich in den normalen Slash verbissen.

                          Die Methode von dir ist eh eleganter:
                          Code:
                          system "MPD_PORT=$Port MPD_HOST=$IP mpc add \"".(join "\" \"", @_)."\"";
                          So funktionierts auch. Wusste nicht dass es mit "" auch geht. Wieder was gelernt

                          Tempo=1,5 ist glaub ich in wenig arg schnell .

                          Als nächstes versuch ich dein Script anzupassen dass er mp3 runter lädt, per mpg123 in wav, tempo anpassen, und wieder zurück in mp3 dass sollte ich ja hin bekommen.

                          Vielen Dank für deine Mühen!

                          Gruß

                          Kommentar


                            #43
                            So hier dass Script.

                            - Passt geschwindigkeit an
                            - wandelt wav in mp3 um

                            Vorraussetzung: ffmpeg
                            Code:
                            apt-get install ffmpeg
                            Hoffe dass Script ist so richtig.

                            Gruß
                            Angehängte Dateien

                            Kommentar


                              #44
                              So hier auf die schnelle der Versuch umzubauen.
                              Wenn du willst auch gerne im neuen Thread:

                              Code:
                              ################# Alle Einstellungen ab hier #############################
                              my $volume_anfang = "50";     # This Volume will be set on start Kanal 1
                              my $Port = "6602";          # Port of mpd3
                              my $IP = "192.168.178.33";    # The IP where the mpd Instanz is running
                              my $mpdname = "mpd3";         # The Name of the mpd Instanz
                              my $verstaerker = '13/1/2';   # The GA of the switching Actor where the Amps are Powered
                              my $solar_aktiv = '12/1/2';   # The GA where the Logic say´s if the Solar-pump will be activated
                              my $begruessung = "Hallo";    # The Global welcoming at the start of the announcement
                              my $info_wz = '3/1/2';        # The GA to trigger the announcement
                              my $wert;                     # Empty Variable for the value for each hash
                              my $zusatz;                   # Empty Variable for the announcement after welcoming,wert,einheit,Zusatz
                              my @temperaturen;             # Empty Array
                              my $ansage_text;
                              my $solar_aktiv_aus = "Solarthermische Energiegewinnung deaktiviert"; # announcement if Solar is deactivated
                              my $solar_aktiv_ein = "Solarthermische Energiegewinnung aktiviert";   # announcement if Solar is activated
                              
                              # subscribe plugin on Announcement trigger GA and Solar_aktiv GA
                              $plugin_subscribe{$info_wz}{$plugname} = 1;
                              $plugin_subscribe{$solar_aktiv}{$plugname} = 1;
                              $plugin_info{$plugname.'_cycle'} = 0;
                              
                              push @temperaturen, { name=>"aussen_temp",                                 # was needed for debugging
                                                    dpt => 9.001,                                            # The DPT for the GA. (Temperature=9)
                                                    ga=>'11/1/0',                                        # The GA for the value, will be the second part of the Announcement
                                                    text=>"Die aktuelle Aussentemperatur betraegt ",     # First part of the Announcement
                                                    ansage_ga=>'15/1/0'
                                                    };
                                                    
                              push @temperaturen, { name=>"vorhersage_min", 
                                                    DPT => 9.001, 
                                                    ga=>'15/0/2',
                                                    text=>"Fuer heute vorhergesagte Temperatur betraegt",
                                                    ansage_ga=>'15/1/3'
                                                    };              
                                                    
                              #push @temperaturen, {name=>"vorhersage", 
                              #                      DPT => 9, 
                              #                      ga=>'15/0/2',
                               #                     text=>"",
                               #                     einheit=>"Grad",
                               #                     zusatz=>"",
                               #                     dateiname => "vorhersage"
                               #                     };
                                                    
                                     
                              # push @temperaturen,  { name=>"wohnzimmer_temp", 
                              #                      DPT=>9, 
                              #                      ga=>'11/2/0',
                              #                      text=>"Die aktuelle Wohnzimmer Temperatur betraegt ",
                              #                      einheit=>"Grad",
                              #                      zusatz=>"",
                              #                      dateiname => "wohnzimmer_temp"
                              #                      };
                                                   
                              # push @temperaturen,  { name=>"puffer_ww", 
                              #                      DPT=>9, 
                              #                      ga=>'12/0/0',
                              #                      text=>"Die aktuelle Warmwasser Temperatur betraegt ",
                              #                      zusatz=>"",
                              #                      einheit=>"Grad",
                              #                      dateiname => "puffer_ww"
                              #                      };
                              #push @temperaturen,  { name=>"puffer_heizung", 
                              #                      DPT=>9, 
                              #                      ga=>'12/0/1',
                              #                      text=>"Die aktuelle Heizungs Temperatur betraegt ",
                              #                      zusatz=>"",
                              #                      einheit=>"Grad",
                              #                      dateiname => "puffer_heizung"
                              #                      };
                              # push @temperaturen, { name=>"Solar_aktiv",
                              #              DPT=>1,
                              #              ga=>'12/1/2',
                              #              text=>"",
                              #              zusatz=>"",
                              #              einheit=>"",
                              #              dateiname=>"Solar_aktiv",
                              #              };
                               ############################### Ende der Einstellungen ###################################################
                              
                              if ($msg{'dst'} eq $info_wz && ($msg{'apci'} eq 'A_GroupValue_Write'))  {
                              if ($msg{'data'} == 01) {
                              #my $url = "http://translate.google.de/translate_tts?ie=UTF-8&q=$begruessung";
                              #my $debug = `wget "$url" --keep-session-cookies --user-agent=sag_ich_nicht -O /tmp/begruessung.mp3`;
                                  my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc clear` ;
                                   knx_write($verstaerker ,1,1);
                                  
                                  foreach my $element (@temperaturen){
                                  my $name = $element->{name};
                                  my $wert = knx_read($element->{ga}, 0, $element->{dpt});
                                  
                                  # my $wert = "$wert1";
                                  my $DPT = $element->{dpt};
                                  my $ansage_text = "$element->{text}";
                                  my $ansage_ga = $element->{ansage_ga};
                                  add_mpc($ansage_text, $ansage_ga, $wert, $DPT);
                                 plugin_log($plugname, $wert);
                              #    my $url = "http://translate.google.de/translate_tts?ie=UTF-8&q=$ansage_text";
                              #    my $debug = `wget "$url" --keep-session-cookies --user-agent=sag_ich_nicht -O /tmp/$element->{dateiname}.mp3`;
                              #    my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc add $element->{dateiname}.mp3`;
                              #    my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc play`;
                                  next;
                                  }  
                                  }
                                  } else { return 0;}
                                  
                                  
                                  
                              # Speak output
                              
                              # $Tag = $plugin_info{$plugname.'_Tag'}; #übergeben global auf lokal
                                  
                              
                                
                              #    my $datei = "/tmp/$dateiname1.mp3";
                              #    if (-e $datei) {
                               #      my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc clear && MPD_HOST=$IP MPD_PORT=$Port mpc add $dateiname1.mp3 && MPD_HOST=$IP MPD_PORT=$Port mpc volume $volume_anfang && MPD_HOST=$IP MPD_PORT=$Port mpc play`;
                                #        return;
                                 #    } else {
                              #    my $url = "http://translate.google.com/translate_tts?ie=UTF-8&q=$Ansage1";
                              #    my $debug = `wget "$url" --keep-session-cookies --user-agent=sag_ich_nicht -O /tmp/$dateiname1.mp3`;
                              #    my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc clear && MPD_HOST=$IP MPD_PORT=$Port mpc add $dateiname1.mp3 && MPD_HOST=$IP MPD_PORT=$Port mpc volume $volume_anfang && MPD_HOST=$IP MPD_PORT=$Port mpc play`;
                              #      return;
                              #    }
                              #
                              #}
                              
                              #}
                              
                              
                              
                              
                              ###########
                              # Ansagen #
                              ###########
                              # Wiregate-Plugin
                              # (c) 2012 Fry under the GNU Public License version 2 or later
                              
                              # $plugin_info{$plugname.'_cycle'}=0; return 'deaktiviert';
                              
                              
                              
                              sub add_mpc
                              {
                              
                              my ($ganame, $ansage_ga, $wert, $DPT) = @_;
                              use POSIX qw(floor);
                              
                              # Defaultkonfiguration
                              my $verstaerker='13/1/2';
                              my $logfile='/var/log/Ansagen.log';
                              my $speechdir='/var/lib/Ansagen/Sprache/';
                              my %channels=('default'=>'pakueche');
                              my $beepchannel='pakueche';
                              my $beep = "Beep/03d.mp3"; 
                              my @additional_subscriptions=();
                              my $Port = "6602";
                              my $IP = "192.168.178.33";
                              
                              chdir $speechdir;
                              
                              
                              {
                                  my $ga=$ansage_ga;
                                  my $val=$wert;
                                  my $dpt=$DPT;
                                  $dpt=1.017 unless defined $dpt; # = Trigger, bedeutet Textansage ohne Daten
                                      my $name=$ganame;   
                                  my $channel=$channels{default};
                                  my $pattern=$name;
                              
                                  for my $pat (keys %channels)
                                  {
                                  if($pattern=~s/$pat//)
                                  {
                                      $channel=$channels{$pat};
                                      last;
                                  }
                                  }
                              
                                  # Hole alle verfuegbaren Durchsagedateien 
                                  my $find=checkexec('find');
                                 my @speech=split /\n/, `$find . -name "*.mp3"`;
                                 # my @speech=split /\n/, `$find . -name "*.mp3"`;
                                      return 'no speech files found' unless @speech;
                                  
                                  my @statement=();
                                  
                                  # Textteil (Gruppenadresse ausgesprochen)
                                  if(defined $pattern)
                                  {
                                  # 
                                   #  map s/\s * /\ /, @speech;  
                                   
                                  push(@statement, words(\@speech, $pattern));
                                  }
                                  
                                  # Informationsteil (Inhalt des Telegramms)
                                  given($dpt)
                                  {
                                  when (1.001) # An/Aus
                                  { push(@statement, 'Zahlen/'.($val?'an':'aus').'.mp3'); } 
                                  when (1.008) # Hoch/Runter
                                  { push(@statement, 'Zahlen/'.($val?'hoch':'runter').'.mp3'); }
                                  when(1.009) # Auf/Zu
                                  { push(@statement, 'Zahlen/'.($val?'auf':'zu').'.mp3'); }
                                  when([5.010,7.001,12.001]) # Ordinalzahl
                                  { push(@statement, number(\@speech, $val, -1)); }
                                  when([6.010,8.001,13.001]) # Kardinalzahl
                                  { push(@statement, number(\@speech, $val)); }
                                  when([5.001,6.001]) # Prozent
                                  { 
                                      push(@statement, number(\@speech, $val));
                                      push(@statement, 'Zahlen/Prozent.mp3'); 
                                  }
                                  when(9.001) # Temperatur
                                  {
                                      push(@statement, number(\@speech, $val, 1));
                                      push(@statement, 'Zahlen/Grad.mp3');
                                  }
                                  when(11.001) # Datum
                                  {
                                      if($val=~/^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])/)
                                      {
                                      my @monat=qw(Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember);
                                      push(@statement, number(\@speech, $3, -1));
                                      push(@statement, 'Monate/'.$monat[$2-1].'.mp3') if defined $2 && $2>0 && $2<13;
                                      }    
                                      else
                                      {
                                      return "Unbekanntes Datumsformat $val";
                                      }
                                  }
                                  when(7.005) # Zeitdauer
                                  { 
                                      $val=-$val if $val<0;
                                      my $h=floor($val/3600);
                                      $val-=3600*$h;
                                      my $m=floor($val/60);
                                      $val-=60*$m;
                                      if($h)
                                      {
                                      push(@statement, number(\@speech, $h)); 
                                      push(@statement, 'Zeiten/Stunden.mp3'); 
                                      }
                                      if($h || $m)
                                      {
                                      push(@statement, number(\@speech, $m)); 
                                      push(@statement, 'Zeiten/Minuten.mp3'); 
                                      }
                                      push(@statement, number(\@speech, $val)); 
                                      push(@statement, 'Zeiten/Sekunden.mp3'); 
                                      }
                                  when(10.001) # Uhrzeit
                                  {
                                      if($val=~/^(Mo|Di|Mi|Do|Fr|Sa|So)\s+([0-9][0-9])\:([0-9][0-9])/)
                                      {
                                      push(@statement, "Wochentage/$1.mp3");
                                      push(@statement, number(\@speech, $2));
                                      push(@statement, "Zeiten/Uhr.mp3");
                                      push(@statement, number(\@speech, $3));
                                      }
                                      elsif($val=~/^([0-9][0-9])\:([0-9][0-9])}\:([0-9][0-9])/)
                                      {
                                      push(@statement, number(\@speech, $2));
                                      push(@statement, "Zeiten/Uhr.mp3");
                                      push(@statement, number(\@speech, $3));
                                      }
                                      else
                                      {
                                      return "Unbekanntes Uhrzeitformat $msg{value}";
                                      }
                                  }
                                  when(1.017) # Trigger, kein Datenzusatz
                                  {}
                                  default     # kein Datenzusatz, aber mit Logeintrag
                                  { return "Datentyp $dpt nicht implementiert"; }  
                                  }
                                  # Das komplette Statement in die Ausgabe geben
                                  speak($channel, $name, @statement);
                                  
                                  return $name.' '.$msg{value};
                              }
                              
                              return; 
                              
                              sub checkexec
                              {
                                  my @path = split /:/, $ENV{PATH};
                                  # map s|()/$|$1|, @path;
                                  map s|(.)/$|$1|, @path;
                                  for (@path)
                                  {
                                     my $full="$_/$_[0]";
                                     #  my $full="/$_[0]";
                                      if(-x $full)
                                      {
                                          return "$_/$_[0]";
                                      }
                                  }
                                  die "$_[0] must be in your PATH and executable.\n";
                              }
                              
                              
                              sub words
                              {
                                  my $speech=shift;
                                  my $pattern=shift;
                              
                                  # Konstruiere die abzuspielenden File(s) aus dem GA-Kuerzel
                                  # erster Versuch: eine Datei passt komplett auf das Muster im Kuerzel
                                  my $pat1=$pattern;
                                  $pat1=~s/[_\s]+/.*?/g; # allgemeine Fassung
                              #    $pat1=~s/\s+.*$//; # meine spezielle GA-Struktur
                              #    $pat1=~s/_+/.*?/g; # meine spezielle GA-Struktur
                                  $pat1='.*'.$pat1.'.*\.mp3$';
                                  
                                  my @hits=();
                                  my $hit=bestmatch($speech,$pat1);
                                  push(@hits, $hit) if $hit; # gefunden
                              
                                  unless(@hits)
                                  {
                                  $pattern='_'.$pattern;
                                  $pattern=~s/\s+/_/g; # allgemeine Fassung
                              #    $pattern=~s/\s+.*$//; # meine spezielle GA-Struktur
                              
                                  # zweiter Versuch: aus Kuerzeln die Bausteine zusammenbauen
                                  while($pattern=~s/^_([^_]+)//)
                                  {
                                      my $pat2=$1.'\.mp3$'; 
                                      $hit=bestmatch($speech,$pat2);
                                      push(@hits, $hit) if $hit; # gefunden
                                  }    
                              
                                  if($pattern)
                                  {
                                      $pattern=~s/_/.*/g; # Restnachricht
                                      $pattern.='.*\.mp3$';
                                      $pattern='.*'.$pattern;
                                  
                                      $hit=bestmatch($speech,$pattern);
                                      push(@hits, $hit) if $hit; # gefunden
                                  }
                              
                                  }
                               
                                  return @hits;
                              }
                              
                              
                              sub number
                              {
                                  my $speech=shift;
                                  my $x=shift; $x=~s/,/./; 
                                  my $digits=0;  
                                  $digits=shift if @_; # max. Anzahl Nachkommastellen, -1 fuer Ordinalzahlen
                              
                                  my @hits=();
                              
                                  if($x<0) 
                                  {
                                  push(@hits, 'Zahlen/minus.mp3');
                                  $x=-$x;
                                  $digits=0 if $digits<0; # keine negativen Ordinalzahlen
                                  }
                              
                                  my $t=$digits<0?'o':'c';
                                  my $n=floor($x);
                                  my $m=$x-$n;
                              
                                  # Manche Zahlen existieren direkt als WAV
                                  # von 0-12, sowie die runden 10er und 100 sowie 1000 
                                  # MUESSEN existieren, und zwar als Kardinalzahlen (c4.wav),
                                  # Ordinalzahlen (o6.wav), die Zehner ausserdem mit vorangestelltem 'und'
                                  # (u30.wav, uo30.wav)
                              
                                  if(-f 'Zahlen/'.$t.$n.'.mp3') 
                                  {
                                  push(@hits, 'Zahlen/'.$t.$n.'.mp3');
                                  }
                                  else
                                  {
                                  return if($n>=1000000); # Zahlen ueber eine Million nicht implementiert
                              
                                  if($n>=1000)
                                  {
                                      $digits=0 if $digits>0; # waere Pseudo-genauigkeit und zu langer Text
                                      
                                      if($n==1000)
                                      {
                                      push(@hits, 'Zahlen/'.$t.'1000.mp3');
                                      $n = 0;
                                      }
                                      else
                                      {
                                      my $m=floor($n/1000);
                                      @hits=number($speech,$m,0) if $m>1;
                                      $n %= 1000;
                                      if($n)
                                      {
                                          push(@hits, 'Zahlen/c1000.mp3');
                                      }
                                      else
                                      {
                                          push(@hits, 'Zahlen/'.$t.'1000.mp3');
                                      }    
                                      }
                                      
                                      if($n>=100 && $n<200)
                                      {
                                      push(@hits, 'Zahlen/u1.mp3');
                                      }
                                  }
                              
                                  if(-f 'Zahlen/'.$t.$n.'.mp3') 
                                  {
                                      push(@hits, 'Zahlen/'.$t.$n.'.mp3');
                                  }
                                  elsif($n>100)
                                  {
                                      $digits=0 if $digits>0; # waere Pseudo-genauigkeit und zu langer Text
                                      my $h = int($n/100);
                                      $n %= 100;
                                      push(@hits, 'Zahlen/u'.$h.'.mp3') if $h>1;
                                      if($n)
                                      {
                                      push(@hits, 'Zahlen/c100.mp3');
                                      }
                                      else
                                      {
                                      push(@hits, 'Zahlen/'.$t.'100.mp3');
                                      }    
                                  }
                                  
                                  my $d = $n % 10;
                                  
                                  if(-f 'Zahlen/'.$t.$n.'.mp3') 
                                  {
                                      push(@hits, 'Zahlen/'.$t.$n.'.mp3');
                                  }
                                  else
                                  {
                                      my $z = $n-$d;
                                      
                                      push(@hits, 'Zahlen/u'.$d.'.mp3');
                                      push(@hits, 'Zahlen/u'.$t.$z.'.mp3');
                                  }
                                  }
                                  
                                  if($digits>0) 
                                  {
                                  $m = sprintf "%.$digits"."f", $m;
                                  
                                  if($m>0) 
                                  {
                                      push(@hits, 'Zahlen/Komma.mp3');
                                      for (1..$digits)
                                      {
                                      $m*=10.; my $d=floor($m); $m-=$d;
                                      push(@hits, "Zahlen/c$d.mp3");
                                      }
                                  }
                                  }
                              
                                  return @hits;
                              }
                              
                              sub bestmatch
                              {
                                  my $speech=shift;
                                  my $pattern=shift;
                              
                                  my @hits=sort { length($a) cmp length($b) } grep /$pattern/i, @{$speech};
                                  return @hits ? (shift @hits) : undef;
                              }
                              
                              
                              sub speak
                              {
                                  my $channel=shift; # ALSA-Channel
                                  my $name=shift; # Name der Ansage (aus eibga.conf) - fuers Log
                              
                                  open LOG, ">>$logfile";
                                  my $date=checkexec('date');
                                  my $datetime=`$date +"%F %X"`;
                                  $datetime=~s/\s*$//s; 
                                  
                                  if(@_)
                                  {
                                  my $aplay=checkexec('paplay');
                              #    my $aplay = "paplay";
                                  my $mpc=checkexec('mpc');
                              #    system $mpc, 'pause';
                                  
                                  # Nur fuer Russound-Paging: Star Trek 'Beep' vorweg weckt Russound auf
                                  if($channel=~/$beepchannel/)
                                  {
                                      my $lastbeep=$plugin_info{$plugname.'_lastbeep'};
                              
                                      # max ein Beep pro Minute
                                      if(!defined $lastbeep || time()>$lastbeep+60)
                                      {
                                      unshift(@_, $beep);
                                      $plugin_info{$plugname.'_lastbeep'}=time();
                                      }
                                  }
                                    
                              
                              # map s! !\ !g, @_;
                              
                               map s/^\.\///, @_;
                              #
                              # $ENV{MPD_PORT}=$Port;
                              #$ENV{MPD_HOST}=$IP;
                              #system "mpc", "add", @_;
                              #system "mpc", "play";
                              print LOG $datetime.' '.$channel.':'.(join ' ', @_)."\n";
                              # system "aplay \"".(join "\" \"", @_)."\""; # Tipp von Fry
                              #    knx_write($verstaerker,1,1);
                              #    system "MPD_PORT=$Port MPD_HOST=$IP mpc clear";
                                  
                                  system "MPD_PORT=$Port MPD_HOST=$IP mpc add \"".(join "\" \"", @_)."\"";
                              #    system "MPD_PORT=$Port MPD_HOST=$IP mpc play";
                                  sleep 4;
                              #    system $aplay, -d, $channel, @_;
                              # my $debug = "paplay -d $channel @_";
                              #    map s!^.*/(.*?)\.mp3!$1!, @_;
                                  
                              #    system $mpc, 'toggle';
                                  }
                                  else
                                  {
                                  print LOG "$datetime $name - keine akustische Ansage moeglich\n";
                                  }
                              
                                  close LOG;
                              }
                              }
                              wird demnächst vervollständigt. Muss nur erstmal in die Arbeit...

                              Kommentar


                                #45
                                Na prima, es wird!
                                Mich nerven noch die Pausen, die aplay zwischen einzelne Audiodateien einbaut ("ein.....undzwanzig.....Komma......fünf......Grad "). Ist das beim mpd besser? Dann käme ich auch noch in Versuchung....
                                Grüße, Fry

                                Kommentar

                                Lädt...
                                X