Detectar intents con salida de audio

Las aplicaciones suelen necesitar un bot para responder al usuario final. Dialogflow puede usar Cloud Text-to-Speech, que se basa en DeepMind WaveNet, para generar respuestas de voz de tu agente. Esta conversión de respuestas de texto de intents a audio se conoce como salida de audio, síntesis de voz, conversión de texto a voz o TTS.

En esta guía se proporciona un ejemplo que usa audio tanto para la entrada como para la salida al detectar una intención. Este caso de uso es habitual cuando se desarrollan aplicaciones que se comunican con los usuarios a través de una interfaz puramente de audio.

Para ver una lista de los idiomas admitidos, consulta la columna TTS de la página Idiomas.

Antes de empezar

Esta función solo se aplica cuando se usa la API para las interacciones con el usuario final. Si usas una integración, puedes saltarte esta guía.

Antes de leer esta guía, debes hacer lo siguiente:

  1. Consulta los conceptos básicos de Dialogflow.
  2. Sigue los pasos de configuración.

Crear un agente

Si aún no has creado un agente, hazlo ahora:

  1. Ve a la consola de Dialogflow ES.
  2. Si se te solicita, inicia sesión en la consola de Dialogflow. Para obtener más información, consulta el artículo Información general sobre la consola de Dialogflow.
  3. En el menú de la barra lateral de la izquierda, haz clic en Crear agente. Si ya tienes otros agentes, haz clic en el nombre del agente, desplázate hasta la parte inferior y haz clic en Crear nuevo agente.
  4. Introduce el nombre, el idioma predeterminado y la zona horaria predeterminada del agente.
  5. Si ya has creado un proyecto, accede a él. Si quieres permitir que la consola de Dialogflow cree el proyecto, selecciona Crear un proyecto de Google.
  6. Haz clic en el botón Crear.

Importar el archivo de ejemplo a tu agente

En los pasos de esta guía se presupone que tienes un agente, por lo que debes importar un agente preparado para esta guía. Al importar, estos pasos utilizan la opción Restaurar, que sobrescribe todos los ajustes, las intenciones y las entidades del agente.

Para importar el archivo, sigue estos pasos:

  1. Descarga el archivo room-booking-agent.zip.
  2. Ve a la consola de Dialogflow ES.
  3. Selecciona tu agente.
  4. Haz clic en el botón de configuración situado junto al nombre del agente.
  5. Selecciona la pestaña Exportar e importar.
  6. Selecciona Restaurar desde ZIP y sigue las instrucciones para restaurar el archivo ZIP que has descargado.

Detectar un intent

Para detectar la intención, llama al método detectIntent del tipo Sessions.

REST

1. Preparar contenido de audio

Descarga el archivo de audio de entrada de muestra book-a-room.wav, que dice "book a room" (reserva una habitación). El archivo de audio debe estar codificado en Base64 para este ejemplo, de modo que se pueda proporcionar en la solicitud JSON que se muestra a continuación. Aquí tienes un ejemplo para 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

Para ver ejemplos en otras plataformas, consulta Insertar audio codificado en Base64 en la documentación de la API Cloud Speech.

2. Hacer una solicitud de detección de intent

Llama al método detectIntent en el tipo Sessions y especifica el audio codificado en base64.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • PROJECT_ID: tu ID de proyecto de Google Cloud
  • SESSION_ID: un ID de sesión
  • BASE64_AUDIO: el contenido en base64 del archivo de salida anterior

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

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

Ten en cuenta que el valor del campo queryResult.action es room.reservation y que el campo outputAudio contiene una cadena de audio larga en base64.

3. Reproducir audio de salida

Copia el texto del campo outputAudio y guárdalo en un archivo llamado output_audio.b64. Este archivo debe convertirse a audio. Aquí tienes un ejemplo para Linux:

base64 -d output_audio.b64 > output_audio.wav

Para ver ejemplos en otras plataformas, consulta Decodificar contenido de audio codificado en Base64 en la documentación de la API Text-to-Speech.

Ahora puedes reproducir el archivo de audio output_audio.wav y comprobar que coincide con el texto del campo queryResult.fulfillmentMessages[1].text.text[0] de arriba. Se elige el segundo elemento fulfillmentMessages porque es la respuesta de texto de la plataforma predeterminada.

Java

Para autenticarte en Dialogflow, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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

Para autenticarte en Dialogflow, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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

Para autenticarte en Dialogflow, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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"')

Consulta la sección Respuestas de detección de intenciones para ver una descripción de los campos de respuesta pertinentes.

Detectar respuestas de intents

La respuesta a una solicitud de detección de intents es de tipo DetectIntentResponse.

El procesamiento normal de la detección de intenciones controla el contenido del campo DetectIntentResponse.queryResult.fulfillmentMessages.

El campo DetectIntentResponse.outputAudio se rellena con audio en función de los valores de las respuestas de texto de la plataforma predeterminada que se encuentran en el campo DetectIntentResponse.queryResult.fulfillmentMessages. Si hay varias respuestas de texto predeterminadas, se concatenarán al generar el audio. Si no hay respuestas de texto predeterminadas de la plataforma, el contenido de audio generado estará vacío.

El campo DetectIntentResponse.outputAudioConfig se rellena con los ajustes de audio utilizados para generar el audio de salida.

Detectar el intent de una emisión

Cuando detectas el intent de una emisión, envías solicitudes similares al ejemplo que no usa audio de salida: Detectar el intent de una emisión. Sin embargo, debes proporcionar un campo OutputAudioConfig en la solicitud. Los campos output_audio y output_audio_config se rellenan en la última respuesta de streaming que recibes del servidor de la API Dialogflow. Para obtener más información, consulta StreamingDetectIntentRequest y StreamingDetectIntentResponse.

Configuración de los agentes para la voz

Puedes controlar varios aspectos de la síntesis de voz. Consulta los ajustes de voz del agente.

Usar el simulador de Dialogflow

Puedes interactuar con el agente y recibir respuestas de audio a través del simulador de Dialogflow:

  1. Sigue los pasos anteriores para habilitar la función de texto a voz automática.
  2. Escribe o di "reservar una sala" en el simulador.
  3. Consulta la sección Audio de salida en la parte inferior del simulador.