Détecter un intent et générer une sortie audio

Les applications ont souvent besoin d'un bot pour communiquer avec l'utilisateur final. Dialogflow Les applications ont souvent besoin d'un bot pour communiquer avec l'utilisateur final. Dialogflow vous permet d'utiliser Cloud Text-to-Speech fourni par DeepMind WaveNet pour générer des réponses vocales à partir de votre agent. Cette conversion des réponses d'intent textuelles en audio est appelée sortie audio, synthèse vocale,

Vous pouvez utiliser la fonction audio pour les entrées et les sorties lors de la détection d'un intent. Ce cas est courant pour le développement d'applications qui communiquent avec les utilisateurs à l'aide d'une interface purement audio.

Pour obtenir la liste des langues acceptées, consultez la colonne TTS de la page Langues.

Avant de commencer

Cette fonctionnalité n'est disponible que lorsque l'API est utilisée pour les interactions de l'utilisateur final. Si vous utilisez une intégration, vous pouvez ignorer ce guide.

Avant de commencer, procédez comme suit :

Créer un agent

  1. Accédez à la console Dialogflow ES.
  2. Connectez-vous à la console si vous y êtes invité. Pour en savoir plus, consultez la présentation de la console Dialogflow.
  3. Dans le menu de la barre latérale, développez Agents de chargement.
  4. Cliquez sur Create new agent (Créer un agent).
  5. Saisissez le nom de l'agent, la langue par défaut et le fuseau horaire par défaut.
  6. Saisissez un projet existant. Pour autoriser la console Dialogflow à créer un projet, sélectionnez Créer un projet Google.
  7. Cliquez sur Créer.

Détecter un intent

Pour détecter l'intent, appelez la méthode detectIntent du type Sessions.

REST

1. Préparez le contenu audio

Téléchargez l'exemple de fichier input_audio book-a-room.wav, qui énonce la phrase "book a room". Pour cet exemple, le fichier audio doit être encodé en base64 afin de pouvoir être inclus dans la requête JSON ci-dessous.

Voici un exemple avec Linux :

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

Pour voir des exemples sur d'autres plates-formes, consultez la page Intégrer du contenu audio encodé en base64 dans la documentation de l'API Cloud Speech.

2. Effectuez une requête de détection d'intent

Appelez la méthode detectIntent sur le type Sessions et spécifiez les données audio encodées en base64.

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud
  • SESSION_ID : un ID de session
  • BASE64_AUDIO : contenu base64 du fichier de sortie spécifié ci-dessus

Méthode HTTP et URL :

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

Corps JSON de la requête :

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

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "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..."
}

Notez que la valeur du champ queryResult.action est room.reservation et que le champ outputAudio contient une grande chaîne audio en base64.

3. Lisez la sortie audio

Copiez le texte du champ outputAudio et enregistrez-le dans un fichier nommé output_audio.b64. Ce fichier doit être converti en audio.

Voici un exemple avec Linux :

base64 -d output_audio.b64 > output_audio.wav

Pour voir des exemples sur d'autres plates-formes, consultez la page Décoder le contenu audio encodé en base64 dans la documentation de l'API Text-to-Speech.

Vous pouvez maintenant lire le fichier audio output_audio.wav et constater que son contenu correspond au texte du champ queryResult.fulfillmentMessages[1].text.text[0] ci-dessus. Le deuxième élément fulfillmentMessages est choisi, car il s'agit de la réponse textuelle destinée à la plate-forme par défaut.

Java

Pour vous authentifier auprès de Dialogflow CX, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


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

Pour vous authentifier auprès de Dialogflow CX, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

// 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

Pour vous authentifier auprès de Dialogflow CX, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

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"')

Pour en savoir plus sur les champs de réponse concernés, consultez la section Réponses de détection d'intent.

Réponses de détection d'intent

La réponse à une requête de détection d'intent est du type DetectIntentResponse.

Le traitement normal de détection d'intent contrôle le contenu du champ DetectIntentResponse.queryResult.fulfillmentMessages.

Le champ DetectIntentResponse.outputAudio contient des données audio basées sur les valeurs des réponses textuelles de la plate-forme par défaut trouvées dans le champ DetectIntentResponse.queryResult.fulfillmentMessages :

  • Si plusieurs réponses textuelles par défaut existent, elles sont regroupées lors de la génération du contenu audio.
  • Si aucune réponse textuelle de plate-forme par défaut n'existe, le contenu audio généré est vide.

Le champ DetectIntentResponse.outputAudioConfig contient les paramètres audio utilisés pour générer la sortie audio.

Détecter l'intent d'un flux

Lors de la détection d'intent à partir d'un flux, vous envoyez des requêtes similaires à l'exemple qui n'utilise pas le contenu audio de sortie : Détecter l'intent d'un flux. Vous fournissez toutefois un champ OutputAudioConfig à la requête. Les champs output_audio et output_audio_config sont renseignés dans la réponse de streaming finale reçue du serveur de l'API Dialogflow. Pour en savoir plus, consultez les sections StreamingDetectIntentRequest et StreamingDetectIntentResponse.

Paramètres de l'agent pour la synthèse vocale

Vous pouvez contrôler différents aspects de la synthèse vocale. Consultez les paramètres de synthèse vocale de l'agent.

Utiliser le simulateur Dialogflow

Vous pouvez interagir avec l'agent et recevoir des réponses audio à l'aide du simulateur Dialogflow :

  1. Activez la synthèse vocale automatique en suivant les instructions de la section Paramètres vocaux de l'agent.
  2. Saisissez ou dites "book a room" dans le simulateur.
  3. Consultez la section contenu audio de sortie dans le simulateur.