Spracherkennung in Webapp funkioniert nicht

  • Antworten:4
Klaus Kinski
  • Forum-Beiträge: 4

25.06.2015, 09:37:33 via Website

Hallo!

Ich habe ein Problem mit einer Webanwendung unter Android. Diese läuft mit einem Node.js Server (mit Hilfe des Debiankits) auf einem Android 4.2.2
Unter anderem nutzt diese Anwendung die Web Speech API. Also die Anwendung soll meine Sprachbefehle erkennen und diese umwandeln. Dass das ganze dann nur im Chrome funkioniert ist kein Problem für mich.

Nun, unter Windows und Linux läuft die Webanwendung absolut perfekt. Nur unter Android habe ich ein Problem, dass ich nicht in den Griff bekomme:
Sobald ich die Spracherkennung in JS aktiviere, wird sie sofort mit Fehler abgebrochen. ADB logcat sagt dazu:

Quellcode:

I/chromium( 4102): [INFO:CONSOLE(441)] "Activate Speech", source: h**ps://127.0.0.1/js/main.js (441)
I/RecognitionControllerImpl( 4958): startRecognition(#Intent;action=android.speech.action.RECOGNIZE_SPEECH;B.android.speech.extra.DICTATION_MODE=false;S.android.speech.extra.LANGUAGE=en-US;B.android.speech.extra.PARTIAL_RESULTS=false;end)
I/RecognitionControllerImpl( 4958): State change: STARTING -> STARTING
E/RecognitionControllerImpl( 4958): required extra 'calling_package' missing in voice search intent
E/RecognitionControllerImpl( 4958): ERROR_CLIENT
E/RecognitionControllerImpl( 4958): ERROR_CLIENT
I/AudioService( 3784):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@410b53c8
I/AudioService( 3784):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@410b53c8
I/RecognitionControllerImpl( 4958): State change: STARTING -> CANCELED
I/chromium( 4102): [INFO:CONSOLE(817)] "End Speech (Error)", source: h**ps://127.0.0.1/js/main.js (817)
I/chromium( 4102): [INFO:CONSOLE(833)] "End Speech", source: h**ps://127.0.0.1/js/main.js (833)

"required extra 'calling_package' missing in voice search intent"
Was bedeutet das? Wie kann ich das in Lösen? Wie bekomme ich dieses fehlende Paket?

Google Voice Search ist übrigens auch installiert und funkioniert auch problemlos.

Auf meinem eigenen Android-Gerät funkioniert das ganze Problemlos (Android 4.4). Nur auf dem Android Gerät mit 4.2 (Eine Android TV-Box), wo es 24/7 laufen soll, bekomme ich es einfach nicht hin.

Ich hoffe Ihr könnt mir helfen...

Viele Grüße
Michael

Antworten
Ju Ku
  • Forum-Beiträge: 72

28.06.2015, 19:21:56 via Website

Die Exception required extra 'calling_package' missing in voice search intent bedeutet, dass das Intent noch ein Extra erwartet, welches beim Starten des Intents mit übergeben werden muss.
In dem Fall scheint wohl das speech package nicht installiert zu sein, oder der Pfad wird nicht mit angegeben.

Antworten
Klaus Kinski
  • Forum-Beiträge: 4

29.06.2015, 08:35:06 via Website

Hallo,

vielen Dank für die Antwort!

Die App "Google Voice Search" funkioniert ja wie beschrieben ganz normal. Diese benötigt doch auch dieses Speech Package? (Die Web Speech API von Chrome läuft doch soweit ich weiß über die gleiche Schnittstelle wie die Google Voice Search)?
Trotzdem... wie kann ich denn diese Sprachpakete nachinstallieren? Oder wie kann ich den Chrome starten, dass er merkt, dass diese schon installiert sind?

Viele Grüße
Michael

Antworten
Ju Ku
  • Forum-Beiträge: 72

29.06.2015, 14:19:54 via Website

Kannst du uns mal deinen Code zeigen?
Wie startest du denn das Google Web Speech Package?

Antworten
Klaus Kinski
  • Forum-Beiträge: 4

29.06.2015, 14:45:59 via Website

Es scheitert schon bei der normalen Google-Beispielseite, mit einfachstem JavaScript Code:
Er geht nachdem ich "recognition.start();" aufgerufen habe sofot in "recognition.onerror()" mit der oben genannten Fehlermeldung.

Den Chrome Browser selbst rufe ich mit dem Parameter " --allow-running-insecure-content" auf, indem ich die Datei "chrome-command-line" im Verzeichnis /data/local/ angelegt habe. Sonst ist der Browser komplett auf Standardeinstellungen. Auch Flags wurden keine gesetzt...

Beispielseite die nicht funkioniert:

h**ps://www.google.com/intl/en/chrome/demos/speech.html

var final_transcript = '';
var recognizing = false;
var ignore_onend;
var start_timestamp;
if (!('webkitSpeechRecognition' in window)) {
  upgrade();
} else {
  start_button.style.display = 'inline-block';
  var recognition = new webkitSpeechRecognition();
  recognition.continuous = true;
  recognition.interimResults = true;

  recognition.onstart = function() {
    recognizing = true;
    showInfo('info_speak_now');
    start_img.src = '/intl/en/chrome/assets/common/images/content/mic-animate.gif';
  };

  recognition.onerror = function(event) {
    if (event.error == 'no-speech') {
      start_img.src = '/intl/en/chrome/assets/common/images/content/mic.gif';
      showInfo('info_no_speech');
      ignore_onend = true;
    }
    if (event.error == 'audio-capture') {
      start_img.src = '/intl/en/chrome/assets/common/images/content/mic.gif';
      showInfo('info_no_microphone');
      ignore_onend = true;
    }
    if (event.error == 'not-allowed') {
      if (event.timeStamp - start_timestamp < 100) {
        showInfo('info_blocked');
      } else {
        showInfo('info_denied');
      }
      ignore_onend = true;
    }
  };

  recognition.onend = function() {
    recognizing = false;
    if (ignore_onend) {
      return;
    }
    start_img.src = '/intl/en/chrome/assets/common/images/content/mic.gif';
    if (!final_transcript) {
      showInfo('info_start');
      return;
    }
    showInfo('');
    if (window.getSelection) {
      window.getSelection().removeAllRanges();
      var range = document.createRange();
      range.selectNode(document.getElementById('final_span'));
      window.getSelection().addRange(range);
    }
    if (create_email) {
      create_email = false;
      createEmail();
    }
  };

  recognition.onresult = function(event) {
    var interim_transcript = '';
    if (typeof(event.results) == 'undefined') {
      recognition.onend = null;
      recognition.stop();
      upgrade();
      return;
    }
    for (var i = event.resultIndex; i < event.results.length; ++i) {
      if (event.results[i].isFinal) {
        final_transcript += event.results[i][0].transcript;
      } else {
        interim_transcript += event.results[i][0].transcript;
      }
    }
    final_transcript = capitalize(final_transcript);
    final_span.innerHTML = linebreak(final_transcript);
    interim_span.innerHTML = linebreak(interim_transcript);
    if (final_transcript || interim_transcript) {
      showButtons('inline-block');
    }
  };
}

Antworten