Mendeteksi intent dengan output audio

Aplikasi sering kali memerlukan bot untuk merespons pengguna akhir. Aplikasi Dialogflow sering kali memerlukan bot untuk merespons pengguna akhir. Dialogflow memungkinkan Anda menggunakan Cloud Text-to-Speech yang didukung oleh DeepMind WaveNet untuk menghasilkan respons ucapan dari agen Anda. Konversi dari respons teks intent ke audio ini disebut output audio, sintesis ucapan,

Anda dapat menggunakan audio untuk input dan output saat mendeteksi maksud. Hal ini umum terjadi saat mengembangkan aplikasi yang berkomunikasi dengan pengguna menggunakan antarmuka audio murni.

Untuk mengetahui daftar bahasa yang didukung, lihat kolom TTS di halaman Bahasa.

Sebelum memulai

Fitur ini hanya berlaku saat menggunakan API untuk interaksi pengguna akhir. Jika Anda menggunakan integrasi, Anda dapat melewati panduan ini.

Sebelum memulai, selesaikan langkah-langkah berikut:

Buat agen

  1. Buka konsol Dialogflow ES.
  2. Login ke konsol jika diminta. Untuk mengetahui informasi selengkapnya, lihat Ringkasan konsol Dialogflow.
  3. Di menu sidebar, luaskan Loading agents.
  4. Klik Create new agent.
  5. Masukkan nama agen, bahasa default, dan zona waktu default.
  6. Masukkan project yang ada. Agar konsol Dialogflow membuat project, pilih Buat project Google baru.
  7. Klik Create.

Mendeteksi intent

Untuk mendeteksi maksud, panggil metode detectIntent pada jenis Sessions.

REST

1. Menyiapkan konten audio

Download file input_audio contoh book-a-room.wav, yang mengucapkan "pesan kamar". File audio harus dienkode base64 untuk contoh ini, sehingga dapat diberikan dalam permintaan JSON di bawah.

Berikut contoh 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

Untuk contoh di platform lain, lihat Menyematkan audio berenkode Base64 dalam dokumentasi Cloud Speech API.

2. Membuat permintaan deteksi maksud

Panggil metode detectIntent pada jenis Sessions dan tentukan audio yang dienkode base64.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • PROJECT_ID: project ID Google Cloud Anda
  • SESSION_ID: ID sesi
  • BASE64_AUDIO: konten base64 dari file output di atas

Metode HTTP dan URL:

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

Meminta isi JSON:

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

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan melihat respons JSON seperti berikut:

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

Perhatikan bahwa nilai kolom queryResult.action adalah room.reservation dan kolom outputAudio berisi string audio base64 yang besar.

3. Memutar audio output

Salin teks dari kolom outputAudio dan simpan dalam file bernama output_audio.b64. File ini perlu dikonversi menjadi audio.

Berikut contoh Linux:

base64 -d output_audio.b64 > output_audio.wav

Untuk contoh di platform lain, lihat Mendekode Konten Audio Berenkode Base64 dalam dokumentasi API text-to-speech.

Sekarang Anda dapat memutar file audio output_audio.wav dan mendengar bahwa file tersebut cocok dengan teks dari kolom queryResult.fulfillmentMessages[1].text.text[0] di atas. Elemen fulfillmentMessages kedua dipilih karena merupakan respons teks untuk platform default.

Java

Untuk melakukan autentikasi ke Dialogflow CX, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


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

Untuk melakukan autentikasi ke Dialogflow CX, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Untuk melakukan autentikasi ke Dialogflow CX, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Untuk mengetahui informasi selengkapnya tentang kolom respons yang relevan, lihat bagian Respons deteksi maksud.

Respons deteksi maksud

Respons untuk permintaan deteksi maksud adalah jenis DetectIntentResponse.

Pemrosesan maksud deteksi normal mengontrol konten kolom DetectIntentResponse.queryResult.fulfillmentMessages.

Kolom DetectIntentResponse.outputAudio diisi dengan audio berdasarkan nilai respons teks platform default yang ditemukan di kolom DetectIntentResponse.queryResult.fulfillmentMessages:

  • Jika ada beberapa respons teks default, respons tersebut akan digabungkan saat membuat audio.
  • Jika tidak ada respons teks platform default, konten audio yang dihasilkan akan kosong.

Kolom DetectIntentResponse.outputAudioConfig diisi dengan setelan audio yang digunakan untuk menghasilkan audio output.

Mendeteksi intent dari stream

Saat mendeteksi maksud dari aliran, Anda mengirim permintaan yang mirip dengan contoh yang tidak menggunakan output audio: Mendeteksi Maksud dari Aliran. Namun, Anda memberikan kolom OutputAudioConfig ke permintaan. Kolom output_audio dan output_audio_config diisi dalam respons streaming akhir yang Anda dapatkan dari server Dialogflow API. Untuk mengetahui informasi selengkapnya, lihat StreamingDetectIntentRequest dan StreamingDetectIntentResponse.

Setelan agen untuk ucapan

Anda dapat mengontrol berbagai aspek sintesis ucapan. Lihat Setelan ucapan agen.

Menggunakan simulator Dialogflow

Anda dapat berinteraksi dengan agen dan menerima respons audio menggunakan simulator Dialogflow:

  1. Aktifkan text-to-speech otomatis dengan mengikuti petunjuk di Setelan ucapan agen.
  2. Ketik atau ucapkan "book a room" di simulator.
  3. Lihat bagian output audio di simulator.