Mendeteksi intent dengan output audio

Aplikasi sering kali memerlukan bot untuk berbicara kembali kepada pengguna akhir. Dialogflow dapat 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 dikenal sebagai output audio, sintesis ucapan, text-to-speech, atau TTS.

Panduan ini memberikan contoh yang menggunakan audio untuk input dan output saat mendeteksi intent. Kasus penggunaan ini umum terjadi saat mengembangkan aplikasi yang berkomunikasi dengan pengguna melalui 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 menggunakan integrasi, Anda dapat melewati panduan ini.

Anda harus melakukan hal berikut sebelum membaca panduan ini:

  1. Baca Dasar-dasar Dialogflow.
  2. Lakukan langkah-langkah penyiapan.

Membuat agen

Jika Anda belum membuat agen, buat sekarang:

  1. Buka konsol Dialogflow ES.
  2. Jika diminta, login ke Konsol Dialogflow. Lihat Ringkasan konsol Dialogflow untuk informasi selengkapnya.
  3. Klik Buat Agen di menu sidebar kiri. (Jika Anda sudah memiliki agen lain, klik nama agen, scroll ke bawah, lalu klik Buat agen baru.)
  4. Masukkan nama agen, bahasa default, dan zona waktu default Anda.
  5. Jika Anda telah membuat project, masukkan project tersebut. Jika Anda ingin mengizinkan Dialogflow Console membuat project, pilih Create a new Google project.
  6. Klik tombol Buat.

Mengimpor file contoh ke agen Anda

Langkah-langkah dalam panduan ini membuat asumsi tentang agen Anda, sehingga Anda perlu import agen yang disiapkan untuk panduan ini. Saat mengimpor, langkah-langkah ini menggunakan opsi restore, yang menimpa semua setelan, intent, dan entity agen.

Untuk mengimpor file, ikuti langkah-langkah berikut:

  1. Download file room-booking-agent.zip.
  2. Buka konsol Dialogflow ES.
  3. Pilih agen Anda.
  4. Klik tombol setelan di samping nama agen.
  5. Pilih tab Ekspor dan Impor.
  6. Pilih Pulihkan Dari Zip dan ikuti petunjuk untuk memulihkan file zip yang Anda download.

Mendeteksi intent

Untuk mendeteksi intent, panggil metode detectIntent pada jenis Sessions.

REST

1. Menyiapkan konten audio

Download contoh file input_audio book-a-room.wav, yang bertuliskan "reservasi kamar". File audio harus dienkode base64 untuk contoh ini, sehingga dapat diberikan dalam permintaan JSON di bawah. Berikut adalah 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 Menyertakan audio yang dienkode Base64 dalam dokumentasi Cloud Speech API.

2. Membuat permintaan deteksi intent

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 adalah contoh Linux:

base64 -d output_audio.b64 > output_audio.wav

Untuk contoh di platform lain, lihat Mendekode Konten Audio yang Dienkode Base64 dalam dokumentasi Text-to-speech API.

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, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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"')

Lihat bagian Mendeteksi respons intent untuk mengetahui deskripsi kolom respons yang relevan.

Mendeteksi respons intent

Respons untuk permintaan intent deteksi adalah jenis DetectIntentResponse.

Pemrosesan intent 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 streaming

Saat mendeteksi intent dari streaming, Anda mengirim permintaan yang mirip dengan contoh yang tidak menggunakan audio output: Mendeteksi Intent dari Streaming. Namun, Anda harus menyediakan kolom OutputAudioConfig ke permintaan. Kolom output_audio dan output_audio_config diisi dalam respons streaming terakhir 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 melalui simulator Dialogflow:

  1. Ikuti langkah-langkah di atas untuk mengaktifkan teks ke ucapan otomatis.
  2. Ketik atau ucapkan "reservasi kamar" di simulator.
  3. Lihat bagian audio output di bagian bawah simulator.