음성 응답으로 인텐트 감지

애플리케이션에 따라 사용자에게 응답하는 봇이 필요한 경우가 많습니다. Dialogflow는 DeepMind WaveNet으로 구동되는 Cloud Text-to-Speech를 사용하여 에이전트에서 음성 응답을 생성할 수 있습니다. 다음은 인텐트를 감지할 때 입력 및 출력 모두에 음성을 사용하는 예입니다. 이 사용 사례는 전적으로 음성 인터페이스로만 사용자와 통신하는 앱을 개발할 때 일반적입니다.

지원되는 언어 목록은 언어 페이지에서 TTS 열을 참조하세요.

GCP 프로젝트 및 인증 설정

에이전트 만들기

에이전트로 예제 파일 가져오기

가져오기를 수행하면 에이전트에 인텐트와 항목이 추가됩니다. 기존 인텐트 또는 항목이 가져온 파일에 있는 인텐트 또는 항목과 이름이 같으면 대체됩니다.

파일을 가져오려면 다음 단계를 따르세요.

  1. RoomReservation.zip 파일을 다운로드합니다.
  2. Dialogflow 콘솔로 이동합니다.
  3. 에이전트를 선택합니다.
  4. 에이전트 이름 옆의 설정 버튼을 클릭합니다.
  5. 내보내기 및 가져오기 탭을 선택합니다.
  6. ZIP 파일에서 가져오기를 선택하고 다운로드한 ZIP 파일을 가져옵니다.

인텐트 감지

REST 및 CMD LINE

1. 오디오 콘텐츠 준비

'book a room'이라고 말하는 샘플 input_audio 파일을 다운로드합니다. 이 예에서 오디오 파일은 base64로 인코딩되어야 하므로 아래의 JSON 요청으로 오디오 파일을 제공할 수 있습니다. 다음은 Linux 예입니다.

base64 -w 0 book_a_room.wav > book_a_room.b64

다른 플랫폼의 예는 Cloud Speech API 문서의 Base64 인코딩 오디오 삽입을 참조하세요.

2. 인텐트 감지 요청하기

detectIntent 메소드를 호출하고 base64 인코딩 오디오를 지정합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: GCP 프로젝트 ID
  • base64-audio: 위에서 생성된 출력 파일의 base64 콘텐츠

HTTP 메소드 및 URL:

POST https://dialogflow.googleapis.com/v2/projects/project-id/agent/sessions/123456789:detectIntent

JSON 요청 본문:

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

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "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?"
          ]
        },
        "platform": "FACEBOOK"
      },
      {
        "text": {
          "text": [
            "I can help with that. Where would you like to reserve a room?"
          ]
        }
      }
    ],
    "outputContexts": [
      {
        "name": "projects/project-id/agent/sessions/123456789/contexts/e8f6a63e-73da-4a1a-8bfc-857183f71228_id_dialog_context",
        "lifespanCount": 2,
        "parameters": {
          "time.original": "",
          "time": "",
          "duration.original": "",
          "date": "",
          "guests.original": "",
          "location.original": "",
          "duration": "",
          "guests": "",
          "location": "",
          "date.original": ""
        }
      },
      {
        "name": "projects/project-id/agent/sessions/123456789/contexts/room_reservation_dialog_params_location",
        "lifespanCount": 1,
        "parameters": {
          "date.original": "",
          "time.original": "",
          "time": "",
          "duration.original": "",
          "date": "",
          "guests": "",
          "duration": "",
          "location.original": "",
          "guests.original": "",
          "location": ""
        }
      },
      {
        "name": "projects/project-id/agent/sessions/123456789/contexts/room_reservation_dialog_context",
        "lifespanCount": 2,
        "parameters": {
          "date.original": "",
          "time.original": "",
          "time": "",
          "duration.original": "",
          "date": "",
          "guests.original": "",
          "guests": "",
          "duration": "",
          "location.original": "",
          "location": ""
        }
      }
    ],
    "intent": {
      "name": "projects/project-id/agent/intents/e8f6a63e-73da-4a1a-8bfc-857183f71228",
      "displayName": "room.reservation"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en-us"
  },
  "outputAudio": "UklGRs6vAgBXQVZFZm10IBAAAAABAAEAwF0AAIC7AA..."
}

queryResult.action 필드의 값은 room.reservation이고 outputAudio 필드에는 긴 base64 오디오 문자열이 포함되어 있습니다.

3. 출력 오디오 재생

outputAudio 필드에서 텍스트를 복사하여 output_audio.b64라는 파일에 저장합니다. 이 파일을 오디오로 변환해야 합니다. 다음은 Linux 예입니다.

base64 -d output_audio.b64 > output_audio.wav

다른 플랫폼의 예는 TTS(텍스트 음성 변환) API 문서에서 Base64 인코딩 오디오 콘텐츠 디코딩을 참조하세요.

이제 output_audio.wav 오디오 파일을 재생하고 위의 queryResult.fulfillmentMessages[1].text.text[0] 필드에 있는 텍스트와 일치하는 음성을 들을 수 있습니다. 기본 플랫폼의 텍스트 응답인 두 번째 fulfillmentMessages 요소가 선택됩니다.

자바

/**
 * Returns the result of detect intent with texts as inputs.
 *
 * <p>Using the same `session_id` between requests allows continuation of the conversation.
 *
 * @param projectId    Project/Agent Id.
 * @param texts        The text intents to be detected based on what a user says.
 * @param sessionId    Identifier of the DetectIntent session.
 * @param languageCode Language code of the query.
 * @return The QueryResult for each input text.
 */
public static Map<String, QueryResult> detectIntentWithTexttoSpeech(
    String projectId,
    List<String> texts,
    String sessionId,
    String languageCode) throws Exception {
  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
      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.getFulfillmentText());

      queryResults.put(text, queryResult);
    }
  }
  return queryResults;
}

Node.js

// Imports the Dialogflow client library
const dialogflow = require('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.sessionPath(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

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."""
    import dialogflow_v2 as 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.types.TextInput(
            text=text, language_code=language_code)

        query_input = dialogflow.types.QueryInput(text=text_input)

        # Set the query parameters with sentiment analysis
        output_audio_config = dialogflow.types.OutputAudioConfig(
            audio_encoding=dialogflow.enums.OutputAudioEncoding
            .OUTPUT_AUDIO_ENCODING_LINEAR_16)

        response = session_client.detect_intent(
            session=session_path, query_input=query_input,
            output_audio_config=output_audio_config)

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

관련 응답 필드의 설명은 인텐트 감지 요청 섹션을 참조하세요.

인텐트 감지 요청

인텐트 감지 요청의 응답은 DetectIntentResponse 객체입니다.

일반적인 인텐트 감지 처리는 DetectIntentResponse.queryResult.fulfillmentMessages 필드의 콘텐츠를 제어합니다.

DetectIntentResponse.outputAudio 필드는 DetectIntentResponse.queryResult.fulfillmentMessages 필드에서 검색된 기본 플랫폼 텍스트 응답 값에 기반한 오디오로 채워집니다. 기본 텍스트 응답이 여러 개 존재하는 경우 오디오 생성 시 서로 연결됩니다. 기본 플랫폼 텍스트 응답이 존재하지 않으면 생성된 오디오 콘텐츠가 비게 됩니다.

DetectIntentResponse.outputAudioConfig 필드는 출력 오디오를 생성하는 데 사용되는 오디오 설정으로 채워집니다.

스트림의 인텐트 감지

스트림의 인텐트를 감지할 때 출력 오디오를 사용하지 않는 예제(스트림에서 인텐트 감지)와 유사한 요청을 보내게 됩니다. 하지만 OutputAudioConfig 필드를 요청에 제공합니다. output_audiooutput_audio_config 필드는 Dialogflow API 서버에서 가져오는 마지막 스트리밍 응답에서 채워집니다. 자세한 내용은 StreamingDetectIntentRequestStreamingDetectIntentResponse를 참조하세요.

음성의 에이전트 설정

TTS(텍스트 음성 변환) 및 음성 구성을 위한 에이전트 설정은 다음과 같습니다.

  • TTS(텍스트 음성 변환):
    • 자동 TTS(텍스트 음성 변환) 사용: 위의 예에서는 출력 오디오를 트리거하기 위해 outputAudioConfig 필드를 제공했습니다. 모든 인텐트 감지 요청에 오디오 출력을 사용하려면 이 설정을 사용하세요.
    • 출력 오디오 인코딩: 자동 TTS(텍스트 음성 변환)가 사용 설정되어 있으면 원하는 출력 오디오 인코딩을 선택합니다.
  • 에이전트 음성 구성:
    • 음성: 음성 생성 모델을 선택합니다.
    • 말하기 속도: 음성의 말하기 속도를 조정합니다.
    • 높낮이: 목소리의 높낮이를 조정합니다.
    • 볼륨 게인: 오디오의 볼륨 게인을 조정합니다.
    • 오디오 효과 프로필: 합성된 음성에 적용할 오디오 효과 프로필을 선택합니다. 음성 오디오는 선택한 프로필(예: 헤드폰, 대형 스피커, 전화 통화)과 연결된 기기에 최적화되어 있습니다. 자세한 내용은 TTS(텍스트 음성 변환)의 오디오 프로필 문서를 참조하세요.

음성의 에이전트 설정에 액세스하려면 다음 단계를 따르세요.

  1. Dialogflow 콘솔로 이동합니다.
  2. 에이전트를 선택합니다.
  3. 에이전트 이름 옆의 톱니바퀴 아이콘 설정을 클릭합니다.
  4. 음성 탭을 선택합니다.

Dialogflow 시뮬레이터 사용

Dialogflow 시뮬레이터를 통해 에이전트와 상호작용하고 오디오 응답을 받을 수 있습니다.

  1. 위의 단계에 따라 자동 TTS(텍스트 음성 변환)를 사용 설정합니다.
  2. 시뮬레이터에 'book a room'을 입력하거나 말합니다.
  3. 시뮬레이터 하단의 출력 오디오 섹션을 참조합니다.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Dialogflow 문서
도움이 필요하시나요? 지원 페이지를 방문하세요.