2012-04-03 7 views
7

Ich habe einen einfachen Spracherkennungsdienst erstellt: Zu diesem Zweck habe ich eine Unterklasse von android.speech.RecognitionService erstellt und eine Aktivität zum Starten und Stoppen dieses Dienstes erstellt.Wie registriere ich einen benutzerdefinierten Spracherkennungsdienst?

Mein benutzerdefinierter Spracherkennungsdienst verwendet trivialerweise den Standard-Spracherkenner, da mein Ziel einfach darin besteht, zu verstehen, wie die Klassen RecognitionService und RecognitionService.Callback funktionieren.

Ich starte und stoppe den Dienst mit der folgenden Aktivität.

public class VoiceServiceStarterActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button startButton = new Button(this); 
     startButton.setText("Start the service"); 
     startButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { startVoiceService(); } 
     }); 
     Button stopButton = new Button(this); 
     stopButton.setText("Stop the service"); 
     stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { stopVoiceService(); } 
     }); 
     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     layout.addView(startButton); 
     layout.addView(stopButton); 
     setContentView(layout); 
    } 

    private void startVoiceService() { 
     startService(new Intent(this, SimpleVoiceService.class)); 
    } 

    private void stopVoiceService() { 
     stopService(new Intent(this, SimpleVoiceService.class)); 
    } 
} 

Schließlich erklärte ich meinen Dienst auf den AndroidManifest.xml (VoiceRecognition Probe im Android SDK-Ordner sehen).

<service android:name="SimpleVoiceService" 
     android:label="@string/service_name" > 

    <intent-filter> 
     <action android:name="android.speech.RecognitionService" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</service> 

Dann installierte ich diese Anwendung auf einem Android-Gerät und ich beginne es: - wenn ich den Dienst starten, beginnt es richtig; - Wenn ich aufhöre, stoppt es richtig. Wenn ich den folgenden Code in einer anderen Aktivität starte, enthält die activitiesList nur ein Element, das die Standard-Spracherkennung ist.

PackageManager pm = getPackageManager(); 
List<ResolveInfo> activities = pm.queryIntentActivities(
      new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 

Warum wird mein Spracherkenner unter den im System vorhandenen nicht zurückgegeben?

+1

Enthält diese uns verwenden aktivieren 'Google Now' außer Kraft setzen Standard RecognitionService? Ich meine, kann ich jetzt meinen eigenen erweiterten Erkennungsservice für Google nutzen? –

+1

Wurde Ihre onStartListening-Funktion beim Starten von SimpleVoiceSearch Service gestartet? @ enzom83 –

Antwort

7

Wenn Sie queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) möchten Ihre Aktivität holen (VoiceServiceStarterActivity), dann müssen Sie in Ihrer App Manifest erklären, dass diese Aktivität behandelt RecognizerIntent.ACTION_RECOGNIZE_SPEECH, wie diese

<activity android:name="VoiceServiceStarterActivity"> 
    <intent-filter> 
    <action android:name="android.speech.action.RECOGNIZE_SPEECH" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    ... 
</activity> 

Für konkretere Code einen Blick auf das Projekt haben Kõnele (source code), die im wesentlichen eine offene Source-Implementierung der Schnittstellen, über welche die Spracherkennung auf Android vorgesehen, dh es umfasst:

  • ACTION_RECOGNIZE_ SPEECH
  • ACTION_WEB_SEARCH
  • RecognitionService

und verwendet Open-Source-Spracherkennungsserver.

+1

Ich verstehe nicht, warum ich eine neue Aktivität erstellen sollte. Derzeit habe ich eine Aktivität ('VoiceDemoActivity'), die den Standard-Spracherkenner durch ein 'SpeechRecognizer'-Objekt behandelt. Um einen benutzerdefinierten Spracherkennungsdienst zu verwenden, muss ich ein neues "SpeechRecognizer" -Objekt erstellen, das ein 'ComponentName'-Objekt in der' createSpeechRecognizer'-Methode angibt: Ich nehme an, dass sich dieser 'ComponentName' auf den benutzerdefinierten Spracherkennungsdienst beziehen sollte Ich habe eine neue 'RecognitionService'-Klasse erstellt.Warum muss ich eine andere Aktivität implementieren, die die Absicht "ACTION_RECOGNIZE_SPEECH" verarbeiten kann? – enzom83

+2

Ich verbesserte meine Antwort ein wenig, vielleicht machte es es ein bisschen klarer. – Kaarel

+0

@Kaarel Ich mag wirklich, was Sie in Kõnele getan haben (obwohl ich die estnische Sprache nicht kenne). Ich habe den Quellcode von github heruntergeladen, um anhand eines Beispiels zu lernen, wie ich meine eigene (nur Englisch) implementieren kann, aber es würde nicht aus der Box bauen und die veröffentlichte App (heruntergeladen von Google Play) bleibt stecken * "Transcribing. .. "*. Wo kann ich mehr über die Struktur Ihres Codes erfahren (3 verschiedene Pakete) und warum? Wie wird es implementiert? Vielen Dank! – ripopenid

0

Ja, Sie brauchen createSpeechRecognizer (Context Kontext, Component serviceComponent)

Verwandte Themen