Intent mit Audioausgabe erkennen

Anwendungen benötigen für die Kommunikation mit dem Nutzer oft einen Bot. Dialogflow Anwendungen benötigen oft einen Bot, der mit dem Endnutzer kommuniziert. Mit Dialogflow können Sie Cloud Text-to-Speech mit DeepMind WaveNet verwenden, um Sprachantworten von Ihrem Agenten zu generieren. Diese Umwandlung von Textantworten in Audio wird als Audioausgabe, Sprachsynthese,

Sie können Audio sowohl für die Eingabe als auch für die Ausgabe verwenden, wenn Sie einen Intent erkennen. Dies ist üblich, wenn Apps entwickelt werden, die mit Nutzern über eine reine Audioschnittstelle kommunizieren.

Eine Liste der unterstützten Sprachen finden Sie in der Spalte TTS auf der Seite Sprachen.

Hinweis

Dieses Feature ist nur verfügbar, wenn die API für Endnutzerinteraktionen verwendet wird. Wenn Sie eine Integration verwenden, können Sie diesen Leitfaden überspringen.

Führen Sie zuerst die folgenden Schritte aus:

Agent erstellen

  1. Rufen Sie die Dialogflow ES-Konsole auf.
  2. Melden Sie sich in der Console an, wenn Sie dazu aufgefordert werden. Weitere Informationen finden Sie in der Übersicht über die Dialogflow-Konsole.
  3. Maximieren Sie im Menü der Seitenleiste Lade-Agents.
  4. Klicken Sie auf Neuen Agent erstellen.
  5. Geben Sie den Namen des KI-Agenten, die Standardsprache und die Standardzeitzone ein.
  6. Geben Sie ein vorhandenes Projekt ein. Wenn Sie ein Projekt über die Dialogflow-Konsole erstellen möchten, wählen Sie Neues Google-Projekt erstellen aus.
  7. Klicken Sie auf Erstellen.

Intent erkennen

Rufen Sie zum Erkennen der Intent die Methode detectIntent für den Typ Sessions auf.

REST

1. Audioinhalte vorbereiten

Laden Sie die Beispieldatei book-a-room.wav für input_audio herunter, in der „book a room“ gesagt wird. Die Audiodatei muss für dieses Beispiel base64-codiert sein, damit sie in der JSON-Anfrage unten bereitgestellt werden kann.

Hier ein Linux-Beispiel:

wget https://cloud.google.com/dialogflow/es/docs/data/book-a-room.wav
base64 -w 0 book-a-room.wav > book-a-room.b64

Beispiele für andere Plattformen finden Sie in der Cloud Speech API-Dokumentation unter Base64-codierte Audioinhalte einbetten.

2. Anfrage zur Intent-Erkennung erstellen

Rufen Sie die Methode detectIntent für den Typ Sessions auf und geben Sie base64-codierte Audiodaten an.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID: Ihre Google Cloud-Projekt-ID
  • SESSION_ID: eine Sitzungs-ID
  • BASE64_AUDIO: Der base64-Inhalt aus der vorherigen Ausgabedatei

HTTP-Methode und URL:

POST https://dialogflow.googleapis.com/v2/projects/PROJECT_ID/agent/sessions/SESSION_ID:detectIntent

JSON-Text anfordern:

{
  "queryInput": {
    "audioConfig": {
      "languageCode": "en-US"
    }
  },
  "outputAudioConfig" : {
    "audioEncoding": "OUTPUT_AUDIO_ENCODING_LINEAR_16"
  },
  "inputAudio": "BASE64_AUDIO"
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
  "responseId": "b7405848-2a3a-4e26-b9c6-c4cf9c9a22ee",
  "queryResult": {
    "queryText": "book a room",
    "speechRecognitionConfidence": 0.8616504,
    "action": "room.reservation",
    "parameters": {
      "time": "",
      "date": "",
      "duration": "",
      "guests": "",
      "location": ""
    },
    "fulfillmentText": "I can help with that. Where would you like to reserve a room?",
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            "I can help with that. Where would you like to reserve a room?"
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/PROJECT_ID/agent/intents/e8f6a63e-73da-4a1a-8bfc-857183f71228",
      "displayName": "room.reservation"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en-us"
  },
  "outputAudio": "UklGRs6vAgBXQVZFZm10IBAAAAABAAEAwF0AAIC7AA..."
}

Beachten Sie, dass der Wert des Felds queryResult.action room.reservation ist und das Feld outputAudio einen großen Base64-Audiostring enthält.

3. Audioausgabe abspielen

Kopieren Sie den Text aus dem Feld outputAudio und speichern Sie ihn in einer Datei mit dem Namen output_audio.b64. Diese Datei muss in Audio konvertiert werden.

Hier ein Linux-Beispiel:

base64 -d output_audio.b64 > output_audio.wav

Beispiele für andere Plattformen finden Sie in der Text-to-Speech API-Dokumentation unter Base64-codierte Audioinhalte decodieren.

Sie können jetzt die Audiodatei output_audio.wav abspielen und hören, dass sie mit dem Text aus dem Feld queryResult.fulfillmentMessages[1].text.text[0] oben übereinstimmt. Das zweite fulfillmentMessages-Element wird ausgewählt, da es die Textantwort für die Standardplattform ist.

Java

Richten Sie zur Authentifizierung bei Dialogflow CX Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.


import com.google.api.gax.rpc.ApiException;
import com.google.cloud.dialogflow.v2.DetectIntentRequest;
import com.google.cloud.dialogflow.v2.DetectIntentResponse;
import com.google.cloud.dialogflow.v2.OutputAudioConfig;
import com.google.cloud.dialogflow.v2.OutputAudioEncoding;
import com.google.cloud.dialogflow.v2.QueryInput;
import com.google.cloud.dialogflow.v2.QueryResult;
import com.google.cloud.dialogflow.v2.SessionName;
import com.google.cloud.dialogflow.v2.SessionsClient;
import com.google.cloud.dialogflow.v2.TextInput;
import com.google.common.collect.Maps;
import java.io.IOException;
import java.util.List;
import java.util.Map;

public class DetectIntentWithTextToSpeechResponse {

  public static Map<String, QueryResult> detectIntentWithTexttoSpeech(
      String projectId, List<String> texts, String sessionId, String languageCode)
      throws IOException, ApiException {
    Map<String, QueryResult> queryResults = Maps.newHashMap();
    // Instantiates a client
    try (SessionsClient sessionsClient = SessionsClient.create()) {
      // Set the session name using the sessionId (UUID) and projectID (my-project-id)
      SessionName session = SessionName.of(projectId, sessionId);
      System.out.println("Session Path: " + session.toString());

      // Detect intents for each text input
      for (String text : texts) {
        // Set the text (hello) and language code (en-US) for the query
        TextInput.Builder textInput =
            TextInput.newBuilder().setText(text).setLanguageCode(languageCode);

        // Build the query with the TextInput
        QueryInput queryInput = QueryInput.newBuilder().setText(textInput).build();

        //
        OutputAudioEncoding audioEncoding = OutputAudioEncoding.OUTPUT_AUDIO_ENCODING_LINEAR_16;
        int sampleRateHertz = 16000;
        OutputAudioConfig outputAudioConfig =
            OutputAudioConfig.newBuilder()
                .setAudioEncoding(audioEncoding)
                .setSampleRateHertz(sampleRateHertz)
                .build();

        DetectIntentRequest dr =
            DetectIntentRequest.newBuilder()
                .setQueryInput(queryInput)
                .setOutputAudioConfig(outputAudioConfig)
                .setSession(session.toString())
                .build();

        // Performs the detect intent request
        DetectIntentResponse response = sessionsClient.detectIntent(dr);

        // Display the query result
        QueryResult queryResult = response.getQueryResult();

        System.out.println("====================");
        System.out.format("Query Text: '%s'\n", queryResult.getQueryText());
        System.out.format(
            "Detected Intent: %s (confidence: %f)\n",
            queryResult.getIntent().getDisplayName(), queryResult.getIntentDetectionConfidence());
        System.out.format(
            "Fulfillment Text: '%s'\n",
            queryResult.getFulfillmentMessagesCount() > 0
                ? queryResult.getFulfillmentMessages(0).getText()
                : "Triggered Default Fallback Intent");

        queryResults.put(text, queryResult);
      }
    }
    return queryResults;
  }
}

Node.js

Richten Sie zur Authentifizierung bei Dialogflow CX Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

// Imports the Dialogflow client library
const dialogflow = require('@google-cloud/dialogflow').v2;

// Instantiate a DialogFlow client.
const sessionClient = new dialogflow.SessionsClient();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = 'ID of GCP project associated with your Dialogflow agent';
// const sessionId = `user specific ID of session, e.g. 12345`;
// const query = `phrase(s) to pass to detect, e.g. I'd like to reserve a room for six people`;
// const languageCode = 'BCP-47 language code, e.g. en-US';
// const outputFile = `path for audio output file, e.g. ./resources/myOutput.wav`;

// Define session path
const sessionPath = sessionClient.projectAgentSessionPath(
  projectId,
  sessionId
);
const fs = require('fs');
const util = require('util');

async function detectIntentwithTTSResponse() {
  // The audio query request
  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        text: query,
        languageCode: languageCode,
      },
    },
    outputAudioConfig: {
      audioEncoding: 'OUTPUT_AUDIO_ENCODING_LINEAR_16',
    },
  };
  sessionClient.detectIntent(request).then(responses => {
    console.log('Detected intent:');
    const audioFile = responses[0].outputAudio;
    util.promisify(fs.writeFile)(outputFile, audioFile, 'binary');
    console.log(`Audio content written to file: ${outputFile}`);
  });
}
detectIntentwithTTSResponse();

Python

Richten Sie zur Authentifizierung bei Dialogflow CX Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

def detect_intent_with_texttospeech_response(
    project_id, session_id, texts, language_code
):
    """Returns the result of detect intent with texts as inputs and includes
    the response in an audio format.

    Using the same `session_id` between requests allows continuation
    of the conversation."""
    from google.cloud import dialogflow

    session_client = dialogflow.SessionsClient()

    session_path = session_client.session_path(project_id, session_id)
    print("Session path: {}\n".format(session_path))

    for text in texts:
        text_input = dialogflow.TextInput(text=text, language_code=language_code)

        query_input = dialogflow.QueryInput(text=text_input)

        # Set the query parameters with sentiment analysis
        output_audio_config = dialogflow.OutputAudioConfig(
            audio_encoding=dialogflow.OutputAudioEncoding.OUTPUT_AUDIO_ENCODING_LINEAR_16
        )

        request = dialogflow.DetectIntentRequest(
            session=session_path,
            query_input=query_input,
            output_audio_config=output_audio_config,
        )
        response = session_client.detect_intent(request=request)

        print("=" * 20)
        print("Query text: {}".format(response.query_result.query_text))
        print(
            "Detected intent: {} (confidence: {})\n".format(
                response.query_result.intent.display_name,
                response.query_result.intent_detection_confidence,
            )
        )
        print("Fulfillment text: {}\n".format(response.query_result.fulfillment_text))
        # The response's audio_content is binary.
        with open("output.wav", "wb") as out:
            out.write(response.output_audio)
            print('Audio content written to file "output.wav"')

Weitere Informationen zu den relevanten Antwortfeldern finden Sie im Abschnitt Antworten auf Intent-Erkennung.

Intent-Antworten erkennen

Auf eine Anfrage zur Intent-Erkennung wird als Antwort ein Objekt des Typs DetectIntentResponse zurückgegeben.

Die normale Verarbeitung der Intent-Erkennung steuert den Inhalt des Felds DetectIntentResponse.queryResult.fulfillmentMessages.

Das Feld DetectIntentResponse.outputAudio wird mit Audioinhalten gefüllt, die auf den Werten der Standard-Plattform-Textantworten im Feld DetectIntentResponse.queryResult.fulfillmentMessages basieren:

  • Wenn mehrere Standardtextantworten vorhanden sind, werden sie beim Generieren von Audio verkettet.
  • Wenn keine Standard-Plattformtextantworten vorhanden sind, ist der generierte Audioinhalt leer.

Das Feld DetectIntentResponse.outputAudioConfig wird mit den Audioeinstellungen gefüllt, die zum Generieren der Audioausgabe verwendet werden.

Intent in Stream erkennen

Wenn Sie die Absicht aus einem Stream erkennen, senden Sie Anfragen, die dem Beispiel ähneln, in dem keine Audioausgabe verwendet wird: Absicht aus einem Stream erkennen. Sie geben jedoch ein OutputAudioConfig-Feld in der Anfrage an. Die Felder output_audio und output_audio_config werden in der endgültigen Streamingantwort ausgefüllt, die Sie vom Dialogflow API-Server erhalten. Weitere Informationen finden Sie unter StreamingDetectIntentRequest und StreamingDetectIntentResponse.

Agent-Einstellungen für Sprache

Sie können verschiedene Aspekte der Sprachsynthese steuern. Weitere Informationen finden Sie unter Spracheinstellungen für den Agent.

Dialogflow-Simulator verwenden

Sie können mit dem Agenten interagieren und Audioantworten über den Dialogflow-Simulator erhalten:

  1. Aktivieren Sie die automatische Text-zu-Sprache-Funktion, indem Sie der Anleitung unter Spracheinstellungen für Agenten folgen.
  2. Geben Sie in den Simulator "book a room" (Raum buchen) ein oder sagen Sie die Worte.
  3. Sehen Sie sich im Simulator den Abschnitt Audioausgabe an.