Sprachübersetzung zur Android-App hinzufügen

In dieser Anleitung erfahren Sie, wie Sie eine Sprachübersetzungsfunktion für Ihre Android-App bereitstellen. Im Beispiel dieser Anleitung wird ein Mikrodienst verwendet, der eine Audionachricht empfängt, die Nachricht in eine Reihe vordefinierter Sprachen übersetzt und die übersetzten Nachrichten in Audiodateien speichert. Die Client-Android-App lädt die übersetzten Audiodateien auf Nutzeranfrage herunter und spielt sie ab.

Lösungsüberblick

Die Lösung umfasst die folgenden Komponenten:

Mikrodienst

Der Mikrodienst ist in Cloud Functions für Firebase implementiert und verwendet die folgenden Cloud-KI-Produkte, um die Nachrichten zu übersetzen:

Der Mikrodienst speichert übersetzte Audionachrichten in einem Bucket in Cloud Storage for Firebase.

Clientanwendung

Die Clientkomponente ist eine Android-App, die Audionachrichten aufzeichnet und die übersetzten Nachrichten aus dem Cloud Storage-Bucket herunterlädt. Das Beispiel ist eine Chat-App, die in der Anleitung Android-App mit Firebase und der flexiblen App Engine-Umgebung entwickeln verwendet wird. In dieser Anleitung wird erläutert, wie Sie die Beispiel-App zur Implementierung der Sprachübersetzungsfunktion erweitern.

Das folgende Diagramm zeigt die Interaktion zwischen dem Mikrodienst und der Client-App:

Diagramm: Gesamtarchitektur der Lösung

Der Mikrodienst führt die folgenden Aufgaben aus:

  1. Er empfängt die Audionachricht im Base64-codierten Format.
  2. Er transkribiert die Audionachricht mithilfe der Speech-to-Text API.
  3. Er übersetzt die transkribierte Nachricht mit der Translation API.
  4. Er synthetisiert die übersetzte Nachricht mithilfe der Text-to-Speech API.
  5. Er speichert die übersetzte Audionachricht in einem Cloud Storage-Bucket.
  6. Er sendet die Antwort an den Client zurück. In der Antwort ist die Sprache der übersetzten Audionachricht angegeben.

Diagramm: Architektur des Mikrodienstes

Die Client-App führt die folgenden Aufgaben aus:

  1. Sie zeichnet die Audionachricht für eine höhere Genauigkeit mit den Best Practices der Speech-to-Text API auf. Die App verwendet das Mikrofon des Geräts, um den Ton aufzunehmen.
  2. Sie codiert die Audionachricht im Base64-Format.
  3. Sie sendet eine HTTP-Anfrage mit der codierten Audionachricht an den Mikrodienst.
  4. Sie empfängt vom Mikrodienst die HTTP-Antwort, in der die Sprache der übersetzten Audionachricht angegeben ist.
  5. Sie sendet eine Anfrage an den Cloud Storage-Bucket, um die Datei abzurufen, die die übersetzte Audionachricht enthält.
  6. Sie spielt die übersetzte Audionachricht ab.

Ziele

In dieser Anleitung wird erläutert, wie Sie:

  • Cloud Functions for Firebase verwenden, um einen Mikrodienst zu erstellen, der die erforderliche Logik zum Übersetzen von Audionachrichten mithilfe der folgenden Cloud AI-Produkte enthält:
    • Speech-to-Text API
    • Translation API
    • Text-to-Speech API
  • die Android Framework APIs verwenden, um Audio gemäß den Empfehlungen zur Bereitstellung von Audiodaten für die Speech-to-Text API aufzuzeichnen.
  • die Cronet-Bibliothek verwenden, um Sprachdaten von der Client-App in den Mikrodienst hochzuladen und übersetzte Nachrichten von Cloud Storage herunterzuladen. Weitere Informationen zur Cronet-Bibliothek finden Sie in der Android-Entwicklerdokumentation unter Netzwerkoperationen mit Cronet durchführen (nur auf Englisch verfügbar).

Kosten

Diese Anleitung erweitert die Beispielanwendung, die unter Android-App mit Firebase und der flexiblen App Engine-Umgebung entwickeln implementiert wurde. Lesen Sie in obiger Anleitung den Abschnitt über die Kosten und berücksichtigen Sie die folgenden zusätzlichen Kosten:

  • Firebase definiert Kontingente für die Verwendung von Cloud Functions, die Ressourcen-, Zeit- und Ratenlimits umfassen. Weitere Informationen finden Sie in der Firebase-Dokumentation unter Kontingente und Limits.
  • Die Nutzung der Speech-to-Text API wird monatlich auf Grundlage der Länge der erfolgreich verarbeiteten Audiodaten berechnet. Es gibt eine festgelegte Bearbeitungszeit, die Sie jeden Monat kostenlos nutzen können. Weitere Informationen finden Sie unter Preise für die Speech-to-Text API.
  • Die Verwendung der Translation API wird monatlich basierend auf der Anzahl der Zeichen berechnet, die zur Verarbeitung an die API gesendet wurden. Weitere Informationen finden Sie unter Preise für die Translation API.
  • Die Verwendung der Text-to-Speech API wird monatlich nach der Anzahl der Zeichen berechnet, die in Audio zu synthetisieren sind. Es gibt eine Zeichenanzahl, die Sie monatlich kostenlos nutzen können. Weitere Informationen finden Sie unter Preise für die Text-to-Speech API.
  • Firebase Storage-Nutzungsgebühren werden als Google Cloud Storage-Gebühren berechnet. Weitere Informationen finden Sie unter Preise für Cloud Storage.

Vorbereitung

Arbeiten Sie die Anleitung Android-App mit Firebase und der flexiblen App Engine-Umgebung entwickeln durch und installieren Sie die folgende Software:

Sie benötigen ein Hardwaregerät mit Android 7.0 (API-Level 24) oder höher, um die Sprachübersetzungsfunktion zu testen.

Beispielcode klonen

Verwenden Sie diesen Befehl, um das Repository nodejs-docs-samples zu klonen, das den Mikrodienstcode enthält:

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

Abrechnung und APIs für das Google Cloud-Projekt aktivieren

In dieser Anleitung wird das Projekt "Playchat" verwendet, das in "Android-App mit Firebase und der flexiblen App Engine-Umgebung erstellen" eingerichtet wurde. Dafür werden die App Engine Admin API und die Compute Engine API benötigt.

Der Mikrodienst benötigt die folgenden APIs, um Sprachübersetzungsanfragen zu verarbeiten:

  • Text-to-Speech API
  • Cloud Translation API
  • Speech-to-Text API

So aktivieren Sie die erforderlichen APIs:

  1. Wählen Sie in der Google Cloud Console das PlayChat-Projekt aus.

    Zur Seite "Projekte"

  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  3. App Engine, Speech-to-Text, Translation, and Text-to-Speech APIs aktivieren.

    Aktivieren Sie die APIs

Standard-Bucket für Cloud Storage for Firebase konfigurieren

Der Mikrodienst verwendet den Cloud Storage-Standard-Bucket im Firebase-Projekt, um die übersetzten Audiodateien zu speichern. Sie müssen Lesezugriff für die Nutzerkonten aktivieren, die die Audiodateien abrufen möchten.

Sie benötigen die Firebase-Nutzer-UID des Kontos, um den Lesezugriff zu aktivieren. So rufen Sie die Nutzer-UID ab:

  1. Wählen Sie im linken Menü der Firebase Console in der Gruppe Entwicklung den Eintrag Authentifizierung aus.
  2. Notieren Sie sich den Wert für die Nutzer-UID des Nutzerkontos, das Sie zum Testen der App verwenden möchten. Die Nutzer-UID ist ein String aus 28 Zeichen.

Sie müssen eine Speichersicherheitsregel erstellen, um dem Nutzerkonto Lesezugriff zu ermöglichen. So erstellen Sie eine Sicherheitsregel:

  1. Wählen Sie im linken Menü der Firebase Console in der Gruppe Entwicklung den Eintrag Storage aus.
  2. Beachten Sie die Standard-Bucket-URL im Format gs://[FIREBASE_PROJECT_ID].appspot.com, der neben einem Linksymbol angezeigt wird. Sie benötigen diesen Wert, um den Mikrodienst bereitzustellen.
  3. Wechseln Sie auf der Seite Storage zum Abschnitt Rules und fügen Sie im Abschnitt service firebase.storage die folgende Regel hinzu:

     match /b/{bucket}/o {
       match /{allPaths=**} {
         allow read: if request.auth.uid == "[ACCOUNT_USER_UID]";
       }
     }
    

    Ersetzen Sie ACCOUNT_USER_UID durch den Wert der Nutzer-UID, den Sie in den vorherigen Schritten erhalten haben.

Weitere Informationen finden Sie in der Firebase-Dokumentation unter Erste Schritte mit Speichersicherheitsregeln (nur auf Englisch verfügbar).

Mikrodienst erstellen und bereitstellen

Öffnen Sie zum Erstellen des Mikrodienstes ein Terminalfenster und wechseln Sie im Repository nodejs-docs-samples, das Sie im vorherigen Abschnitt geklont haben, zum Ordner functions/speech-to-speech/functions.

Der Mikrodienstcode enthält eine .nvmrc-Datei, die die Version von Node.js deklariert, die Sie zum Ausführen der App verwenden müssen. Führen Sie den folgenden Befehl aus, um NVM einzurichten und die Mikrodienstabhängigkeiten zu installieren:

nvm install && nvm use && npm install

Melden Sie sich mit folgendem Befehl über die Befehlszeile in Firebase an:

firebase login

Der Mikrodienst benötigt die folgenden Umgebungsvariablen:

  • OUTPUT_BUCKET: der standardmäßige Cloud Storage-Bucket im Firebase-Projekt.
  • SUPPORTED_LANGUAGE_CODES: eine durch Kommas getrennte Liste von Sprachcodes, die der Mikrodienst unterstützt.

Verwenden Sie die folgenden Befehle, um die erforderlichen Umgebungsdaten über die Befehlszeile anzugeben. Ersetzen Sie den Platzhalter FIREBASE_PROJECT_ID durch den Wert, den Sie im vorherigen Abschnitt nachgeschlagen haben.

firebase functions:config:set playchat.output_bucket="gs://[FIREBASE_PROJECT_ID].appspot.com"
firebase functions:config:set playchat.supported_language_codes="en,es,fr"

Android-App konfigurieren

Die Beispiel-App "Playchat" benötigt die Mikrodienst-URL, um die Sprachübersetzungsfunktionen nutzen zu können. So rufen Sie die Mikrodienst-URL ab:

  1. Wählen Sie im linken Menü der Firebase Console in der Gruppe Entwicklung den Eintrag Functions aus.
  2. Die Mikrodienst-URL wird in der Spalte Trigger im Format https://[REGION_ID]-[FIREBASE_PROJECT_ID].cloudfunctions.net/[FUNCTION_NAME] angezeigt.

Um die App für den Mikrodienst zu konfigurieren, öffnen Sie im Repository firebase-android-client die Datei app/src/main/res/values/speech_translation.xml und aktualisieren Sie das Feld speechToSpeechEndpoint mit der URL des Mikrodienstes.

Android-App ausführen

Sie müssen ein Gerät verwenden, das die Audioaufnahme mit dem integrierten Mikrofon unterstützt, z. B. ein Hardwaregerät, um die Sprachübersetzungsfunktion in der Anwendung zu verwenden.

So verwenden Sie die Sprachübersetzungsfunktion in der Anwendung:

  1. Achten Sie darauf, dass das Hardwaregerät eine der Sprachen verwendet, die im Abschnitt Mikrodienst erstellen und bereitstellen konfiguriert wurden. Öffnen Sie auf dem Gerät die App Einstellungen und wählen Sie System > Sprache und Eingabe > Sprache aus, um die Sprache zu ändern.
  2. Öffnen Sie in Android Studio das Projekt "Playchat" und verbinden Sie das Hardwaregerät über ein USB-Kabel mit Ihrem Computer. Weitere Informationen finden Sie unter Gerät für die Entwicklung einrichten.
  3. Klicken Sie in Android Studio auf Run (Ausführen), um die Anwendung auf dem Gerät zu erstellen und auszuführen.
  4. Tippen Sie in der Playchat-App auf das Mikrofonsymbol, um die Aufnahme zu starten. Nehmen Sie eine kurze Nachricht auf und tippen Sie nochmal auf das Mikrofonsymbol, um die Aufnahme zu beenden.
  5. Nach wenigen Sekunden zeigt die Playchat-App den Text der aufgezeichneten Nachricht auf dem Bildschirm an. Tippen Sie auf die Nachricht, um die Audioversion abzuspielen.
  6. Konfigurieren Sie das Gerät, sodass es eine andere unterstützte Sprache verwendet.
  7. Die Playchat-App zeigt die zuvor aufgezeichnete Nachricht in der neuen unterstützten Sprache an. Tippen Sie auf die Nachricht, um die Audioversion in der neuen Sprache abzuspielen.

Der folgende Screenshot zeigt die Playchat-App mit einer ins Französische übersetzten Nachricht:

Screenshot: Sprachübersetzungsfunktion auf Android-Gerät

Code erforschen

Die Client-App führt die folgenden Aufgaben aus, um die Sprachübersetzungsfunktion zu unterstützen:

  1. Sie zeichnet Audiodaten mit den empfohlenen Parametern auf, die in den Best Practices der Speech-to-Text API beschrieben sind.
  2. Sie codiert die Audiodaten nach dem Base64-Schema, um die Audiodaten in einem Stringformat darzustellen, das in eine HTTP-Anfrage eingebettet werden kann.
  3. Sie sendet eine HTTP-Anfrage an den Mikrodienst. Die Anfrage enthält die codierte Audionachricht sowie Metadaten, die zusätzliche Informationen zur Nutzlast enthalten. Die Anwendung verwendet die Cronet-Bibliothek zur Verwaltung der Netzwerkanfragen.
  4. Wenn der Nutzer die übersetzte Nachricht abhören möchte, lädt die Anwendung die entsprechende Audiodatei herunter. Dazu sendet sie eine authentifizierte HTTP-Anfrage an den Cloud Storage-Bucket, in dem die übersetzten Nachrichten gespeichert sind.

Im folgenden Codebeispiel finden Sie die Konstanten, die im Beispiel verwendet werden, um die Konfigurationsparameter für die Aufzeichnung anzugeben:

private static final int AUDIO_SOURCE = MediaRecorder.AudioSource.UNPROCESSED;
private static final int SAMPLE_RATE_IN_HZ = 16000;
private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
  • AUDIO_SOURCE: MediaRecorder.AudioSource.UNPROCESSED bezeichnet eine unverarbeitete Audioquelle, da die Verwendung von Signalverarbeitungsalgorithmen wie Rauschunterdrückung oder Verstärkungsregelung die Erkennungsgenauigkeit verringert.
  • SAMPLE_RATE_IN_HZ: Für das Beispiel wird eine native Abtastrate der Audioquelle von 16,000 Hz verwendet.
  • CHANNEL_CONFIG: AudioFormat.CHANNEL_IN_MONO gibt an, dass für die Aufnahme nur ein Audiokanal verwendet wird. Für das Beispiel wird angenommen, dass die Aufnahme die Stimme nur einer Person enthält.
  • AUDIO_FORMAT: AudioFormat.ENCODING_PCM_16BIT gibt das lineare PCM-Audiodatenformat mit 16 Bit pro Sample an. Lineares PCM ist ein verlustfreies Format, das für die Spracherkennung bevorzugt verwendet wird.

Die Client-App verwendet die AudioRecord API, um Audiodaten vom integrierten Mikrofon aufzunehmen, und speichert eine .WAV-Datei auf dem Gerät. Weitere Informationen finden Sie in der Klasse RecordingHelper des Playchat-Beispiels.

Zur Codierung der Audiodaten mit dem Base64-Schema wird im Beispiel die Klasse Base64 des Android Frameworks verwendet. Die codierten Audiodaten dürfen keine Zeilenabschlusszeichen enthalten. Diese werden durch die Verwendung des Flags NO_WRAP ausgelassen. Das folgende Beispiel zeigt, wie Audiodaten mit der Klasse Base64 codiert werden:

public static String encode(File inputFile) throws IOException {
    byte[] data = new byte[(int) inputFile.length()];
    DataInputStream input = new DataInputStream(new FileInputStream(inputFile));
    int readBytes = input.read(data);
    Log.i(TAG, readBytes + " read from input file.");
    input.close();
    return Base64.encodeToString(data, Base64.NO_WRAP);
}

Die Client-App stellt eine HTTP-Anfrage mit den folgenden Parametern, um die codierten Audiodaten an den Mikrodienst zu senden:

  • Methode: POST
  • Inhaltstyp: application/json
  • Text: JSON-Objekt mit den folgenden Attributen:
    • encoding: der String LINEAR16.
    • sampleRateHertz: die Abtastrate der aufgenommenen Audiodaten. Beispiel: 16000.
    • languageCode: der Sprachcode der aufgezeichneten Nachricht. Die Client-App geht davon aus, dass die Nachricht in der Sprache aufgezeichnet wird, die in den Geräteeinstellungen konfiguriert ist. Beispiel: de-DE.
    • audioContent: die nach dem Base64-Schema codierte Audionachricht.

Das folgende Beispiel zeigt, wie ein JSON-Objekt erstellt wird, das die im Anfragetext erforderlichen Attribute enthält:

JSONObject requestBody = new JSONObject();
try {
    requestBody.put("encoding", SPEECH_TRANSLATE_ENCODING);
    requestBody.put("sampleRateHertz", sampleRateInHertz);
    requestBody.put("languageCode", context.getResources().getConfiguration().getLocales().get(0));
    requestBody.put("audioContent", base64EncodedAudioMessage);
} catch(JSONException e) {
    Log.e(TAG, e.getLocalizedMessage());
    translationListener.onTranslationFailed(e);
}

Weitere Informationen zum Erstellen der HTTP-Anfrage finden Sie in der Klasse SpeechTranslationHelper der Playchat-Beispiel-App.

Die App verwendet eine Download-URL, die ein Token enthält, um die Audiodateien aus dem Cloud Storage-Bucket abzurufen. Dieses Token kann bei Bedarf über die Firebase Console widerrufen werden. Sie erhalten die Download-URL durch Aufrufen der Methode getDownloadUrl(), wie im folgenden Beispiel gezeigt:

FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference gsReference = storage.getReferenceFromUrl(gcsUrl);
gsReference.getDownloadUrl().addOnCompleteListener(getDownloadUriListener);

Der Mikrodienst führt die folgenden Aufgaben aus, um die Sprachübersetzungsfunktion zu unterstützen:

  1. Er empfängt Sprachübersetzungsanfragen, die Base64-codierte Audiodaten enthalten.
  2. Er sendet die codierten Audiodaten an die Speech-to-Text API und empfängt eine Transkription in der Ausgangssprache.
  3. Für jede unterstützte Sprache sendet er die Transkription an die Translation API und empfängt den übersetzten Text.
  4. Für jede unterstützte Sprache sendet er den übersetzten Text an die Text-to-Speech API und empfängt die übersetzten Audiodaten.
  5. Er lädt die übersetzten Audiodateien in den Cloud Storage-Bucket hoch.

Der Mikrodienst verwendet die Ausgabe eines Aufrufs an eine Cloud API als Eingabe des Aufrufs an die nächste API, wie im folgenden Codebeispiel gezeigt:

const [sttResponse] = await callSpeechToText(
  inputAudioContent,
  inputEncoding,
  inputSampleRateHertz,
  inputLanguageCode
);

// The data object contains one or more recognition
// alternatives ordered by accuracy.
const transcription = sttResponse.results
  .map(result => result.alternatives[0].transcript)
  .join('\n');
responseBody.transcription = transcription;
responseBody.gcsBucket = outputBucket;

const translations = [];
supportedLanguageCodes.forEach(async languageCode => {
  const translation = {languageCode: languageCode};
  const outputFilename =
    request.body.outputFilename ||
    `${uuid.v4()}.${outputAudioEncoding.toLowerCase()}`;

  try {
    const [textTranslation] = await callTextTranslation(
      languageCode,
      transcription
    );
    translation.text = textTranslation;

    const [{audioContent}] = await callTextToSpeech(
      languageCode,
      textTranslation
    );
    const path = `${languageCode}/${outputFilename}`;

    console.log('zzx', audioContent);

    await uploadToCloudStorage(path, audioContent);

    console.log(`Successfully translated input to ${languageCode}.`);
    translation.gcsPath = path;
    translations.push(translation);
    if (translations.length === supportedLanguageCodes.length) {
      responseBody.translations = translations;
      console.log(`Response: ${JSON.stringify(responseBody)}`);
      response.status(200).send(responseBody);
    }
  } catch (error) {
    console.error(
      `Partial error in translation to ${languageCode}: ${error}`
    );
    translation.error = error.message;
    translations.push(translation);
    if (translations.length === supportedLanguageCodes.length) {
      responseBody.translations = translations;
      console.log(`Response: ${JSON.stringify(responseBody)}`);
      response.status(200).send(responseBody);
    }
  }
});

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

Google Cloud- und Firebase-Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das für die Anleitung erstellte Projekt löschen. Obwohl Sie das Projekt in der Firebase Console erstellt haben, können Sie es in der Google Cloud Console löschen, da die Firebase- und Google Cloud-Projekte identisch sind.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nicht standardmäßige Versionen Ihrer App Engine-App löschen

Wenn Sie Ihr Google Cloud- und Firebase-Projekt nicht löschen möchten, können Sie trotzdem die Kosten senken. Löschen Sie dazu die nicht standardmäßigen Versionen der App in der flexiblen App Engine-Umgebung.

  1. Rufen Sie in der Cloud Console die Seite Versionen für App Engine auf.

    Zur Seite "Versionen"

  2. Klicken Sie auf das Kästchen für die nicht standardmäßige Anwendungsversion, die Sie löschen möchten.
  3. Klicken Sie zum Löschen der Anwendungsversion auf Löschen.