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 peut désormais faire appel à 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 ou text-to-speech (TTS).

L'exemple présenté dans ce guide utilise la fonction audio pour les entrées et les sorties lors de la détection d'un intent. Ce cas d'utilisation est courant pour le développement d'applications qui communiquent avec les utilisateurs via une interface purement audio.

Pour obtenir la liste des langues compatibles, consultez la colonne TTS dans le tableau 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 lire ce guide, procédez comme suit :

  1. Consultez la section Principes de base de Dialogflow.
  2. Effectuez la procédure de configuration.

Créer un agent

Si vous n'avez pas encore créé d'agent, créez-en un maintenant :

  1. Accédez à la console Dialogflow ES.
  2. Si nécessaire, connectez-vous à la console Dialogflow. Consultez la section Présentation de la console Dialogflow pour plus d'informations.
  3. Cliquez sur Créer un agent dans le menu de la barre latérale de gauche. (Si vous avez déjà d'autres agents, cliquez sur le nom de l'un d'eux, faites défiler vers le bas, puis cliquez sur Créer un agent.)
  4. Saisissez le nom de l'agent, la langue par défaut et le fuseau horaire par défaut.
  5. Si vous avez déjà créé un projet, saisissez son nom. Si vous souhaitez autoriser la console Dialogflow à créer le projet, sélectionnez Créer un projet Google.
  6. Cliquez sur le bouton Créer.

Importer le fichier d'exemple dans l'agent

Dans la mesure où les étapes de ce guide sont fondées sur certaines hypothèses concernant votre agent, vous devez importer un agent préparé pour ce guide. Lors de l'importation, ces étapes utilisent l'option de restauration qui écrase l'ensemble des paramètres, des intents et des entités de l'agent.

Pour importer le fichier, procédez comme suit :

  1. Téléchargez le fichier room-booking-agent.zip.
  2. Accédez à la console Dialogflow ES.
  3. Sélectionnez votre agent.
  4. Cliquez sur le bouton des paramètres à côté du nom de l'agent.
  5. Sélectionnez l'onglet Exporter et importer.
  6. Sélectionnez Restaurer depuis un fichier ZIP et suivez les instructions pour restaurer le fichier ZIP que vous avez téléchargé.

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 du type Sessions et spécifiez les données audio encodées en base64.

Avant d'utiliser les données de requête ci-dessous, 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 figurant dans le 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 avec un code 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 second é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, 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, configurez le service 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, 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 obtenir une description des champs de réponse pertinents, 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 seront 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é sera 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 toute dernière réponse de streaming 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 pour en savoir plus.

Utiliser le simulateur Dialogflow

Vous pouvez interagir avec l'agent et recevoir des réponses audio via le simulateur Dialogflow :

  1. Suivez la procédure ci-dessus pour activer la synthèse vocale automatique.
  2. Saisissez ou dites "book a room" dans le simulateur.
  3. Consultez la section contenu audio de sortie au bas du simulateur.