Detect intent

There are basic samples that show how to detect intent in the quickstart . This guide provides additional samples for advanced scenarios.

Detect intent with audio input

The following samples show how to detect intent with audio input.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. AudioEncoding 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. AudioInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. InputAudioConfig 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryResult 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 com.google.protobuf. ByteString 
 
 ; 
 import 
  
 java.io.FileInputStream 
 ; 
 import 
  
 java.io.IOException 
 ; 
 public 
  
 class 
 DetectIntentAudioInput 
  
 { 
  
 // DialogFlow API Detect Intent sample with Audio input. 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
 /** TODO (developer): replace these values with your own values */ 
  
 String 
  
 projectId 
  
 = 
  
 "my-project-id" 
 ; 
  
 String 
  
 locationId 
  
 = 
  
 "global" 
 ; 
  
 String 
  
 agentId 
  
 = 
  
 "my-agent-id" 
 ; 
  
 String 
  
 audioFileName 
  
 = 
  
 "resources/book_a_room.wav" 
 ; 
  
 int 
  
 sampleRateHertz 
  
 = 
  
 16000 
 ; 
  
 /* 
 * A session ID is a string of at most 36 bytes in size. 
 * Your system is responsible for generating unique session IDs. 
 * They can be random numbers, hashed end-user identifiers, 
 * or any other values that are convenient for you to generate. 
 */ 
  
 String 
  
 sessionId 
  
 = 
  
 "my-UUID" 
 ; 
  
 String 
  
 languageCode 
  
 = 
  
 "en" 
 ; 
  
 detectIntent 
 ( 
  
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 audioFileName 
 , 
  
 sampleRateHertz 
 , 
  
 sessionId 
 , 
  
 languageCode 
 ); 
  
 } 
  
 public 
  
 static 
  
 void 
  
 detectIntent 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 audioFileName 
 , 
  
 int 
  
 sampleRateHertz 
 , 
  
 String 
  
 sessionId 
 , 
  
 String 
  
 languageCode 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
  ofProjectLocationAgentSessionName 
 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // TODO : Uncomment if you want to print session path 
  
 // System.out.println("Session Path: " + session.toString()); 
  
  InputAudioConfig 
 
  
 inputAudioConfig 
  
 = 
  
  InputAudioConfig 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
  AudioEncoding 
 
 . 
 AUDIO_ENCODING_LINEAR_16 
 ) 
  
 . 
 setSampleRateHertz 
 ( 
 sampleRateHertz 
 ) 
  
 . 
 build 
 (); 
  
 try 
  
 ( 
 FileInputStream 
  
 audioStream 
  
 = 
  
 new 
  
 FileInputStream 
 ( 
 audioFileName 
 )) 
  
 { 
  
 // Subsequent requests must **only** contain the audio data. 
  
 // Following messages: audio chunks. We just read the file in fixed-size chunks. In reality 
  
 // you would split the user input by time. 
  
 byte 
 [] 
  
 buffer 
  
 = 
  
 new 
  
 byte 
 [ 
 4096 
 ] 
 ; 
  
 int 
  
 bytes 
  
 = 
  
 audioStream 
 . 
 read 
 ( 
 buffer 
 ); 
  
  AudioInput 
 
  
 audioInput 
  
 = 
  
  AudioInput 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
  ByteString 
 
 . 
  copyFrom 
 
 ( 
 buffer 
 , 
  
 0 
 , 
  
 bytes 
 )) 
  
 . 
  setConfig 
 
 ( 
 inputAudioConfig 
 ) 
  
 . 
 build 
 (); 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
 audioInput 
 ) 
  
 . 
 setLanguageCode 
 ( 
 "en-US" 
 ) 
  
 // languageCode = "en-US" 
  
 . 
 build 
 (); 
  
  DetectIntentRequest 
 
  
 request 
  
 = 
  
  DetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 build 
 (); 
  
 // Performs the detect intent request. 
  
  DetectIntentResponse 
 
  
 response 
  
 = 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the query result. 
  
  QueryResult 
 
  
 queryResult 
  
 = 
  
 response 
 . 
  getQueryResult 
 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "====================" 
 ); 
  
 System 
 . 
 out 
 . 
 format 
 ( 
  
 "Detected Intent: %s (confidence: %f)\n" 
 , 
  
 queryResult 
 . 
  getTranscript 
 
 (), 
  
 queryResult 
 . 
  getIntentDetectionConfidence 
 
 ()); 
  
 } 
  
 } 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 // const projectId = 'my-project'; 
 // const location = 'global'; 
 // const agentId = 'my-agent'; 
 // const audioFileName = '/path/to/audio.raw'; 
 // const encoding = 'AUDIO_ENCODING_LINEAR_16'; 
 // const sampleRateHertz = 16000; 
 // const languageCode = 'en' 
 // Imports the Google Cloud Some API library 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 const 
  
 client 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 const 
  
 fs 
  
 = 
  
 require 
 ( 
 'fs' 
 ); 
 const 
  
 util 
  
 = 
  
 require 
 ( 
 'util' 
 ); 
 async 
  
 function 
  
 detectIntentAudio 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 const 
  
 sessionPath 
  
 = 
  
 client 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 console 
 . 
 info 
 ( 
 sessionPath 
 ); 
  
 // Read the content of the audio file and send it as part of the request. 
  
 const 
  
 readFile 
  
 = 
  
 util 
 . 
 promisify 
 ( 
 fs 
 . 
 readFile 
 ); 
  
 const 
  
 inputAudio 
  
 = 
  
 await 
  
 readFile 
 ( 
 audioFileName 
 ); 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 audio 
 : 
  
 { 
  
 config 
 : 
  
 { 
  
 audioEncoding 
 : 
  
 encoding 
 , 
  
 sampleRateHertz 
 : 
  
 sampleRateHertz 
 , 
  
 }, 
  
 audio 
 : 
  
 inputAudio 
 , 
  
 }, 
  
 languageCode 
 , 
  
 }, 
  
 }; 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 client 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 console 
 . 
 log 
 ( 
 `User Query: 
 ${ 
 response 
 . 
 queryResult 
 . 
 transcript 
 } 
 ` 
 ); 
  
 for 
  
 ( 
 const 
  
 message 
  
 of 
  
 response 
 . 
 queryResult 
 . 
 responseMessages 
 ) 
  
 { 
  
 if 
  
 ( 
 message 
 . 
 text 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
 `Agent Response: 
 ${ 
 message 
 . 
 text 
 . 
 text 
 } 
 ` 
 ); 
  
 } 
  
 } 
  
 if 
  
 ( 
 response 
 . 
 queryResult 
 . 
 match 
 . 
 intent 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
  
 `Matched Intent: 
 ${ 
 response 
 . 
 queryResult 
 . 
 match 
 . 
 intent 
 . 
 displayName 
 } 
 ` 
  
 ); 
  
 } 
  
 console 
 . 
 log 
 ( 
  
 `Current Page: 
 ${ 
 response 
 . 
 queryResult 
 . 
 currentPage 
 . 
 displayName 
 } 
 ` 
  
 ); 
 } 
 detectIntentAudio 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  def 
  
 run_sample 
 (): 
 # TODO(developer): Replace these values when running the function 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 # For more information about regionalization see https://cloud.google.com/dialogflow/cx/docs/how/region 
 location_id 
 = 
 "YOUR-LOCATION-ID" 
 # For more info on agents see https://cloud.google.com/dialogflow/cx/docs/concept/agent 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 agent 
 = 
 f 
 "projects/ 
 { 
 project_id 
 } 
 /locations/ 
 { 
 location_id 
 } 
 /agents/ 
 { 
 agent_id 
 } 
 " 
 # For more information on sessions see https://cloud.google.com/dialogflow/cx/docs/concept/session 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 audio_file_path 
 = 
 "YOUR-AUDIO-FILE-PATH" 
 # For more supported languages see https://cloud.google.com/dialogflow/es/docs/reference/language 
 language_code 
 = 
 "en-us" 
 detect_intent_audio 
 ( 
 agent 
 , 
 session_id 
 , 
 audio_file_path 
 , 
 language_code 
 ) 
 def 
  
 detect_intent_audio 
 ( 
 agent 
 , 
 session_id 
 , 
 audio_file_path 
 , 
 language_code 
 ): 
  
 """Returns the result of detect intent with an audio file as input. 
 Using the same `session_id` between requests allows continuation 
 of the conversation.""" 
 session_path 
 = 
 f 
 " 
 { 
 agent 
 } 
 /sessions/ 
 { 
 session_id 
 } 
 " 
 print 
 ( 
 f 
 "Session path: 
 { 
 session_path 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 None 
 agent_components 
 = 
 AgentsClient 
 . 
 parse_agent_path 
 ( 
 agent 
 ) 
 location_id 
 = 
 agent_components 
 [ 
 "location" 
 ] 
 if 
 location_id 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location_id 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 input_audio_config 
 = 
 audio_config 
 . 
 InputAudioConfig 
 ( 
 audio_encoding 
 = 
 audio_config 
 . 
 AudioEncoding 
 . 
 AUDIO_ENCODING_LINEAR_16 
 , 
 sample_rate_hertz 
 = 
 24000 
 , 
 ) 
 with 
 open 
 ( 
 audio_file_path 
 , 
 "rb" 
 ) 
 as 
 audio_file 
 : 
 input_audio 
 = 
 audio_file 
 . 
 read 
 () 
 audio_input 
 = 
 session 
 . 
 AudioInput 
 ( 
 config 
 = 
 input_audio_config 
 , 
 audio 
 = 
 input_audio 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 audio 
 = 
 audio_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 request 
 = 
 session 
 . 
 DetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 ) 
 response 
 = 
 session_client 
 . 
 detect_intent 
 ( 
 request 
 = 
 request 
 ) 
 print 
 ( 
 "=" 
 * 
 20 
 ) 
 print 
 ( 
 f 
 "Query text: 
 { 
 response 
 . 
 query_result 
 . 
 transcript 
 } 
 " 
 ) 
 response_messages 
 = 
 [ 
 " " 
 . 
 join 
 ( 
 msg 
 . 
 text 
 . 
 text 
 ) 
 for 
 msg 
 in 
 response 
 . 
 query_result 
 . 
 response_messages 
 ] 
 print 
 ( 
 f 
 "Response text: 
 { 
 ' ' 
 . 
 join 
 ( 
 response_messages 
 ) 
 } 
 \n 
 " 
 ) 
 

Detect intent with event invocation

The following samples show how to detect intent with event invocation.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. EventInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryResult 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 java.io.IOException 
 ; 
 public 
  
 class 
 DetectIntentEventInput 
  
 { 
  
 // DialogFlow API Detect Intent sample with Event input. 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
 String 
  
 projectId 
  
 = 
  
 "my-project-id" 
 ; 
  
 String 
  
 locationId 
  
 = 
  
 "global" 
 ; 
  
 String 
  
 agentId 
  
 = 
  
 "my-agent-id" 
 ; 
  
 String 
  
 sessionId 
  
 = 
  
 "my-UUID" 
 ; 
  
 String 
  
 event 
  
 = 
  
 "my-event-id" 
 ; 
  
 String 
  
 languageCode 
  
 = 
  
 "en" 
 ; 
  
 detectIntent 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 , 
  
 event 
 , 
  
 languageCode 
 ); 
  
 } 
  
 public 
  
 static 
  
 void 
  
 detectIntent 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 sessionId 
 , 
  
 String 
  
 event 
 , 
  
 String 
  
 languageCode 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
  ofProjectLocationAgentSessionName 
 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // TODO : Uncomment if you want to print session path 
  
 // System.out.println("Session Path: " + session.toString()); 
  
  EventInput 
 
 . 
 Builder 
  
 eventInput 
  
 = 
  
  EventInput 
 
 . 
 newBuilder 
 (). 
 setEvent 
 ( 
 event 
 ); 
  
 // Build the query with the EventInput and language code (en-US). 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 (). 
 setEvent 
 ( 
 eventInput 
 ). 
 setLanguageCode 
 ( 
 languageCode 
 ). 
 build 
 (); 
  
 // Build the DetectIntentRequest with the SessionName and QueryInput. 
  
  DetectIntentRequest 
 
  
 request 
  
 = 
  
  DetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 build 
 (); 
  
 // Performs the detect intent request. 
  
  DetectIntentResponse 
 
  
 response 
  
 = 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the query result. 
  
  QueryResult 
 
  
 queryResult 
  
 = 
  
 response 
 . 
  getQueryResult 
 
 (); 
  
 // TODO : Uncomment if you want to print queryResult 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "====================" 
 ); 
  
 System 
 . 
 out 
 . 
 format 
 ( 
 "Triggering Event: %s \n" 
 , 
  
 queryResult 
 . 
  getTriggerEvent 
 
 ()); 
  
 } 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 /** 
 *  Required. The name of the session this query is sent to. 
 *  Format: `projects/<Project ID>/locations/<Location ID>/agents/<Agent 
 *  ID>/sessions/<Session ID>` or `projects/<Project ID>/locations/<Location 
 *  ID>/agents/<Agent ID>/environments/<Environment ID>/sessions/<Session ID>`. 
 *  If `Environment ID` is not specified, we assume default 'draft' 
 *  environment. 
 *  It's up to the API caller to choose an appropriate `Session ID`. It can be 
 *  a random number or some type of session identifiers (preferably hashed). 
 *  The length of the `Session ID` must not exceed 36 characters. 
 *  For more information, see the sessions 
 *  guide (https://cloud.google.com/dialogflow/cx/docs/concept/session). 
 *  Note: Always use agent versions for production traffic. 
 *  See Versions and 
 *  environments (https://cloud.google.com/dialogflow/cx/docs/concept/version). 
 */ 
 /** 
 * Optional. The parameters of this query. 
 */ 
 // const queryParams = {} 
 /** 
 *  Required. The input specification. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3beta1/ConversationTurn#QueryInput for information about query inputs. 
 */ 
 // const event = 'name-of-event-to-trigger'; 
 // Imports the Cx library 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 // Instantiates a client 
 const 
  
 cxClient 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 async 
  
 function 
  
 detectIntentWithEventInput 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 const 
  
 sessionPath 
  
 = 
  
 cxClient 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 // Construct detect intent request 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 event 
 : 
  
 { 
  
 event 
 : 
  
 event 
 , 
  
 }, 
  
 languageCode 
 , 
  
 }, 
  
 }; 
  
 // Send request and receive response 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 cxClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 console 
 . 
 log 
 ( 
 `Event Name: 
 ${ 
 event 
 } 
 ` 
 ); 
  
 // Response message from the triggered event 
  
 console 
 . 
 log 
 ( 
 'Agent Response: \n' 
 ); 
  
 console 
 . 
 log 
 ( 
 response 
 . 
 queryResult 
 . 
 responseMessages 
 [ 
 0 
 ]. 
 text 
 . 
 text 
 [ 
 0 
 ]); 
 } 
 detectIntentWithEventInput 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 uuid 
 from 
  
 google.cloud.dialogflowcx_v3.services.sessions 
  
 import 
 SessionsClient 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 session 
 def 
  
 run_sample 
 (): 
 # TODO(developer): Update these values when running the function 
 # project_id = "YOUR-PROJECT-ID" 
 # location = "YOUR-LOCATION-ID" 
 # agent_id = "YOUR-AGENT-ID" 
 # event = "YOUR-EVENT" 
 # language_code = "YOUR-LANGUAGE-CODE" 
 project_id 
 = 
 "dialogflow-cx-demo-1-348717" 
 location 
 = 
 "global" 
 agent_id 
 = 
 "8caa6b47-5dd7-4380-b86e-ea4301d565b0" 
 event 
 = 
 "sys.no-match-default" 
 language_code 
 = 
 "en-us" 
 detect_intent_with_event_input 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 event 
 , 
 language_code 
 , 
 ) 
 def 
  
 detect_intent_with_event_input 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 event 
 , 
 language_code 
 , 
 ): 
  
 """Detects intent using EventInput""" 
 client_options 
 = 
 None 
 if 
 location 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 session_path 
 = 
 session_client 
 . 
 session_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 session 
 = 
 session_id 
 , 
 ) 
 # Construct detect intent request: 
 event 
 = 
 session 
 . 
 EventInput 
 ( 
 event 
 = 
 event 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 event 
 = 
 event 
 , 
 language_code 
 = 
 language_code 
 ) 
 request 
 = 
 session 
 . 
 DetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 ) 
 response 
 = 
 session_client 
 . 
 detect_intent 
 ( 
 request 
 = 
 request 
 ) 
 response_text 
 = 
 response 
 . 
 query_result 
 . 
 response_messages 
 [ 
 0 
 ] 
 . 
 text 
 . 
 text 
 [ 
 0 
 ] 
 print 
 ( 
 f 
 "Response: 
 { 
 response_text 
 } 
 " 
 ) 
 return 
 response_text 
 

Detect intent with caller-triggered intent match

The following samples show how to detect intent with a caller-triggered intent match.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. IntentInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryResult 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 java.io.IOException 
 ; 
 public 
  
 class 
 DetectIntentIntentInput 
  
 { 
  
 // DialogFlow API Detect Intent sample with Intent input. 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
 String 
  
 projectId 
  
 = 
  
 "my-project-id" 
 ; 
  
 String 
  
 locationId 
  
 = 
  
 "global" 
 ; 
  
 String 
  
 agentId 
  
 = 
  
 "my-agent-id" 
 ; 
  
 String 
  
 sessionId 
  
 = 
  
 "my-UUID" 
 ; 
  
 String 
  
 intent 
  
 = 
  
 "my-intent-id" 
 ; 
  
 String 
  
 languageCode 
  
 = 
  
 "en" 
 ; 
  
 detectIntent 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 , 
  
 intent 
 , 
  
 languageCode 
 ); 
  
 } 
  
 public 
  
 static 
  
 void 
  
 detectIntent 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 sessionId 
 , 
  
 String 
  
 intent 
 , 
  
 String 
  
 languageCode 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
  ofProjectLocationAgentSessionName 
 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // TODO : Uncomment if you want to print session path 
  
 // System.out.println("Session Path: " + session.toString()); 
  
  IntentInput 
 
 . 
 Builder 
  
 intentInput 
  
 = 
  
  IntentInput 
 
 . 
 newBuilder 
 (). 
 setIntent 
 ( 
 intent 
 ); 
  
 // Build the query with the IntentInput and language code (en-US). 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 (). 
 setIntent 
 ( 
 intentInput 
 ). 
 setLanguageCode 
 ( 
 languageCode 
 ). 
 build 
 (); 
  
 // Build the DetectIntentRequest with the SessionName and QueryInput. 
  
  DetectIntentRequest 
 
  
 request 
  
 = 
  
  DetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 build 
 (); 
  
 // Performs the detect intent request. 
  
  DetectIntentResponse 
 
  
 response 
  
 = 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the query result. 
  
  QueryResult 
 
  
 queryResult 
  
 = 
  
 response 
 . 
  getQueryResult 
 
 (); 
  
 // TODO : Uncomment if you want to print queryResult 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "====================" 
 ); 
  
 System 
 . 
 out 
 . 
 format 
 ( 
  
 "Detected Intent: %s (confidence: %f)\n" 
 , 
  
 queryResult 
 . 
  getIntent 
 
 (). 
 getDisplayName 
 (), 
  
 queryResult 
 . 
  getIntentDetectionConfidence 
 
 ()); 
  
 } 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 /** 
 * const projectId = 'your-project-id'; 
 * const location = 'location'; 
 * const agentId = 'your-agent-id'; 
 * const languageCode = 'your-language-code'; 
 */ 
 /** 
 * The input specification. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3beta1/ConversationTurn#QueryInput for information about query inputs. 
 */ 
 // const intentId = 'unique-identifier-of-the-intent-to-trigger'; 
 // Imports the Cx library 
 const 
  
 { 
  
 SessionsClient 
 , 
  
 IntentsClient 
 , 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 // Instantiates a Sessions client 
 const 
  
 sessionsClient 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 // Instantiates an Intents client 
 const 
  
 intentsClient 
  
 = 
  
 new 
  
  IntentsClient 
 
 (); 
 async 
  
 function 
  
 detectIntentWithIntentInput 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 // Creates session path 
  
 const 
  
 sessionPath 
  
 = 
  
 sessionsClient 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 // Creates intent path. Format: projects/<Project ID>/locations/<Location ID>/agents/<Agent ID>/intents/<Intent ID> 
  
 const 
  
 intentPath 
  
 = 
  
 intentsClient 
 . 
 intentPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 intentId 
  
 ); 
  
 // Construct detectIntent request 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 intent 
 : 
  
 { 
  
 intent 
 : 
  
 intentPath 
 , 
  
 }, 
  
 languageCode 
 , 
  
 }, 
  
 }; 
  
 // Send request and receive response 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the name of the detected intent 
  
 console 
 . 
 log 
 ( 
 'Intent Name: \n' 
 ); 
  
 console 
 . 
 log 
 ( 
 response 
 . 
 queryResult 
 . 
 intent 
 . 
 displayName 
 ); 
  
 // Agent responds with fulfillment message of the detected intent 
  
 console 
 . 
 log 
 ( 
 'Agent Response: \n' 
 ); 
  
 console 
 . 
 log 
 ( 
 response 
 . 
 queryResult 
 . 
 responseMessages 
 [ 
 0 
 ]. 
 text 
 . 
 text 
 [ 
 0 
 ]); 
 } 
 detectIntentWithIntentInput 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 uuid 
 from 
  
 google.cloud.dialogflowcx_v3.services.intents 
  
 import 
 IntentsClient 
 from 
  
 google.cloud.dialogflowcx_v3.services.sessions 
  
 import 
 SessionsClient 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 session 
 def 
  
 run_sample 
 (): 
 # TODO(developer): Update these values when running the function 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 location 
 = 
 "YOUR-LOCATION-ID" 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 intent_id 
 = 
 "YOUR-INTENT-ID" 
 language_code 
 = 
 "en-us" 
 detect_intent_with_intent_input 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 intent_id 
 , 
 language_code 
 , 
 ) 
 def 
  
 detect_intent_with_intent_input 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 intent_id 
 , 
 language_code 
 , 
 ): 
  
 """Returns the result of detect intent with sentiment analysis""" 
 client_options 
 = 
 None 
 if 
 location 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 intents_client 
 = 
 IntentsClient 
 () 
 session_path 
 = 
 session_client 
 . 
 session_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 session 
 = 
 session_id 
 , 
 ) 
 intent_path 
 = 
 intents_client 
 . 
 intent_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 intent 
 = 
 intent_id 
 , 
 ) 
 intent 
 = 
 session 
 . 
 IntentInput 
 ( 
 intent 
 = 
 intent_path 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 intent 
 = 
 intent 
 , 
 language_code 
 = 
 language_code 
 ) 
 request 
 = 
 session 
 . 
 DetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 ) 
 response 
 = 
 session_client 
 . 
 detect_intent 
 ( 
 request 
 = 
 request 
 ) 
 response_text 
 = 
 [] 
 for 
 response_message 
 in 
 response 
 . 
 query_result 
 . 
 response_messages 
 : 
 response_text 
 . 
 append 
 ( 
 response_message 
 . 
 text 
 . 
 text 
 ) 
 print 
 ( 
 response_message 
 . 
 text 
 . 
 text 
 ) 
 return 
 response_text 
 

Detect intent with sentiment analysis enabled

The following samples show how to detect intent with sentiment analysis enabled.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryParameters 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryResult 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. TextInput 
 
 ; 
 import 
  
 com.google.common.collect.Maps 
 ; 
 import 
  
 java.io.IOException 
 ; 
 import 
  
 java.util.ArrayList 
 ; 
 import 
  
 java.util.List 
 ; 
 import 
  
 java.util.Map 
 ; 
 public 
  
 class 
 DetectIntentSentimentAnalysis 
  
 { 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
 String 
  
 projectId 
  
 = 
  
 "my-project-id" 
 ; 
  
 String 
  
 locationId 
  
 = 
  
 "global" 
 ; 
  
 String 
  
 agentId 
  
 = 
  
 "my-agent-id" 
 ; 
  
 String 
  
 sessionId 
  
 = 
  
 "my-UUID" 
 ; 
  
 List<String> 
  
 texts 
  
 = 
  
 new 
  
 ArrayList 
<> ( 
 List 
 . 
 of 
 ( 
 "my-list" 
 , 
  
 "of-texts" 
 )); 
  
 String 
  
 languageCode 
  
 = 
  
 "en" 
 ; 
  
 detectIntent 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 , 
  
 texts 
 , 
  
 languageCode 
 ); 
  
 } 
  
 // DialogFlow API Detect Intent sample with sentiment analysis. 
  
 public 
  
 static 
  
 Map<String 
 , 
  
 QueryResult 
>  
 detectIntent 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 sessionId 
 , 
  
 List<String> 
  
 texts 
 , 
  
 String 
  
 languageCode 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 Map<String 
 , 
  
 QueryResult 
>  
 queryResults 
  
 = 
  
 Maps 
 . 
 newHashMap 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
  ofProjectLocationAgentSessionName 
 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // TODO : Uncomment if you want to print session path 
  
 // System.out.println("Session Path: " + session.toString()); 
  
 // Detect intents for each text input. 
  
 for 
  
 ( 
 String 
  
 text 
  
 : 
  
 texts 
 ) 
  
 { 
  
 // Set the text (hello) for the query. 
  
  TextInput 
 
 . 
 Builder 
  
 textInput 
  
 = 
  
  TextInput 
 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 text 
 ); 
  
 // Build the query with the TextInput and language code (en-US). 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 textInput 
 ). 
 setLanguageCode 
 ( 
 languageCode 
 ). 
 build 
 (); 
  
 // Build the query parameters to analyze the sentiment of the query. 
  
  QueryParameters 
 
  
 queryParameters 
  
 = 
  
  QueryParameters 
 
 . 
 newBuilder 
 (). 
  setAnalyzeQueryTextSentiment 
 
 ( 
 true 
 ). 
 build 
 (); 
  
 // Build the DetectIntentRequest with the SessionName, QueryInput, and QueryParameters. 
  
  DetectIntentRequest 
 
  
 request 
  
 = 
  
  DetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 setQueryParams 
 ( 
 queryParameters 
 ) 
  
 . 
 build 
 (); 
  
 // Performs the detect intent request. 
  
  DetectIntentResponse 
 
  
 response 
  
 = 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the query result. 
  
  QueryResult 
 
  
 queryResult 
  
 = 
  
 response 
 . 
  getQueryResult 
 
 (); 
  
 // TODO : Uncomment if you want to print queryResult 
  
 // System.out.println("===================="); 
  
 // SentimentAnalysisResult sentimentAnalysisResult = 
  
 //     queryResult.getSentimentAnalysisResult(); 
  
 // Float score = sentimentAnalysisResult.getScore(); 
  
 queryResults 
 . 
 put 
 ( 
 text 
 , 
  
 queryResult 
 ); 
  
 } 
  
 } 
  
 return 
  
 queryResults 
 ; 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 /** 
 *  Required. The name of the session this query is sent to. 
 *  Format: `projects/<Project ID>/locations/<Location ID>/agents/<Agent 
 *  ID>/sessions/<Session ID>` or `projects/<Project ID>/locations/<Location 
 *  ID>/agents/<Agent ID>/environments/<Environment ID>/sessions/<Session ID>`. 
 *  If `Environment ID` is not specified, we assume default 'draft' 
 *  environment. 
 *  It's up to the API caller to choose an appropriate `Session ID`. It can be 
 *  a random number or some type of session identifiers (preferably hashed). 
 *  The length of the `Session ID` must not exceed 36 characters. 
 *  For more information, see the sessions 
 *  guide (https://cloud.google.com/dialogflow/cx/docs/concept/session). 
 *  Note: Always use agent versions for production traffic. 
 *  See Versions and 
 *  environments (https://cloud.google.com/dialogflow/cx/docs/concept/version). 
 */ 
 /** 
 * Optional. The parameters of this query. 
 */ 
 // const queryParams = {} 
 /** 
 *  Required. The input specification. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3beta1/ConversationTurn#QueryInput for information about query inputs. 
 */ 
 // const text = 'text-of-your-query'; 
 // Imports the Cx library 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 // Instantiates a client 
 const 
  
 cxClient 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 // Configures whether sentiment analysis should be performed. If not provided, sentiment analysis is not performed. 
 const 
  
 analyzeQueryTextSentiment 
  
 = 
  
 true 
 ; 
 async 
  
 function 
  
 detectIntentWithSentimentAnalysis 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 const 
  
 sessionPath 
  
 = 
  
 cxClient 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 // Construct detect intent request 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 text 
 : 
  
 { 
  
 text 
 : 
  
 query 
 , 
  
 }, 
  
 languageCode 
 , 
  
 }, 
  
 queryParams 
 : 
  
 { 
  
 analyzeQueryTextSentiment 
 : 
  
 analyzeQueryTextSentiment 
 , 
  
 }, 
  
 }; 
  
 // Run request 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 cxClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 console 
 . 
 log 
 ( 
 `User Query: 
 ${ 
 query 
 } 
 ` 
 ); 
  
 // Shows result of sentiment analysis (sentimentAnalysisResult) 
  
 const 
  
 sentimentAnalysis 
  
 = 
  
 response 
 . 
 queryResult 
 . 
 sentimentAnalysisResult 
 ; 
  
 // Determines sentiment score of user query 
  
 let 
  
 sentiment 
 ; 
  
 if 
  
 ( 
 sentimentAnalysis 
 . 
 score 
 < 
 0 
 ) 
  
 { 
  
 sentiment 
  
 = 
  
 'negative' 
 ; 
  
 } 
  
 else 
  
 if 
  
 ( 
 sentimentAnalysis 
 . 
 score 
 > 
 0 
 ) 
  
 { 
  
 sentiment 
  
 = 
  
 'positive' 
 ; 
  
 } 
  
 else 
  
 { 
  
 sentiment 
  
 = 
  
 'neutral' 
 ; 
  
 } 
  
 console 
 . 
 log 
 ( 
  
 `User input sentiment has a score of 
 ${ 
 sentimentAnalysis 
 . 
 score 
 } 
 , which indicates 
 ${ 
 sentiment 
 } 
 sentiment.` 
  
 ); 
 } 
 detectIntentWithSentimentAnalysis 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 uuid 
 from 
  
 google.cloud.dialogflowcx_v3beta1.services.sessions 
  
 import 
 SessionsClient 
 from 
  
 google.cloud.dialogflowcx_v3beta1.types 
  
 import 
 session 
 def 
  
 run_sample 
 (): 
 # TODO(developer): Update these values when running the function 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 location 
 = 
 "YOUR-LOCATION-ID" 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 text 
 = 
 "Perfect!" 
 language_code 
 = 
 "en-us" 
 detect_intent_with_sentiment_analysis 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 text 
 , 
 language_code 
 , 
 ) 
 def 
  
 detect_intent_with_sentiment_analysis 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 text 
 , 
 language_code 
 , 
 ): 
  
 """Returns the result of detect intent with sentiment analysis""" 
 client_options 
 = 
 None 
 if 
 location 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 session_path 
 = 
 session_client 
 . 
 session_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 session 
 = 
 session_id 
 , 
 ) 
 text_input 
 = 
 session 
 . 
 TextInput 
 ( 
 text 
 = 
 text 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 text 
 = 
 text_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 query_params 
 = 
 session 
 . 
 QueryParameters 
 ( 
 analyze_query_text_sentiment 
 = 
 True 
 , 
 ) 
 request 
 = 
 session 
 . 
 DetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 query_params 
 = 
 query_params 
 , 
 ) 
 response 
 = 
 session_client 
 . 
 detect_intent 
 ( 
 request 
 = 
 request 
 ) 
 score 
 = 
 response 
 . 
 query_result 
 . 
 sentiment_analysis_result 
 . 
 score 
 print 
 ( 
 "Sentiment Score: 
 {score} 
 " 
 ) 
 return 
 score 
 

Detect intent with text-to-speech response

The following samples show how to detect intent with a text-to-speech response.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. AudioEncoding 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. AudioInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. InputAudioConfig 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. OutputAudioConfig 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. OutputAudioEncoding 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SynthesizeSpeechConfig 
 
 ; 
 import 
  
 com.google.protobuf. ByteString 
 
 ; 
 import 
  
 java.io.FileInputStream 
 ; 
 import 
  
 java.io.IOException 
 ; 
 public 
  
 class 
 DetectIntentSynthesizeTextToSpeechOutput 
  
 { 
  
 // DialogFlow API Detect Intent sample with synthesize TTS output. 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
 String 
  
 projectId 
  
 = 
  
 "my-project-id" 
 ; 
  
 String 
  
 locationId 
  
 = 
  
 "my-location-id" 
 ; 
  
 String 
  
 agentId 
  
 = 
  
 "my-agent-id" 
 ; 
  
 String 
  
 audioFileName 
  
 = 
  
 "my-audio-file-name" 
 ; 
  
 int 
  
 sampleRateHertz 
  
 = 
  
 16000 
 ; 
  
 String 
  
 sessionId 
  
 = 
  
 "my-session-id" 
 ; 
  
 String 
  
 languageCode 
  
 = 
  
 "my-language-code" 
 ; 
  
 detectIntent 
 ( 
  
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 audioFileName 
 , 
  
 sampleRateHertz 
 , 
  
 sessionId 
 , 
  
 languageCode 
 ); 
  
 } 
  
 public 
  
 static 
  
 void 
  
 detectIntent 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 audioFileName 
 , 
  
 int 
  
 sampleRateHertz 
 , 
  
 String 
  
 sessionId 
 , 
  
 String 
  
 languageCode 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
  ofProjectLocationAgentSessionName 
 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // TODO : Uncomment if you want to print session path 
  
 // System.out.println("Session Path: " + session.toString()); 
  
  InputAudioConfig 
 
  
 inputAudioConfig 
  
 = 
  
  InputAudioConfig 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
  AudioEncoding 
 
 . 
 AUDIO_ENCODING_LINEAR_16 
 ) 
  
 . 
 setSampleRateHertz 
 ( 
 sampleRateHertz 
 ) 
  
 . 
 build 
 (); 
  
 try 
  
 ( 
 FileInputStream 
  
 audioStream 
  
 = 
  
 new 
  
 FileInputStream 
 ( 
 audioFileName 
 )) 
  
 { 
  
 // Subsequent requests must **only** contain the audio data. 
  
 // Following messages: audio chunks. We just read the file in fixed-size chunks. In reality 
  
 // you would split the user input by time. 
  
 byte 
 [] 
  
 buffer 
  
 = 
  
 new 
  
 byte 
 [ 
 4096 
 ] 
 ; 
  
 int 
  
 bytes 
  
 = 
  
 audioStream 
 . 
 read 
 ( 
 buffer 
 ); 
  
  AudioInput 
 
  
 audioInput 
  
 = 
  
  AudioInput 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
  ByteString 
 
 . 
  copyFrom 
 
 ( 
 buffer 
 , 
  
 0 
 , 
  
 bytes 
 )) 
  
 . 
  setConfig 
 
 ( 
 inputAudioConfig 
 ) 
  
 . 
 build 
 (); 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
 audioInput 
 ) 
  
 . 
 setLanguageCode 
 ( 
 "en-US" 
 ) 
  
 // languageCode = "en-US" 
  
 . 
 build 
 (); 
  
  SynthesizeSpeechConfig 
 
  
 speechConfig 
  
 = 
  
  SynthesizeSpeechConfig 
 
 . 
 newBuilder 
 (). 
  setSpeakingRate 
 
 ( 
 1.25 
 ). 
  setPitch 
 
 ( 
 10.0 
 ). 
 build 
 (); 
  
  OutputAudioConfig 
 
  
 outputAudioConfig 
  
 = 
  
  OutputAudioConfig 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
  OutputAudioEncoding 
 
 . 
 OUTPUT_AUDIO_ENCODING_LINEAR_16 
 ) 
  
 . 
  setSynthesizeSpeechConfig 
 
 ( 
 speechConfig 
 ) 
  
 . 
 build 
 (); 
  
  DetectIntentRequest 
 
  
 request 
  
 = 
  
  DetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 setOutputAudioConfig 
 ( 
 outputAudioConfig 
 ) 
  
 . 
 build 
 (); 
  
 // Performs the detect intent request. 
  
  DetectIntentResponse 
 
  
 response 
  
 = 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the output audio config retrieved from the response. 
  
  OutputAudioConfig 
 
  
 audioConfigFromResponse 
  
 = 
  
 response 
 . 
  getOutputAudioConfig 
 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "====================" 
 ); 
  
 System 
 . 
 out 
 . 
 format 
 ( 
 "Output Audio Config: %s \n" 
 , 
  
 audioConfigFromResponse 
 . 
 toString 
 ()); 
  
 } 
  
 } 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  // Imports the Cx library 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * 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`; 
 // Instantiates a Sessions client 
 const 
  
 sessionsClient 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 // Define session path 
 const 
  
 sessionPath 
  
 = 
  
 sessionsClient 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
 const 
  
 fs 
  
 = 
  
 require 
 ( 
 'fs' 
 ); 
 const 
  
 util 
  
 = 
  
 require 
 ( 
 'util' 
 ); 
 async 
  
 function 
  
 detectIntentSynthesizeTTSResponse 
 () 
  
 { 
  
 // Configuration of how speech should be synthesized. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3/OutputAudioConfig#SynthesizeSpeechConfig 
  
 const 
  
 synthesizeSpeechConfig 
  
 = 
  
 { 
  
 speakingRate 
 : 
  
 1.25 
 , 
  
 pitch 
 : 
  
 10.0 
 , 
  
 }; 
  
 // Constructs the audio query request 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 text 
 : 
  
 { 
  
 text 
 : 
  
 query 
 , 
  
 }, 
  
 languageCode 
 : 
  
 languageCode 
 , 
  
 }, 
  
 outputAudioConfig 
 : 
  
 { 
  
 audioEncoding 
 : 
  
 'OUTPUT_AUDIO_ENCODING_LINEAR_16' 
 , 
  
 synthesizeSpeechConfig 
 : 
  
 synthesizeSpeechConfig 
 , 
  
 }, 
  
 }; 
  
 // Sends the detectIntent request 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Output audio configurations 
  
 console 
 . 
 log 
 ( 
  
 `Speaking Rate: 
 ${ 
 response 
 . 
 outputAudioConfig 
 . 
 synthesizeSpeechConfig 
 . 
 speakingRate 
 } 
 ` 
  
 ); 
  
 console 
 . 
 log 
 ( 
  
 `Pitch: 
 ${ 
 response 
 . 
 outputAudioConfig 
 . 
 synthesizeSpeechConfig 
 . 
 pitch 
 } 
 ` 
  
 ); 
  
 const 
  
 audioFile 
  
 = 
  
 response 
 . 
 outputAudio 
 ; 
  
 // Writes audio content to output file 
  
 util 
 . 
 promisify 
 ( 
 fs 
 . 
 writeFile 
 )( 
 outputFile 
 , 
  
 audioFile 
 , 
  
 'binary' 
 ); 
  
 console 
 . 
 log 
 ( 
 `Audio content written to file: 
 ${ 
 outputFile 
 } 
 ` 
 ); 
 } 
 detectIntentSynthesizeTTSResponse 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 uuid 
 from 
  
 google.cloud.dialogflowcx_v3.services.sessions 
  
 import 
 SessionsClient 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 audio_config 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 session 
 def 
  
 run_sample 
 (): 
 # TODO(developer): Update these values when running the function 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 location 
 = 
 "YOUR-LOCATION-ID" 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 text 
 = 
 "YOUR-TEXT" 
 audio_encoding 
 = 
 "YOUR-AUDIO-ENCODING" 
 language_code 
 = 
 "YOUR-LANGUAGE-CODE" 
 output_file 
 = 
 "YOUR-OUTPUT-FILE" 
 detect_intent_synthesize_tts_response 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 text 
 , 
 audio_encoding 
 , 
 language_code 
 , 
 output_file 
 , 
 ) 
 def 
  
 detect_intent_synthesize_tts_response 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 text 
 , 
 audio_encoding 
 , 
 language_code 
 , 
 output_file 
 , 
 ): 
  
 """Returns the result of detect intent with synthesized response.""" 
 client_options 
 = 
 None 
 if 
 location 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 # Constructs the audio query request 
 session_path 
 = 
 session_client 
 . 
 session_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 session 
 = 
 session_id 
 , 
 ) 
 text_input 
 = 
 session 
 . 
 TextInput 
 ( 
 text 
 = 
 text 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 text 
 = 
 text_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 synthesize_speech_config 
 = 
 audio_config 
 . 
 SynthesizeSpeechConfig 
 ( 
 speaking_rate 
 = 
 1.25 
 , 
 pitch 
 = 
 10.0 
 , 
 ) 
 output_audio_config 
 = 
 audio_config 
 . 
 OutputAudioConfig 
 ( 
 synthesize_speech_config 
 = 
 synthesize_speech_config 
 , 
 audio_encoding 
 = 
 audio_config 
 . 
 OutputAudioEncoding 
 [ 
 audio_encoding 
 ], 
 ) 
 request 
 = 
 session 
 . 
 DetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 output_audio_config 
 = 
 output_audio_config 
 , 
 ) 
 response 
 = 
 session_client 
 . 
 detect_intent 
 ( 
 request 
 = 
 request 
 ) 
 print 
 ( 
 "Speaking Rate: " 
 f 
 " 
 { 
 response 
 . 
 output_audio_config 
 . 
 synthesize_speech_config 
 . 
 speaking_rate 
 } 
 " 
 ) 
 print 
 ( 
 "Pitch: " 
 f 
 " 
 { 
 response 
 . 
 output_audio_config 
 . 
 synthesize_speech_config 
 . 
 pitch 
 } 
 " 
 ) 
 with 
 open 
 ( 
 output_file 
 , 
 "wb" 
 ) 
 as 
 fout 
 : 
 fout 
 . 
 write 
 ( 
 response 
 . 
 output_audio 
 ) 
 print 
 ( 
 f 
 "Audio content written to file: 
 { 
 output_file 
 } 
 " 
 ) 
 

Detect intent with webhook disabled

The following samples show how to detect intent with webhook calls disabled.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. DetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryParameters 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryResult 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. TextInput 
 
 ; 
 import 
  
 com.google.common.collect.Maps 
 ; 
 import 
  
 java.io.IOException 
 ; 
 import 
  
 java.util.ArrayList 
 ; 
 import 
  
 java.util.List 
 ; 
 import 
  
 java.util.Map 
 ; 
 public 
  
 class 
 DetectIntentDisableWebhook 
  
 { 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
 String 
  
 projectId 
  
 = 
  
 "my-project-id" 
 ; 
  
 String 
  
 locationId 
  
 = 
  
 "global" 
 ; 
  
 String 
  
 agentId 
  
 = 
  
 "my-agent-id" 
 ; 
  
 String 
  
 sessionId 
  
 = 
  
 "my-UUID" 
 ; 
  
 List<String> 
  
 texts 
  
 = 
  
 new 
  
 ArrayList 
<> ( 
 List 
 . 
 of 
 ( 
 "my-list" 
 , 
  
 "of-texts" 
 )); 
  
 String 
  
 languageCode 
  
 = 
  
 "en" 
 ; 
  
 detectIntent 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 , 
  
 texts 
 , 
  
 languageCode 
 ); 
  
 } 
  
 // DialogFlow API Detect Intent sample with webhook disabled. 
  
 public 
  
 static 
  
 Map<String 
 , 
  
 QueryResult 
>  
 detectIntent 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 sessionId 
 , 
  
 List<String> 
  
 texts 
 , 
  
 String 
  
 languageCode 
 ) 
  
 throws 
  
 IOException 
 , 
  
  ApiException 
 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 Map<String 
 , 
  
 QueryResult 
>  
 queryResults 
  
 = 
  
 Maps 
 . 
 newHashMap 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
  ofProjectLocationAgentSessionName 
 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // TODO : Uncomment if you want to print session path 
  
 // System.out.println("Session Path: " + session.toString()); 
  
 // Detect intents for each text input. 
  
 for 
  
 ( 
 String 
  
 text 
  
 : 
  
 texts 
 ) 
  
 { 
  
 // Set the text (hello) for the query. 
  
  TextInput 
 
 . 
 Builder 
  
 textInput 
  
 = 
  
  TextInput 
 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 text 
 ); 
  
 // Build the query with the TextInput and language code (en-US). 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 (). 
 setText 
 ( 
 textInput 
 ). 
 setLanguageCode 
 ( 
 languageCode 
 ). 
 build 
 (); 
  
 // Build the query parameters and setDisableWebhook to true. 
  
  QueryParameters 
 
  
 queryParameters 
  
 = 
  
  QueryParameters 
 
 . 
 newBuilder 
 (). 
  setDisableWebhook 
 
 ( 
 true 
 ). 
 build 
 (); 
  
 // Build the DetectIntentRequest with the SessionName, QueryInput, and QueryParameters. 
  
  DetectIntentRequest 
 
  
 request 
  
 = 
  
  DetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 setQueryParams 
 ( 
 queryParameters 
 ) 
  
 . 
 build 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
  request 
 
 . 
 toString 
 ()); 
  
 // Performs the detect intent request. 
  
  DetectIntentResponse 
 
  
 response 
  
 = 
  
 sessionsClient 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 // Display the query result. 
  
  QueryResult 
 
  
 queryResult 
  
 = 
  
 response 
 . 
  getQueryResult 
 
 (); 
  
 // TODO : Uncomment if you want to print queryResult 
  
 // System.out.println("===================="); 
  
 // System.out.format("Query Text: '%s'\n", queryResult.getText()); 
  
 // System.out.format( 
  
 //     "Detected Intent: %s (confidence: %f)\n", 
  
 //     queryResult.getIntent().getDisplayName(), 
  
 //         queryResult.getIntentDetectionConfidence()); 
  
 queryResults 
 . 
 put 
 ( 
 text 
 , 
  
 queryResult 
 ); 
  
 } 
  
 } 
  
 return 
  
 queryResults 
 ; 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 // const projectId = 'my-project'; 
 // const location = 'global'; 
 // const agentId = 'my-agent'; 
 // const query = 'Hello'; 
 // const languageCode = 'en' 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 const 
  
 client 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 async 
  
 function 
  
 detectIntentText 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 const 
  
 sessionPath 
  
 = 
  
 client 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 console 
 . 
 info 
 ( 
 sessionPath 
 ); 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryParams 
 : 
  
 { 
  
 disableWebhook 
 : 
  
 true 
 , 
  
 }, 
  
 queryInput 
 : 
  
 { 
  
 text 
 : 
  
 { 
  
 text 
 : 
  
 query 
 , 
  
 }, 
  
 languageCode 
 , 
  
 }, 
  
 }; 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 client 
 . 
 detectIntent 
 ( 
 request 
 ); 
  
 console 
 . 
 log 
 ( 
 `Detect Intent Request: 
 ${ 
 request 
 . 
 queryParams 
 . 
 disableWebhook 
 } 
 ` 
 ); 
  
 for 
  
 ( 
 const 
  
 message 
  
 of 
  
 response 
 . 
 queryResult 
 . 
 responseMessages 
 ) 
  
 { 
  
 if 
  
 ( 
 message 
 . 
 text 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
 `Agent Response: 
 ${ 
 message 
 . 
 text 
 . 
 text 
 } 
 ` 
 ); 
  
 } 
  
 } 
 } 
 detectIntentText 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 uuid 
 from 
  
 google.cloud.dialogflowcx_v3.services.sessions 
  
 import 
 SessionsClient 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 session 
 def 
  
 run_sample 
 (): 
 # TODO(developer): Update these values when running the function 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 location 
 = 
 "YOUR-LOCATION-ID" 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 text 
 = 
 "Perfect!" 
 language_code 
 = 
 "en-us" 
 detect_intent_disabled_webhook 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 text 
 , 
 language_code 
 , 
 ) 
 def 
  
 detect_intent_disabled_webhook 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 text 
 , 
 language_code 
 , 
 ): 
  
 """Returns the result of detect intent with sentiment analysis""" 
 client_options 
 = 
 None 
 if 
 location 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 session_path 
 = 
 session_client 
 . 
 session_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 session 
 = 
 session_id 
 , 
 ) 
 # Prepare request 
 text_input 
 = 
 session 
 . 
 TextInput 
 ( 
 text 
 = 
 text 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 text 
 = 
 text_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 query_params 
 = 
 session 
 . 
 QueryParameters 
 ( 
 disable_webhook 
 = 
 True 
 , 
 ) 
 request 
 = 
 session 
 . 
 DetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 query_params 
 = 
 query_params 
 , 
 ) 
 response 
 = 
 session_client 
 . 
 detect_intent 
 ( 
 request 
 = 
 request 
 ) 
 print 
 ( 
 f 
 "Detect Intent Request: 
 { 
 request 
 . 
 query_params 
 . 
 disable_webhook 
 } 
 " 
 ) 
 response_text 
 = 
 [] 
 for 
 message 
 in 
 response 
 . 
 query_result 
 . 
 response_messages 
 : 
 if 
 message 
 . 
 text 
 : 
 curr_response_text 
 = 
 message 
 . 
 text 
 . 
 text 
 print 
 ( 
 f 
 "Agent Response: 
 { 
 curr_response_text 
 } 
 " 
 ) 
 response_text 
 . 
 append 
 ( 
 curr_response_text 
 ) 
 return 
 response_text 
 

Streaming detect intent with audio file input

The following samples show how to stream audio input to a streaming detect intent request.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.api.gax.rpc. BidiStream 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.AudioEncoding 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.AudioInput 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.InputAudioConfig 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.OutputAudioConfig 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.OutputAudioEncoding 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.QueryInput 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.QueryResult 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.SessionName 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.SessionsClient 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.SessionsSettings 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.SsmlVoiceGender 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.StreamingDetectIntentRequest 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.StreamingDetectIntentResponse 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.SynthesizeSpeechConfig 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3beta1.VoiceSelectionParams 
 ; 
 import 
  
 com.google.protobuf. ByteString 
 
 ; 
 import 
  
 java.io.FileInputStream 
 ; 
 import 
  
 java.io.IOException 
 ; 
 public 
  
 abstract 
  
 class 
 DetectIntentStream 
  
 { 
  
 // DialogFlow API Detect Intent sample with audio files processes as an audio stream. 
  
 public 
  
 static 
  
 void 
  
 detectIntentStream 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 sessionId 
 , 
  
 String 
  
 audioFilePath 
 ) 
  
 throws 
  
  ApiException 
 
 , 
  
 IOException 
  
 { 
  
 SessionsSettings 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
 SessionsSettings 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 "global" 
 . 
 equals 
 ( 
 locationId 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 SessionsSettings 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format: `projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Using the same `sessionId` between requests allows continuation of the conversation. 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
 SessionsClient 
  
 sessionsClient 
  
 = 
  
 SessionsClient 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
 SessionName 
  
 session 
  
 = 
  
 SessionName 
 . 
 of 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // Instructs the speech recognizer how to process the audio content. 
  
 // Note: hard coding audioEncoding and sampleRateHertz for simplicity. 
  
 // Audio encoding of the audio content sent in the query request. 
  
 InputAudioConfig 
  
 inputAudioConfig 
  
 = 
  
 InputAudioConfig 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
 AudioEncoding 
 . 
 AUDIO_ENCODING_LINEAR_16 
 ) 
  
 . 
 setSampleRateHertz 
 ( 
 16000 
 ) 
  
 // sampleRateHertz = 16000 
  
 . 
 build 
 (); 
  
 // Build the AudioInput with the InputAudioConfig. 
  
 AudioInput 
  
 audioInput 
  
 = 
  
 AudioInput 
 . 
 newBuilder 
 (). 
 setConfig 
 ( 
 inputAudioConfig 
 ). 
 build 
 (); 
  
 // Build the query with the InputAudioConfig. 
  
 QueryInput 
  
 queryInput 
  
 = 
  
 QueryInput 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
 audioInput 
 ) 
  
 . 
 setLanguageCode 
 ( 
 "en-US" 
 ) 
  
 // languageCode = "en-US" 
  
 . 
 build 
 (); 
  
 // Create the Bidirectional stream 
  
 BidiStream<StreamingDetectIntentRequest 
 , 
  
 StreamingDetectIntentResponse 
>  
 bidiStream 
  
 = 
  
 sessionsClient 
 . 
 streamingDetectIntentCallable 
 (). 
 call 
 (); 
  
 // Specify sssml name and gender 
  
 VoiceSelectionParams 
  
 voiceSelection 
  
 = 
  
 // Voices that are available https://cloud.google.com/text-to-speech/docs/voices 
  
 VoiceSelectionParams 
 . 
 newBuilder 
 () 
  
 . 
 setName 
 ( 
 "en-US-Standard-F" 
 ) 
  
 . 
 setSsmlGender 
 ( 
 SsmlVoiceGender 
 . 
 SSML_VOICE_GENDER_FEMALE 
 ) 
  
 . 
 build 
 (); 
  
 SynthesizeSpeechConfig 
  
 speechConfig 
  
 = 
  
 SynthesizeSpeechConfig 
 . 
 newBuilder 
 (). 
 setVoice 
 ( 
 voiceSelection 
 ). 
 build 
 (); 
  
 // Setup audio config 
  
 OutputAudioConfig 
  
 audioConfig 
  
 = 
  
 // Output enconding explanation 
  
 // https://cloud.google.com/dialogflow/cx/docs/reference/rpc/google.cloud.dialogflow.cx.v3#outputaudioencoding 
  
 OutputAudioConfig 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
 OutputAudioEncoding 
 . 
 OUTPUT_AUDIO_ENCODING_UNSPECIFIED 
 ) 
  
 . 
 setAudioEncodingValue 
 ( 
 1 
 ) 
  
 . 
 setSynthesizeSpeechConfig 
 ( 
 speechConfig 
 ) 
  
 . 
 build 
 (); 
  
 // The first request must **only** contain the audio configuration: 
  
 bidiStream 
 . 
 send 
 ( 
  
 StreamingDetectIntentRequest 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
 toString 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
 setOutputAudioConfig 
 ( 
 audioConfig 
 ) 
  
 . 
 build 
 ()); 
  
 try 
  
 ( 
 FileInputStream 
  
 audioStream 
  
 = 
  
 new 
  
 FileInputStream 
 ( 
 audioFilePath 
 )) 
  
 { 
  
 // Subsequent requests must **only** contain the audio data. 
  
 // Following messages: audio chunks. We just read the file in fixed-size chunks. In reality 
  
 // you would split the user input by time. 
  
 byte 
 [] 
  
 buffer 
  
 = 
  
 new 
  
 byte 
 [ 
 4096 
 ] 
 ; 
  
 int 
  
 bytes 
 ; 
  
 while 
  
 (( 
 bytes 
  
 = 
  
 audioStream 
 . 
 read 
 ( 
 buffer 
 )) 
  
 != 
  
 - 
 1 
 ) 
  
 { 
  
 AudioInput 
  
 subAudioInput 
  
 = 
  
 AudioInput 
 . 
 newBuilder 
 (). 
 setAudio 
 ( 
  ByteString 
 
 . 
  copyFrom 
 
 ( 
 buffer 
 , 
  
 0 
 , 
  
 bytes 
 )). 
 build 
 (); 
  
 QueryInput 
  
 subQueryInput 
  
 = 
  
 QueryInput 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
 subAudioInput 
 ) 
  
 . 
 setLanguageCode 
 ( 
 "en-US" 
 ) 
  
 // languageCode = "en-US" 
  
 . 
 build 
 (); 
  
 bidiStream 
 . 
 send 
 ( 
  
 StreamingDetectIntentRequest 
 . 
 newBuilder 
 (). 
 setQueryInput 
 ( 
 subQueryInput 
 ). 
 build 
 ()); 
  
 } 
  
 } 
  
 // Tell the service you are done sending data. 
  
 bidiStream 
 . 
 closeSend 
 (); 
  
 for 
  
 ( 
 StreamingDetectIntentResponse 
  
 response 
  
 : 
  
 bidiStream 
 ) 
  
 { 
  
 QueryResult 
  
 queryResult 
  
 = 
  
 response 
 . 
 getDetectIntentResponse 
 (). 
 getQueryResult 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "====================" 
 ); 
  
 System 
 . 
 out 
 . 
 format 
 ( 
 "Query Text: '%s'\n" 
 , 
  
 queryResult 
 . 
 getTranscript 
 ()); 
  
 System 
 . 
 out 
 . 
 format 
 ( 
  
 "Detected Intent: %s (confidence: %f)\n" 
 , 
  
 queryResult 
 . 
 getMatch 
 (). 
 getIntent 
 (). 
 getDisplayName 
 (), 
  
 queryResult 
 . 
 getMatch 
 (). 
 getConfidence 
 ()); 
  
 } 
  
 } 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 // const projectId = 'my-project'; 
 // const location = 'global'; 
 // const agentId = 'my-agent'; 
 // const audioFileName = '/path/to/audio.raw'; 
 // const encoding = 'AUDIO_ENCODING_LINEAR_16'; 
 // const sampleRateHertz = 16000; 
 // const languageCode = 'en' 
 // Imports the Google Cloud Some API library 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 const 
  
 client 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 const 
  
 fs 
  
 = 
  
 require 
 ( 
 'fs' 
 ); 
 const 
  
 util 
  
 = 
  
 require 
 ( 
 'util' 
 ); 
 const 
  
 { 
 Transform 
 , 
  
 pipeline 
 } 
  
 = 
  
 require 
 ( 
 'stream' 
 ); 
 const 
  
 pump 
  
 = 
  
 util 
 . 
 promisify 
 ( 
 pipeline 
 ); 
 async 
  
 function 
  
 detectIntentAudio 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 const 
  
 sessionPath 
  
 = 
  
 client 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 console 
 . 
 info 
 ( 
 sessionPath 
 ); 
  
 // Create a stream for the streaming request. 
  
 const 
  
 detectStream 
  
 = 
  
 client 
  
 . 
 streamingDetectIntent 
 () 
  
 . 
 on 
 ( 
 'error' 
 , 
  
 console 
 . 
 error 
 ) 
  
 . 
 on 
 ( 
 'data' 
 , 
  
 data 
  
 = 
>  
 { 
  
 if 
  
 ( 
 data 
 . 
 recognitionResult 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
  
 `Intermediate Transcript: 
 ${ 
 data 
 . 
 recognitionResult 
 . 
 transcript 
 } 
 ` 
  
 ); 
  
 } 
  
 else 
  
 { 
  
 console 
 . 
 log 
 ( 
 'Detected Intent:' 
 ); 
  
 const 
  
 result 
  
 = 
  
 data 
 . 
 detectIntentResponse 
 . 
 queryResult 
 ; 
  
 console 
 . 
 log 
 ( 
 `User Query: 
 ${ 
 result 
 . 
 transcript 
 } 
 ` 
 ); 
  
 for 
  
 ( 
 const 
  
 message 
  
 of 
  
 result 
 . 
 responseMessages 
 ) 
  
 { 
  
 if 
  
 ( 
 message 
 . 
 text 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
 `Agent Response: 
 ${ 
 message 
 . 
 text 
 . 
 text 
 } 
 ` 
 ); 
  
 } 
  
 } 
  
 if 
  
 ( 
 result 
 . 
 match 
 . 
 intent 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
 `Matched Intent: 
 ${ 
 result 
 . 
 match 
 . 
 intent 
 . 
 displayName 
 } 
 ` 
 ); 
  
 } 
  
 console 
 . 
 log 
 ( 
 `Current Page: 
 ${ 
 result 
 . 
 currentPage 
 . 
 displayName 
 } 
 ` 
 ); 
  
 } 
  
 }); 
  
 // Write the initial stream request to config for audio input. 
  
 const 
  
 initialStreamRequest 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 audio 
 : 
  
 { 
  
 config 
 : 
  
 { 
  
 audioEncoding 
 : 
  
 encoding 
 , 
  
 sampleRateHertz 
 : 
  
 sampleRateHertz 
 , 
  
 synthesize_speech_config 
 : 
  
 { 
  
 voice 
 : 
  
 { 
  
 // Set's the name and gender of the ssml voice 
  
 name 
 : 
  
 'en-GB-Standard-A' 
 , 
  
 ssml_gender 
 : 
  
 'SSML_VOICE_GENDER_FEMALE' 
 , 
  
 }, 
  
 }, 
  
 singleUtterance 
 : 
  
 true 
 , 
  
 }, 
  
 }, 
  
 languageCode 
 : 
  
 languageCode 
 , 
  
 }, 
  
 }; 
  
 detectStream 
 . 
 write 
 ( 
 initialStreamRequest 
 ); 
  
 // Stream the audio from audio file to Dialogflow. 
  
 await 
  
 pump 
 ( 
  
 fs 
 . 
 createReadStream 
 ( 
 audioFileName 
 ), 
  
 // Format the audio stream into the request format. 
  
 new 
  
 Transform 
 ({ 
  
 objectMode 
 : 
  
 true 
 , 
  
 transform 
 : 
  
 ( 
 obj 
 , 
  
 _ 
 , 
  
 next 
 ) 
  
 = 
>  
 { 
  
 next 
 ( 
 null 
 , 
  
 { 
 queryInput 
 : 
  
 { 
 audio 
 : 
  
 { 
 audio 
 : 
  
 obj 
 }}}); 
  
 }, 
  
 }), 
  
 detectStream 
  
 ); 
 } 
 detectIntentAudio 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  def 
  
 run_sample 
 (): 
 # TODO(developer): Replace these values when running the function 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 # For more information about regionalization see https://cloud.google.com/dialogflow/cx/docs/how/region 
 location_id 
 = 
 "YOUR-LOCATION-ID" 
 # For more info on agents see https://cloud.google.com/dialogflow/cx/docs/concept/agent 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 agent 
 = 
 f 
 "projects/ 
 { 
 project_id 
 } 
 /locations/ 
 { 
 location_id 
 } 
 /agents/ 
 { 
 agent_id 
 } 
 " 
 # For more information on sessions see https://cloud.google.com/dialogflow/cx/docs/concept/session 
 session_id 
 = 
 uuid 
 . 
 uuid4 
 () 
 audio_file_path 
 = 
 "YOUR-AUDIO-FILE-PATH" 
 # For more supported languages see https://cloud.google.com/dialogflow/es/docs/reference/language 
 language_code 
 = 
 "en-us" 
 detect_intent_stream 
 ( 
 agent 
 , 
 session_id 
 , 
 audio_file_path 
 , 
 language_code 
 ) 
 def 
  
 detect_intent_stream 
 ( 
 agent 
 , 
 session_id 
 , 
 audio_file_path 
 , 
 language_code 
 ): 
  
 """Returns the result of detect intent with streaming audio as input. 
 Using the same `session_id` between requests allows continuation 
 of the conversation.""" 
 session_path 
 = 
 f 
 " 
 { 
 agent 
 } 
 /sessions/ 
 { 
 session_id 
 } 
 " 
 print 
 ( 
 f 
 "Session path: 
 { 
 session_path 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 None 
 agent_components 
 = 
 AgentsClient 
 . 
 parse_agent_path 
 ( 
 agent 
 ) 
 location_id 
 = 
 agent_components 
 [ 
 "location" 
 ] 
 if 
 location_id 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location_id 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 input_audio_config 
 = 
 audio_config 
 . 
 InputAudioConfig 
 ( 
 audio_encoding 
 = 
 audio_config 
 . 
 AudioEncoding 
 . 
 AUDIO_ENCODING_LINEAR_16 
 , 
 sample_rate_hertz 
 = 
 24000 
 , 
 ) 
 def 
  
 request_generator 
 (): 
 audio_input 
 = 
 session 
 . 
 AudioInput 
 ( 
 config 
 = 
 input_audio_config 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 audio 
 = 
 audio_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 voice_selection 
 = 
 audio_config 
 . 
 VoiceSelectionParams 
 () 
 synthesize_speech_config 
 = 
 audio_config 
 . 
 SynthesizeSpeechConfig 
 () 
 output_audio_config 
 = 
 audio_config 
 . 
 OutputAudioConfig 
 () 
 # Sets the voice name and gender 
 voice_selection 
 . 
 name 
 = 
 "en-GB-Standard-A" 
 voice_selection 
 . 
 ssml_gender 
 = 
 ( 
 audio_config 
 . 
 SsmlVoiceGender 
 . 
 SSML_VOICE_GENDER_FEMALE 
 ) 
 synthesize_speech_config 
 . 
 voice 
 = 
 voice_selection 
 # Sets the audio encoding 
 output_audio_config 
 . 
 audio_encoding 
 = 
 ( 
 audio_config 
 . 
 OutputAudioEncoding 
 . 
 OUTPUT_AUDIO_ENCODING_UNSPECIFIED 
 ) 
 output_audio_config 
 . 
 synthesize_speech_config 
 = 
 synthesize_speech_config 
 # The first request contains the configuration. 
 yield 
 session 
 . 
 StreamingDetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 output_audio_config 
 = 
 output_audio_config 
 , 
 ) 
 # Here we are reading small chunks of audio data from a local 
 # audio file.  In practice these chunks should come from 
 # an audio input device. 
 with 
 open 
 ( 
 audio_file_path 
 , 
 "rb" 
 ) 
 as 
 audio_file 
 : 
 while 
 True 
 : 
 chunk 
 = 
 audio_file 
 . 
 read 
 ( 
 4096 
 ) 
 if 
 not 
 chunk 
 : 
 break 
 # The later requests contains audio data. 
 audio_input 
 = 
 session 
 . 
 AudioInput 
 ( 
 audio 
 = 
 chunk 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 audio 
 = 
 audio_input 
 ) 
 yield 
 session 
 . 
 StreamingDetectIntentRequest 
 ( 
 query_input 
 = 
 query_input 
 ) 
 responses 
 = 
 session_client 
 . 
 streaming_detect_intent 
 ( 
 requests 
 = 
 request_generator 
 ()) 
 print 
 ( 
 "=" 
 * 
 20 
 ) 
 for 
 response 
 in 
 responses 
 : 
 print 
 ( 
 f 
 'Intermediate transcript: " 
 { 
 response 
 . 
 recognition_result 
 . 
 transcript 
 } 
 ".' 
 ) 
 # Note: The result from the last response is the final transcript along 
 # with the detected content. 
 response 
 = 
 response 
 . 
 detect_intent_response 
 print 
 ( 
 f 
 "Query text: 
 { 
 response 
 . 
 query_result 
 . 
 transcript 
 } 
 " 
 ) 
 response_messages 
 = 
 [ 
 " " 
 . 
 join 
 ( 
 msg 
 . 
 text 
 . 
 text 
 ) 
 for 
 msg 
 in 
 response 
 . 
 query_result 
 . 
 response_messages 
 ] 
 print 
 ( 
 f 
 "Response text: 
 { 
 ' ' 
 . 
 join 
 ( 
 response_messages 
 ) 
 } 
 \n 
 " 
 ) 
 

Streaming detect intent with microphone audio

The following sample implements a real-time streaming audio interface with Conversational Agents (Dialogflow CX). It captures audio from the user's microphone, streams it to Conversational Agents (Dialogflow CX) for audio transcription, intent detection and plays back the synthesized audio responses from Conversational Agents (Dialogflow CX) through the user's speakers.

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  from 
  
 __future__ 
  
 import 
 annotations 
 import 
  
 argparse 
 import 
  
 asyncio 
 from 
  
 collections.abc 
  
 import 
 AsyncGenerator 
 import 
  
 logging 
 import 
  
 os 
 import 
  
 signal 
 import 
  
 struct 
 import 
  
 sys 
 import 
  
 time 
 import 
  
 uuid 
 from 
  
 google.api_core 
  
 import 
 retry 
 as 
 retries 
 from 
  
 google.api_core.client_options 
  
 import 
 ClientOptions 
 from 
  
 google.api_core.exceptions 
  
 import 
 GoogleAPIError 
 , 
 ServiceUnavailable 
 from 
  
 google.cloud 
  
 import 
  dialogflowcx_v3 
 
 from 
  
 google.protobuf.json_format 
  
 import 
 MessageToDict 
 import 
  
 pyaudio 
 from 
  
 termcolor 
  
 import 
 colored 
 # TODO: Remove once GRPC log spam is gone see https://github.com/grpc/grpc/issues/37642 
 os 
 . 
 environ 
 [ 
 "GRPC_VERBOSITY" 
 ] 
 = 
 "NONE" 
 # Configure logging 
 logging 
 . 
 basicConfig 
 ( 
 level 
 = 
 logging 
 . 
 INFO 
 , 
 format 
 = 
 " 
 %(asctime)s 
 - 
 %(levelname)s 
 - 
 %(message)s 
 " 
 ) 
 logger 
 = 
 logging 
 . 
 getLogger 
 ( 
 __name__ 
 ) 
 CHUNK_SECONDS 
 = 
 0.1 
 DEFAULT_LANGUAGE_CODE 
 = 
 "en-US" 
 DEFAULT_SAMPLE_RATE 
 = 
 16000 
 DEFAULT_DIALOGFLOW_TIMEOUT 
 = 
 60.0 
 def 
  
 get_current_time 
 () 
 - 
> int 
 : 
  
 """Return Current Time in MS.""" 
 return 
 int 
 ( 
 round 
 ( 
 time 
 . 
 time 
 () 
 * 
 1000 
 )) 
 class 
  
 AudioIO 
 : 
  
 """Audio Input / Output""" 
 def 
  
 __init__ 
 ( 
 self 
 , 
 rate 
 : 
 int 
 , 
 chunk_size 
 : 
 int 
 , 
 ) 
 - 
> None 
 : 
 self 
 . 
 _rate 
 = 
 rate 
 self 
 . 
 chunk_size 
 = 
 chunk_size 
 self 
 . 
 _buff 
 = 
 asyncio 
 . 
 Queue 
 () 
 self 
 . 
 closed 
 = 
 False 
 self 
 . 
 start_time 
 = 
 None 
 # only set when first audio received 
 self 
 . 
 audio_input 
 = 
 [] 
 self 
 . 
 _audio_interface 
 = 
 pyaudio 
 . 
 PyAudio 
 () 
 self 
 . 
 _input_audio_stream 
 = 
 None 
 self 
 . 
 _output_audio_stream 
 = 
 None 
 # Get default input device info 
 try 
 : 
 input_device_info 
 = 
 self 
 . 
 _audio_interface 
 . 
 get_default_input_device_info 
 () 
 self 
 . 
 input_device_name 
 = 
 input_device_info 
 [ 
 "name" 
 ] 
 logger 
 . 
 info 
 ( 
 f 
 "Using input device: 
 { 
 self 
 . 
 input_device_name 
 } 
 " 
 ) 
 except 
 IOError 
 : 
 logger 
 . 
 error 
 ( 
 "Could not get default input device info. Exiting." 
 ) 
 sys 
 . 
 exit 
 ( 
 1 
 ) 
 # Get default output device info 
 try 
 : 
 output_device_info 
 = 
 self 
 . 
 _audio_interface 
 . 
 get_default_output_device_info 
 () 
 self 
 . 
 output_device_name 
 = 
 output_device_info 
 [ 
 "name" 
 ] 
 logger 
 . 
 info 
 ( 
 f 
 "Using output device: 
 { 
 self 
 . 
 output_device_name 
 } 
 " 
 ) 
 except 
 IOError 
 : 
 logger 
 . 
 error 
 ( 
 "Could not get default output device info. Exiting." 
 ) 
 sys 
 . 
 exit 
 ( 
 1 
 ) 
 # setup input audio stream 
 try 
 : 
 self 
 . 
 _input_audio_stream 
 = 
 self 
 . 
 _audio_interface 
 . 
 open 
 ( 
 format 
 = 
 pyaudio 
 . 
 paInt16 
 , 
 channels 
 = 
 1 
 , 
 rate 
 = 
 self 
 . 
 _rate 
 , 
 input 
 = 
 True 
 , 
 frames_per_buffer 
 = 
 self 
 . 
 chunk_size 
 , 
 stream_callback 
 = 
 self 
 . 
 _fill_buffer 
 , 
 ) 
 except 
 OSError 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Could not open input stream: 
 { 
 e 
 } 
 . Exiting." 
 ) 
 sys 
 . 
 exit 
 ( 
 1 
 ) 
 # setup output audio stream 
 try 
 : 
 self 
 . 
 _output_audio_stream 
 = 
 self 
 . 
 _audio_interface 
 . 
 open 
 ( 
 format 
 = 
 pyaudio 
 . 
 paInt16 
 , 
 channels 
 = 
 1 
 , 
 rate 
 = 
 self 
 . 
 _rate 
 , 
 output 
 = 
 True 
 , 
 frames_per_buffer 
 = 
 self 
 . 
 chunk_size 
 , 
 ) 
 self 
 . 
 _output_audio_stream 
 . 
 stop_stream 
 () 
 except 
 OSError 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Could not open output stream: 
 { 
 e 
 } 
 . Exiting." 
 ) 
 sys 
 . 
 exit 
 ( 
 1 
 ) 
 def 
  
 __enter__ 
 ( 
 self 
 ) 
 - 
> "AudioIO" 
 : 
  
 """Opens the stream.""" 
 self 
 . 
 closed 
 = 
 False 
 return 
 self 
 def 
  
 __exit__ 
 ( 
 self 
 , 
 * 
 args 
 : 
 any 
 ) 
 - 
> None 
 : 
  
 """Closes the stream and releases resources.""" 
 self 
 . 
 closed 
 = 
 True 
 if 
 self 
 . 
 _input_audio_stream 
 : 
 self 
 . 
 _input_audio_stream 
 . 
 stop_stream 
 () 
 self 
 . 
 _input_audio_stream 
 . 
 close 
 () 
 self 
 . 
 _input_audio_stream 
 = 
 None 
 if 
 self 
 . 
 _output_audio_stream 
 : 
 self 
 . 
 _output_audio_stream 
 . 
 stop_stream 
 () 
 self 
 . 
 _output_audio_stream 
 . 
 close 
 () 
 self 
 . 
 _output_audio_stream 
 = 
 None 
 # Signal the generator to terminate 
 self 
 . 
 _buff 
 . 
 put_nowait 
 ( 
 None 
 ) 
 self 
 . 
 _audio_interface 
 . 
 terminate 
 () 
 def 
  
 _fill_buffer 
 ( 
 self 
 , 
 in_data 
 : 
 bytes 
 , 
 frame_count 
 : 
 int 
 , 
 time_info 
 : 
 dict 
 , 
 status_flags 
 : 
 int 
 ) 
 - 
> tuple 
 [ 
 None 
 , 
 int 
 ]: 
  
 """Continuously collect data from the audio stream, into the buffer.""" 
 # Capture the true start time when the first chunk is received 
 if 
 self 
 . 
 start_time 
 is 
 None 
 : 
 self 
 . 
 start_time 
 = 
 get_current_time 
 () 
 # only capture microphone input when output audio stream is stopped 
 if 
 self 
 . 
 _output_audio_stream 
 and 
 self 
 . 
 _output_audio_stream 
 . 
 is_stopped 
 (): 
 self 
 . 
 _buff 
 . 
 put_nowait 
 ( 
 in_data 
 ) 
 self 
 . 
 audio_input 
 . 
 append 
 ( 
 in_data 
 ) 
 return 
 None 
 , 
 pyaudio 
 . 
 paContinue 
 async 
 def 
  
 generator 
 ( 
 self 
 ) 
 - 
> AsyncGenerator 
 [ 
 bytes 
 , 
 None 
 ]: 
  
 """Stream Audio from microphone to API and to local buffer.""" 
 while 
 not 
 self 
 . 
 closed 
 : 
 try 
 : 
 chunk 
 = 
 await 
 asyncio 
 . 
 wait_for 
 ( 
 self 
 . 
 _buff 
 . 
 get 
 (), 
 timeout 
 = 
 1 
 ) 
 if 
 chunk 
 is 
 None 
 : 
 logger 
 . 
 debug 
 ( 
 "[generator] Received None chunk, ending stream" 
 ) 
 return 
 data 
 = 
 [ 
 chunk 
 ] 
 while 
 True 
 : 
 try 
 : 
 chunk 
 = 
 self 
 . 
 _buff 
 . 
 get_nowait 
 () 
 if 
 chunk 
 is 
 None 
 : 
 logger 
 . 
 debug 
 ( 
 "[generator] Received None chunk (nowait), ending stream" 
 ) 
 return 
 data 
 . 
 append 
 ( 
 chunk 
 ) 
 except 
 asyncio 
 . 
 QueueEmpty 
 : 
 break 
 combined_data 
 = 
 b 
 "" 
 . 
 join 
 ( 
 data 
 ) 
 yield 
 combined_data 
 except 
 asyncio 
 . 
 TimeoutError 
 : 
 logger 
 . 
 debug 
 ( 
 "[generator] No audio chunk received within timeout, continuing..." 
 ) 
 continue 
 def 
  
 play_audio 
 ( 
 self 
 , 
 audio_data 
 : 
 bytes 
 ) 
 - 
> None 
 : 
  
 """Plays audio from the given bytes data, removing WAV header if needed.""" 
 # Remove WAV header if present 
 if 
 audio_data 
 . 
 startswith 
 ( 
 b 
 "RIFF" 
 ): 
 try 
 : 
 # Attempt to unpack the WAV header to determine header size. 
 header_size 
 = 
 struct 
 . 
 calcsize 
 ( 
 "<4sI4s4sIHHIIHH4sI" 
 ) 
 header 
 = 
 struct 
 . 
 unpack 
 ( 
 "<4sI4s4sIHHIIHH4sI" 
 , 
 audio_data 
 [: 
 header_size 
 ]) 
 logger 
 . 
 debug 
 ( 
 f 
 "WAV header detected: 
 { 
 header 
 } 
 " 
 ) 
 audio_data 
 = 
 audio_data 
 [ 
 header_size 
 :] 
 # Remove the header 
 except 
 struct 
 . 
 error 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Error unpacking WAV header: 
 { 
 e 
 } 
 " 
 ) 
 # If header parsing fails, play the original data; may not be a valid WAV 
 # Play the raw PCM audio 
 try 
 : 
 self 
 . 
 _output_audio_stream 
 . 
 start_stream 
 () 
 self 
 . 
 _output_audio_stream 
 . 
 write 
 ( 
 audio_data 
 ) 
 finally 
 : 
 self 
 . 
 _output_audio_stream 
 . 
 stop_stream 
 () 
 class 
  
 DialogflowCXStreaming 
 : 
  
 """Manages the interaction with the Dialogflow CX Streaming API.""" 
 def 
  
 __init__ 
 ( 
 self 
 , 
 agent_name 
 : 
 str 
 , 
 language_code 
 : 
 str 
 , 
 single_utterance 
 : 
 bool 
 , 
 model 
 : 
 str 
 | 
 None 
 , 
 voice 
 : 
 str 
 | 
 None 
 , 
 sample_rate 
 : 
 int 
 , 
 dialogflow_timeout 
 : 
 float 
 , 
 debug 
 : 
 bool 
 , 
 ) 
 - 
> None 
 : 
  
 """Initializes the Dialogflow CX Streaming API client.""" 
 try 
 : 
 _ 
 , 
 project 
 , 
 _ 
 , 
 location 
 , 
 _ 
 , 
 agent_id 
 = 
 agent_name 
 . 
 split 
 ( 
 "/" 
 ) 
 except 
 ValueError 
 : 
 raise 
 ValueError 
 ( 
 "Invalid agent name format. Expected format: projects/<project>/locations/<location>/agents/<agent_id>" 
 ) 
 if 
 location 
 != 
 "global" 
 : 
 client_options 
 = 
 ClientOptions 
 ( 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com" 
 , 
 quota_project_id 
 = 
 project 
 , 
 ) 
 else 
 : 
 client_options 
 = 
 ClientOptions 
 ( 
 quota_project_id 
 = 
 project 
 ) 
 self 
 . 
 client 
 = 
  dialogflowcx_v3 
 
 . 
  SessionsAsyncClient 
 
 ( 
 client_options 
 = 
 client_options 
 ) 
 self 
 . 
 agent_name 
 = 
 agent_name 
 self 
 . 
 language_code 
 = 
 language_code 
 self 
 . 
 single_utterance 
 = 
 single_utterance 
 self 
 . 
 model 
 = 
 model 
 self 
 . 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 self 
 . 
 dialogflow_timeout 
 = 
 dialogflow_timeout 
 self 
 . 
 debug 
 = 
 debug 
 self 
 . 
 sample_rate 
 = 
 sample_rate 
 self 
 . 
 voice 
 = 
 voice 
 if 
 self 
 . 
 debug 
 : 
 logger 
 . 
 setLevel 
 ( 
 logging 
 . 
 DEBUG 
 ) 
 logger 
 . 
 debug 
 ( 
 "Debug logging enabled" 
 ) 
 async 
 def 
  
 generate_streaming_detect_intent_requests 
 ( 
 self 
 , 
 audio_queue 
 : 
 asyncio 
 . 
 Queue 
 ) 
 - 
> AsyncGenerator 
 [ 
 dialogflowcx_v3 
 . 
 StreamingDetectIntentRequest 
 , 
 None 
 ]: 
  
 """Generates the requests for the streaming API.""" 
 audio_config 
 = 
  dialogflowcx_v3 
 
 . 
  InputAudioConfig 
 
 ( 
 audio_encoding 
 = 
  dialogflowcx_v3 
 
 . 
  AudioEncoding 
 
 . 
 AUDIO_ENCODING_LINEAR_16 
 , 
 sample_rate_hertz 
 = 
 self 
 . 
 sample_rate 
 , 
 model 
 = 
 self 
 . 
 model 
 , 
 single_utterance 
 = 
 self 
 . 
 single_utterance 
 , 
 ) 
 query_input 
 = 
  dialogflowcx_v3 
 
 . 
  QueryInput 
 
 ( 
 language_code 
 = 
 self 
 . 
 language_code 
 , 
 audio 
 = 
  dialogflowcx_v3 
 
 . 
  AudioInput 
 
 ( 
 config 
 = 
 audio_config 
 ), 
 ) 
 output_audio_config 
 = 
  dialogflowcx_v3 
 
 . 
  OutputAudioConfig 
 
 ( 
 audio_encoding 
 = 
  dialogflowcx_v3 
 
 . 
  OutputAudioEncoding 
 
 . 
 OUTPUT_AUDIO_ENCODING_LINEAR_16 
 , 
 sample_rate_hertz 
 = 
 self 
 . 
 sample_rate 
 , 
 synthesize_speech_config 
 = 
 ( 
  dialogflowcx_v3 
 
 . 
  SynthesizeSpeechConfig 
 
 ( 
 voice 
 = 
  dialogflowcx_v3 
 
 . 
  VoiceSelectionParams 
 
 ( 
 name 
 = 
 self 
 . 
 voice 
 ) 
 ) 
 if 
 self 
 . 
 voice 
 else 
 None 
 ), 
 ) 
 # First request contains session ID, query input audio config, and output audio config 
 request 
 = 
  dialogflowcx_v3 
 
 . 
  StreamingDetectIntentRequest 
 
 ( 
 session 
 = 
 f 
 " 
 { 
 self 
 . 
 agent_name 
 } 
 /sessions/ 
 { 
 self 
 . 
 session_id 
 } 
 " 
 , 
 query_input 
 = 
 query_input 
 , 
 enable_partial_response 
 = 
 True 
 , 
 output_audio_config 
 = 
 output_audio_config 
 , 
 ) 
 if 
 self 
 . 
 debug 
 : 
 logger 
 . 
 debug 
 ( 
 f 
 "Sending initial request: 
 { 
 request 
 } 
 " 
 ) 
 yield 
 request 
 # Subsequent requests contain audio only 
 while 
 True 
 : 
 try 
 : 
 chunk 
 = 
 await 
 audio_queue 
 . 
 get 
 () 
 if 
 chunk 
 is 
 None 
 : 
 logger 
 . 
 debug 
 ( 
 "[generate_streaming_detect_intent_requests] Received None chunk, signaling end of utterance" 
 ) 
 break 
 # Exit the generator 
 request 
 = 
  dialogflowcx_v3 
 
 . 
  StreamingDetectIntentRequest 
 
 ( 
 query_input 
 = 
  dialogflowcx_v3 
 
 . 
  QueryInput 
 
 ( 
 audio 
 = 
  dialogflowcx_v3 
 
 . 
  AudioInput 
 
 ( 
 audio 
 = 
 chunk 
 ) 
 ) 
 ) 
 yield 
 request 
 except 
 asyncio 
 . 
 CancelledError 
 : 
 logger 
 . 
 debug 
 ( 
 "[generate_streaming_detect_intent_requests] Audio queue processing was cancelled" 
 ) 
 break 
 async 
 def 
  
 streaming_detect_intent 
 ( 
 self 
 , 
 audio_queue 
 : 
 asyncio 
 . 
 Queue 
 , 
 ) 
 - 
> AsyncGenerator 
 [ 
 dialogflowcx_v3 
 . 
 StreamingDetectIntentResponse 
 , 
 None 
 ]: 
  
 """Transcribes the audio into text and yields each response.""" 
 requests_generator 
 = 
 self 
 . 
 generate_streaming_detect_intent_requests 
 ( 
 audio_queue 
 ) 
 retry_policy 
 = 
 retries 
 . 
 AsyncRetry 
 ( 
 predicate 
 = 
 retries 
 . 
 if_exception_type 
 ( 
 ServiceUnavailable 
 ), 
 initial 
 = 
 0.5 
 , 
 maximum 
 = 
 60.0 
 , 
 multiplier 
 = 
 2.0 
 , 
 timeout 
 = 
 300.0 
 , 
 on_error 
 = 
 lambda 
 e 
 : 
 logger 
 . 
 warning 
 ( 
 f 
 "Retrying due to error: 
 { 
 e 
 } 
 " 
 ), 
 ) 
 async 
 def 
  
 streaming_request_with_retry 
 () 
 - 
> ( 
 AsyncGenerator 
 [ 
 dialogflowcx_v3 
 . 
 StreamingDetectIntentResponse 
 , 
 None 
 ] 
 ): 
 async 
 def 
  
 api_call 
 (): 
 logger 
 . 
 debug 
 ( 
 "Initiating streaming request" 
 ) 
 return 
 await 
 self 
 . 
 client 
 . 
 streaming_detect_intent 
 ( 
 requests 
 = 
 requests_generator 
 ) 
 response_stream 
 = 
 await 
 retry_policy 
 ( 
 api_call 
 )() 
 return 
 response_stream 
 try 
 : 
 responses 
 = 
 await 
 streaming_request_with_retry 
 () 
 # Use async for to iterate over the responses, WITH timeout 
 response_iterator 
 = 
 responses 
 . 
 __aiter__ 
 () 
 # Get the iterator 
 while 
 True 
 : 
 try 
 : 
 response 
 = 
 await 
 asyncio 
 . 
 wait_for 
 ( 
 response_iterator 
 . 
 __anext__ 
 (), 
 timeout 
 = 
 self 
 . 
 dialogflow_timeout 
 ) 
 if 
 self 
 . 
 debug 
 and 
 response 
 : 
 response_copy 
 = 
 MessageToDict 
 ( 
 response 
 . 
 _pb 
 ) 
 if 
 response_copy 
 . 
 get 
 ( 
 "detectIntentResponse" 
 ): 
 response_copy 
 [ 
 "detectIntentResponse" 
 ][ 
 "outputAudio" 
 ] 
 = 
 "REMOVED" 
 logger 
 . 
 debug 
 ( 
 f 
 "Received response: 
 { 
 response_copy 
 } 
 " 
 ) 
 yield 
 response 
 except 
 StopAsyncIteration 
 : 
 logger 
 . 
 debug 
 ( 
 "End of response stream" 
 ) 
 break 
 except 
 asyncio 
 . 
 TimeoutError 
 : 
 logger 
 . 
 warning 
 ( 
 "Timeout waiting for response from Dialogflow." 
 ) 
 continue 
 # Continue to the next iteration, don't break 
 except 
 GoogleAPIError 
 as 
 e 
 : 
 # Keep error handling 
 logger 
 . 
 error 
 ( 
 f 
 "Error: 
 { 
 e 
 } 
 " 
 ) 
 if 
 e 
 . 
 code 
 == 
 500 
 : 
 # Consider making this more robust 
 logger 
 . 
 warning 
 ( 
 "Encountered a 500 error during iteration." 
 ) 
 except 
 GoogleAPIError 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Error: 
 { 
 e 
 } 
 " 
 ) 
 if 
 e 
 . 
 code 
 == 
 500 
 : 
 logger 
 . 
 warning 
 ( 
 "Encountered a 500 error during iteration." 
 ) 
 async 
 def 
  
 push_to_audio_queue 
 ( 
 audio_generator 
 : 
 AsyncGenerator 
 , 
 audio_queue 
 : 
 asyncio 
 . 
 Queue 
 ) 
 - 
> None 
 : 
  
 """Pushes audio chunks from a generator to an asyncio queue.""" 
 try 
 : 
 async 
 for 
 chunk 
 in 
 audio_generator 
 : 
 await 
 audio_queue 
 . 
 put 
 ( 
 chunk 
 ) 
 except 
 Exception 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Error in push_to_audio_queue: 
 { 
 e 
 } 
 " 
 ) 
 async 
 def 
  
 listen_print_loop 
 ( 
 responses 
 : 
 AsyncGenerator 
 [ 
 dialogflowcx_v3 
 . 
 StreamingDetectIntentResponse 
 , 
 None 
 ], 
 audioIO 
 : 
 AudioIO 
 , 
 audio_queue 
 : 
 asyncio 
 . 
 Queue 
 , 
 dialogflow_timeout 
 : 
 float 
 , 
 ) 
 - 
> bool 
 : 
  
 """Iterates through server responses and prints them.""" 
 response_iterator 
 = 
 responses 
 . 
 __aiter__ 
 () 
 while 
 True 
 : 
 try 
 : 
 response 
 = 
 await 
 asyncio 
 . 
 wait_for 
 ( 
 response_iterator 
 . 
 __anext__ 
 (), 
 timeout 
 = 
 dialogflow_timeout 
 ) 
 if 
 ( 
 response 
 and 
 response 
 . 
 detect_intent_response 
 and 
 response 
 . 
 detect_intent_response 
 . 
 output_audio 
 ): 
 audioIO 
 . 
 play_audio 
 ( 
 response 
 . 
 detect_intent_response 
 . 
 output_audio 
 ) 
 if 
 ( 
 response 
 and 
 response 
 . 
 detect_intent_response 
 and 
 response 
 . 
 detect_intent_response 
 . 
 query_result 
 ): 
 query_result 
 = 
 response 
 . 
 detect_intent_response 
 . 
 query_result 
 # Check for end_interaction in response messages 
 if 
 query_result 
 . 
 response_messages 
 : 
 for 
 message 
 in 
 query_result 
 . 
 response_messages 
 : 
 if 
 message 
 . 
 text 
 : 
 logger 
 . 
 info 
 ( 
 f 
 "Dialogflow output: 
 { 
 message 
 . 
 text 
 . 
 text 
 [ 
 0 
 ] 
 } 
 " 
 ) 
 if 
 message 
 . 
 _pb 
 . 
 HasField 
 ( 
 "end_interaction" 
 ): 
 logger 
 . 
 info 
 ( 
 "End interaction detected." 
 ) 
 return 
 False 
 # Signal to *not* restart the loop (exit) 
 if 
 query_result 
 . 
 intent 
 and 
 query_result 
 . 
 intent 
 . 
 display_name 
 : 
 logger 
 . 
 info 
 ( 
 f 
 "Detected intent: 
 { 
 query_result 
 . 
 intent 
 . 
 display_name 
 } 
 " 
 ) 
 # ensure audio stream restarts 
 return 
 True 
 elif 
 response 
 and 
 response 
 . 
 recognition_result 
 : 
 transcript 
 = 
 response 
 . 
 recognition_result 
 . 
 transcript 
 if 
 transcript 
 : 
 if 
 response 
 . 
 recognition_result 
 . 
 is_final 
 : 
 logger 
 . 
 info 
 ( 
 f 
 "Final transcript: 
 { 
 transcript 
 } 
 " 
 ) 
 await 
 audio_queue 
 . 
 put 
 ( 
 None 
 ) 
 # Signal end of input 
 else 
 : 
 print 
 ( 
 colored 
 ( 
 transcript 
 , 
 "yellow" 
 ), 
 end 
 = 
 " 
 \r 
 " 
 , 
 ) 
 else 
 : 
 logger 
 . 
 debug 
 ( 
 "No transcript in recognition result." 
 ) 
 except 
 StopAsyncIteration 
 : 
 logger 
 . 
 debug 
 ( 
 "End of response stream in listen_print_loop" 
 ) 
 break 
 except 
 asyncio 
 . 
 TimeoutError 
 : 
 logger 
 . 
 warning 
 ( 
 "Timeout waiting for response in listen_print_loop" 
 ) 
 continue 
 # Crucial: Continue, don't return, on timeout 
 except 
 Exception 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Error in listen_print_loop: 
 { 
 e 
 } 
 " 
 ) 
 return 
 False 
 # Exit on any error within the loop 
 return 
 True 
 # Always return after the async for loop completes 
 async 
 def 
  
 handle_audio_input_output 
 ( 
 dialogflow_streaming 
 : 
 DialogflowCXStreaming 
 , 
 audioIO 
 : 
 AudioIO 
 , 
 audio_queue 
 : 
 asyncio 
 . 
 Queue 
 , 
 ) 
 - 
> None 
 : 
  
 """Handles audio input and output concurrently.""" 
 async 
 def 
  
 cancel_push_task 
 ( 
 push_task 
 : 
 asyncio 
 . 
 Task 
 | 
 None 
 ) 
 - 
> None 
 : 
  
 """Helper function to cancel push task safely.""" 
 if 
 push_task 
 is 
 not 
 None 
 and 
 not 
 push_task 
 . 
 done 
 (): 
 push_task 
 . 
 cancel 
 () 
 try 
 : 
 await 
 push_task 
 except 
 asyncio 
 . 
 CancelledError 
 : 
 logger 
 . 
 debug 
 ( 
 "Push task cancelled successfully" 
 ) 
 push_task 
 = 
 None 
 try 
 : 
 push_task 
 = 
 asyncio 
 . 
 create_task 
 ( 
 push_to_audio_queue 
 ( 
 audioIO 
 . 
 generator 
 (), 
 audio_queue 
 ) 
 ) 
 while 
 True 
 : 
 # restart streaming here. 
 responses 
 = 
 dialogflow_streaming 
 . 
 streaming_detect_intent 
 ( 
 audio_queue 
 ) 
 should_continue 
 = 
 await 
 listen_print_loop 
 ( 
 responses 
 , 
 audioIO 
 , 
 audio_queue 
 , 
 dialogflow_streaming 
 . 
 dialogflow_timeout 
 , 
 ) 
 if 
 not 
 should_continue 
 : 
 logger 
 . 
 debug 
 ( 
 "End interaction detected, exiting handle_audio_input_output" 
 ) 
 await 
 cancel_push_task 
 ( 
 push_task 
 ) 
 break 
 # exit while loop 
 logger 
 . 
 debug 
 ( 
 "Restarting audio streaming loop" 
 ) 
 except 
 asyncio 
 . 
 CancelledError 
 : 
 logger 
 . 
 warning 
 ( 
 "Handling of audio input/output was cancelled." 
 ) 
 await 
 cancel_push_task 
 ( 
 push_task 
 ) 
 except 
 Exception 
 as 
 e 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "An unexpected error occurred: 
 { 
 e 
 } 
 " 
 ) 
 async 
 def 
  
 main 
 ( 
 agent_name 
 : 
 str 
 , 
 language_code 
 : 
 str 
 = 
 DEFAULT_LANGUAGE_CODE 
 , 
 single_utterance 
 : 
 bool 
 = 
 False 
 , 
 model 
 : 
 str 
 | 
 None 
 = 
 None 
 , 
 voice 
 : 
 str 
 | 
 None 
 = 
 None 
 , 
 sample_rate 
 : 
 int 
 = 
 DEFAULT_SAMPLE_RATE 
 , 
 dialogflow_timeout 
 : 
 float 
 = 
 DEFAULT_DIALOGFLOW_TIMEOUT 
 , 
 debug 
 : 
 bool 
 = 
 False 
 , 
 ) 
 - 
> None 
 : 
  
 """Start bidirectional streaming from microphone input to speech API""" 
 chunk_size 
 = 
 int 
 ( 
 sample_rate 
 * 
 CHUNK_SECONDS 
 ) 
 audioIO 
 = 
 AudioIO 
 ( 
 sample_rate 
 , 
 chunk_size 
 ) 
 dialogflow_streaming 
 = 
 DialogflowCXStreaming 
 ( 
 agent_name 
 , 
 language_code 
 , 
 single_utterance 
 , 
 model 
 , 
 voice 
 , 
 sample_rate 
 , 
 dialogflow_timeout 
 , 
 debug 
 , 
 ) 
 logger 
 . 
 info 
 ( 
 f 
 "Chunk size: 
 { 
 audioIO 
 . 
 chunk_size 
 } 
 " 
 ) 
 logger 
 . 
 info 
 ( 
 f 
 "Using input device: 
 { 
 audioIO 
 . 
 input_device_name 
 } 
 " 
 ) 
 logger 
 . 
 info 
 ( 
 f 
 "Using output device: 
 { 
 audioIO 
 . 
 output_device_name 
 } 
 " 
 ) 
 # Signal handler function 
 def 
  
 signal_handler 
 ( 
 sig 
 : 
 int 
 , 
 frame 
 : 
 any 
 ) 
 - 
> None 
 : 
 print 
 ( 
 colored 
 ( 
 " 
 \n 
 Exiting gracefully..." 
 , 
 "yellow" 
 )) 
 audioIO 
 . 
 closed 
 = 
 True 
 # Signal to stop the main loop 
 sys 
 . 
 exit 
 ( 
 0 
 ) 
 # Set the signal handler for Ctrl+C (SIGINT) 
 signal 
 . 
 signal 
 ( 
 signal 
 . 
 SIGINT 
 , 
 signal_handler 
 ) 
 with 
 audioIO 
 : 
 logger 
 . 
 info 
 ( 
 f 
 "NEW REQUEST: 
 { 
 get_current_time 
 () 
  
 / 
  
 1000 
 } 
 " 
 ) 
 audio_queue 
 = 
 asyncio 
 . 
 Queue 
 () 
 try 
 : 
 # Apply overall timeout to the entire interaction 
 await 
 asyncio 
 . 
 wait_for 
 ( 
 handle_audio_input_output 
 ( 
 dialogflow_streaming 
 , 
 audioIO 
 , 
 audio_queue 
 ), 
 timeout 
 = 
 dialogflow_streaming 
 . 
 dialogflow_timeout 
 , 
 ) 
 except 
 asyncio 
 . 
 TimeoutError 
 : 
 logger 
 . 
 error 
 ( 
 f 
 "Dialogflow interaction timed out after 
 { 
 dialogflow_streaming 
 . 
 dialogflow_timeout 
 } 
 seconds." 
 ) 
 if 
 __name__ 
 == 
 "__main__" 
 : 
 parser 
 = 
 argparse 
 . 
 ArgumentParser 
 ( 
 description 
 = 
 __doc__ 
 , 
 formatter_class 
 = 
 argparse 
 . 
 RawDescriptionHelpFormatter 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "agent_name" 
 , 
 help 
 = 
 "Agent Name" 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--language_code" 
 , 
 type 
 = 
 str 
 , 
 default 
 = 
 DEFAULT_LANGUAGE_CODE 
 , 
 help 
 = 
 "Specify the language code (default: en-US)" 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--single_utterance" 
 , 
 action 
 = 
 "store_true" 
 , 
 help 
 = 
 "Enable single utterance mode (default: False)" 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--model" 
 , 
 type 
 = 
 str 
 , 
 default 
 = 
 None 
 , 
 help 
 = 
 "Specify the speech recognition model to use (default: None)" 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--voice" 
 , 
 type 
 = 
 str 
 , 
 default 
 = 
 None 
 , 
 help 
 = 
 "Specify the voice for output audio (default: None)" 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--sample_rate" 
 , 
 type 
 = 
 int 
 , 
 default 
 = 
 DEFAULT_SAMPLE_RATE 
 , 
 help 
 = 
 "Specify the sample rate in Hz (default: 16000)" 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--dialogflow_timeout" 
 , 
 type 
 = 
 float 
 , 
 default 
 = 
 DEFAULT_DIALOGFLOW_TIMEOUT 
 , 
 help 
 = 
 "Specify the Dialogflow API timeout in seconds (default: 60)" 
 , 
 ) 
 parser 
 . 
 add_argument 
 ( 
 "--debug" 
 , 
 action 
 = 
 "store_true" 
 , 
 help 
 = 
 "Enable debug logging" 
 , 
 ) 
 args 
 = 
 parser 
 . 
 parse_args 
 () 
 asyncio 
 . 
 run 
 ( 
 main 
 ( 
 args 
 . 
 agent_name 
 , 
 args 
 . 
 language_code 
 , 
 args 
 . 
 single_utterance 
 , 
 args 
 . 
 model 
 , 
 args 
 . 
 voice 
 , 
 args 
 . 
 sample_rate 
 , 
 args 
 . 
 dialogflow_timeout 
 , 
 args 
 . 
 debug 
 , 
 ) 
 ) 
 

Streaming detect intent with partial response enabled

The following samples show how to use streaming detect intent with partial responses.

Java

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.api.gax.rpc. ApiException 
 
 ; 
 import 
  
 com.google.api.gax.rpc. BidiStream 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. AudioEncoding 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. AudioInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. InputAudioConfig 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. OutputAudioConfig 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. OutputAudioEncoding 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. QueryInput 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionName 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsClient 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SessionsSettings 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SsmlVoiceGender 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. StreamingDetectIntentRequest 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. StreamingDetectIntentResponse 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. SynthesizeSpeechConfig 
 
 ; 
 import 
  
 com.google.cloud.dialogflow.cx.v3. VoiceSelectionParams 
 
 ; 
 import 
  
 com.google.protobuf. ByteString 
 
 ; 
 import 
  
 java.io.FileInputStream 
 ; 
 import 
  
 java.io.IOException 
 ; 
 public 
  
 class 
 DetectIntentStreamingPartialResponse 
  
 { 
  
 // DialogFlow API Detect Intent sample with audio files 
  
 // that processes as an audio stream. 
  
 public 
  
 static 
  
 void 
  
 detectIntentStreamingPartialResponse 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 locationId 
 , 
  
 String 
  
 agentId 
 , 
  
 String 
  
 sessionId 
 , 
  
 String 
  
 audioFilePath 
 ) 
  
 throws 
  
  ApiException 
 
 , 
  
 IOException 
  
 { 
  
  SessionsSettings 
 
 . 
 Builder 
  
 sessionsSettingsBuilder 
  
 = 
  
  SessionsSettings 
 
 . 
 newBuilder 
 (); 
  
 if 
  
 ( 
 locationId 
 . 
 equals 
 ( 
 "global" 
 )) 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 "dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
 else 
  
 { 
  
 sessionsSettingsBuilder 
 . 
 setEndpoint 
 ( 
 locationId 
  
 + 
  
 "-dialogflow.googleapis.com:443" 
 ); 
  
 } 
  
  SessionsSettings 
 
  
 sessionsSettings 
  
 = 
  
 sessionsSettingsBuilder 
 . 
 build 
 (); 
  
 // Instantiates a client by setting the session name. 
  
 // Format:`projects/<ProjectID>/locations/<LocationID>/agents/<AgentID>/sessions/<SessionID>` 
  
 // Using the same `sessionId` between requests allows continuation of the conversation. 
  
 // Note: close() needs to be called on the SessionsClient object to clean up resources 
  
 // such as threads. In the example below, try-with-resources is used, 
  
 // which automatically calls close(). 
  
 try 
  
 ( 
  SessionsClient 
 
  
 sessionsClient 
  
 = 
  
  SessionsClient 
 
 . 
 create 
 ( 
 sessionsSettings 
 )) 
  
 { 
  
  SessionName 
 
  
 session 
  
 = 
  
  SessionName 
 
 . 
 of 
 ( 
 projectId 
 , 
  
 locationId 
 , 
  
 agentId 
 , 
  
 sessionId 
 ); 
  
 // Instructs the speech recognizer how to process the audio content. 
  
 // Note: hard coding audioEncoding and sampleRateHertz for simplicity. 
  
 // Audio encoding of the audio content sent in the query request. 
  
  InputAudioConfig 
 
  
 inputAudioConfig 
  
 = 
  
  InputAudioConfig 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
  AudioEncoding 
 
 . 
 AUDIO_ENCODING_LINEAR_16 
 ) 
  
 . 
 setSampleRateHertz 
 ( 
 16000 
 ) 
  
 // sampleRateHertz = 16000 
  
 . 
 build 
 (); 
  
 // Build the AudioInput with the InputAudioConfig. 
  
  AudioInput 
 
  
 audioInput 
  
 = 
  
  AudioInput 
 
 . 
 newBuilder 
 (). 
  setConfig 
 
 ( 
 inputAudioConfig 
 ). 
 build 
 (); 
  
 // Build the query with the InputAudioConfig. 
  
  QueryInput 
 
  
 queryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
 audioInput 
 ) 
  
 . 
 setLanguageCode 
 ( 
 "en-US" 
 ) 
  
 // languageCode = "en-US" 
  
 . 
 build 
 (); 
  
 // Create the Bidirectional stream 
  
 BidiStream<StreamingDetectIntentRequest 
 , 
  
 StreamingDetectIntentResponse 
>  
 bidiStream 
  
 = 
  
 sessionsClient 
 . 
  streamingDetectIntentCallable 
 
 (). 
 call 
 (); 
  
 // Specify sssml name and gender 
  
  VoiceSelectionParams 
 
  
 voiceSelection 
  
 = 
  
 // Voices that are available https://cloud.google.com/text-to-speech/docs/voices 
  
  VoiceSelectionParams 
 
 . 
 newBuilder 
 () 
  
 . 
 setName 
 ( 
 "en-GB-Standard-A" 
 ) 
  
 . 
  setSsmlGender 
 
 ( 
  SsmlVoiceGender 
 
 . 
 SSML_VOICE_GENDER_FEMALE 
 ) 
  
 . 
 build 
 (); 
  
  SynthesizeSpeechConfig 
 
  
 speechConfig 
  
 = 
  
  SynthesizeSpeechConfig 
 
 . 
 newBuilder 
 (). 
  setVoice 
 
 ( 
 voiceSelection 
 ). 
 build 
 (); 
  
 // Setup audio config 
  
  OutputAudioConfig 
 
  
 audioConfig 
  
 = 
  
 // Output encoding explanation 
  
 // https://cloud.google.com/dialogflow/cx/docs/reference/rpc/google.cloud.dialogflow.cx.v3#outputaudioencoding 
  
  OutputAudioConfig 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudioEncoding 
 ( 
  OutputAudioEncoding 
 
 . 
 OUTPUT_AUDIO_ENCODING_UNSPECIFIED 
 ) 
  
 . 
 setAudioEncodingValue 
 ( 
 1 
 ) 
  
 . 
  setSynthesizeSpeechConfig 
 
 ( 
 speechConfig 
 ) 
  
 . 
 build 
 (); 
  
  StreamingDetectIntentRequest 
 
  
 streamingDetectIntentRequest 
  
 = 
  
  StreamingDetectIntentRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setSession 
 ( 
 session 
 . 
  toString 
 
 ()) 
  
 . 
 setQueryInput 
 ( 
 queryInput 
 ) 
  
 . 
  setEnablePartialResponse 
 
 ( 
 true 
 ) 
  
 . 
 setOutputAudioConfig 
 ( 
 audioConfig 
 ) 
  
 . 
 build 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 streamingDetectIntentRequest 
 . 
 toString 
 ()); 
  
 // The first request must **only** contain the audio configuration: 
  
 bidiStream 
 . 
 send 
 ( 
 streamingDetectIntentRequest 
 ); 
  
 try 
  
 ( 
 FileInputStream 
  
 audioStream 
  
 = 
  
 new 
  
 FileInputStream 
 ( 
 audioFilePath 
 )) 
  
 { 
  
 // Subsequent requests must **only** contain the audio data. 
  
 // Following messages: audio chunks. We just read the file in fixed-size chunks. In reality 
  
 // you would split the user input by time. 
  
 byte 
 [] 
  
 buffer 
  
 = 
  
 new 
  
 byte 
 [ 
 4096 
 ] 
 ; 
  
 int 
  
 bytes 
 ; 
  
 while 
  
 (( 
 bytes 
  
 = 
  
 audioStream 
 . 
 read 
 ( 
 buffer 
 )) 
  
 != 
  
 - 
 1 
 ) 
  
 { 
  
  AudioInput 
 
  
 subAudioInput 
  
 = 
  
  AudioInput 
 
 . 
 newBuilder 
 (). 
 setAudio 
 ( 
  ByteString 
 
 . 
  copyFrom 
 
 ( 
 buffer 
 , 
  
 0 
 , 
  
 bytes 
 )). 
 build 
 (); 
  
  QueryInput 
 
  
 subQueryInput 
  
 = 
  
  QueryInput 
 
 . 
 newBuilder 
 () 
  
 . 
 setAudio 
 ( 
 subAudioInput 
 ) 
  
 . 
 setLanguageCode 
 ( 
 "en-US" 
 ) 
  
 // languageCode = "en-US" 
  
 . 
 build 
 (); 
  
 bidiStream 
 . 
 send 
 ( 
  
  StreamingDetectIntentRequest 
 
 . 
 newBuilder 
 (). 
 setQueryInput 
 ( 
 subQueryInput 
 ). 
 build 
 ()); 
  
 } 
  
 } 
  
 // Tell the service you are done sending data. 
  
 bidiStream 
 . 
 closeSend 
 (); 
  
 // TODO: Uncomment to print detectIntentResponse. 
  
 //   for (StreamingDetectIntentResponse response : bidiStream) { 
  
 //     QueryResult queryResult = response.getDetectIntentResponse().getQueryResult(); 
  
 //     System.out.println("===================="); 
  
 //     System.out.format("Query Text: '%s'\n", queryResult.getTranscript()); 
  
 //     System.out.format( 
  
 //         "Detected Intent: %s (confidence: %f)\n", 
  
 //         queryResult.getIntent() 
  
 //         .getDisplayName(), queryResult.getIntentDetectionConfidence()); 
  
 //   } 
  
 } 
  
 } 
 } 
 

Node.js

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample. 
 */ 
 // const projectId = 'my-project'; 
 // const location = 'global'; 
 // const agentId = 'my-agent'; 
 // const audioFileName = '/path/to/audio.raw'; 
 // const encoding = 'AUDIO_ENCODING_LINEAR_16'; 
 // const sampleRateHertz = 16000; 
 // const languageCode = 'en'; 
 const 
  
 { 
 SessionsClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/dialogflow-cx 
' 
 ); 
 /** 
 * Example for regional endpoint: 
 *   const location = 'us-central1' 
 *   const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) 
 */ 
 const 
  
 client 
  
 = 
  
 new 
  
  SessionsClient 
 
 (); 
 const 
  
 fs 
  
 = 
  
 require 
 ( 
 'fs' 
 ); 
 const 
  
 util 
  
 = 
  
 require 
 ( 
 'util' 
 ); 
 const 
  
 { 
 Transform 
 , 
  
 pipeline 
 } 
  
 = 
  
 require 
 ( 
 'stream' 
 ); 
 const 
  
 pump 
  
 = 
  
 util 
 . 
 promisify 
 ( 
 pipeline 
 ); 
 async 
  
 function 
  
 streamingDetectIntentPartialResponse 
 () 
  
 { 
  
 const 
  
 sessionId 
  
 = 
  
 Math 
 . 
 random 
 (). 
 toString 
 ( 
 36 
 ). 
 substring 
 ( 
 7 
 ); 
  
 const 
  
 sessionPath 
  
 = 
  
 client 
 . 
 projectLocationAgentSessionPath 
 ( 
  
 projectId 
 , 
  
 location 
 , 
  
 agentId 
 , 
  
 sessionId 
  
 ); 
  
 const 
  
 request 
  
 = 
  
 { 
  
 session 
 : 
  
 sessionPath 
 , 
  
 queryInput 
 : 
  
 { 
  
 audio 
 : 
  
 { 
  
 config 
 : 
  
 { 
  
 audio_encoding 
 : 
  
 encoding 
 , 
  
 sampleRateHertz 
 : 
  
 sampleRateHertz 
 , 
  
 singleUtterance 
 : 
  
 true 
 , 
  
 }, 
  
 }, 
  
 languageCode 
 : 
  
 languageCode 
 , 
  
 }, 
  
 enablePartialResponse 
 : 
  
 true 
 , 
  
 }; 
  
 const 
  
 stream 
  
 = 
  
 await 
  
 client 
 . 
 streamingDetectIntent 
 (); 
  
 stream 
 . 
 on 
 ( 
 'data' 
 , 
  
 data 
  
 = 
>  
 { 
  
 if 
  
 ( 
 data 
 . 
 detectIntentResponse 
 ) 
  
 { 
  
 const 
  
 result 
  
 = 
  
 data 
 . 
 detectIntentResponse 
 . 
 queryResult 
 ; 
  
 for 
  
 ( 
 const 
  
 message 
  
 of 
  
 result 
 . 
 responseMessages 
 ) 
  
 { 
  
 if 
  
 ( 
 message 
 . 
 text 
 ) 
  
 { 
  
 console 
 . 
 log 
 ( 
 `Agent Response: 
 ${ 
 message 
 . 
 text 
 . 
 text 
 } 
 ` 
 ); 
  
 } 
  
 } 
  
 } 
  
 }); 
  
 stream 
 . 
 on 
 ( 
 'error' 
 , 
  
 err 
  
 = 
>  
 { 
  
 console 
 . 
 log 
 ( 
 err 
 ); 
  
 }); 
  
 stream 
 . 
 on 
 ( 
 'end' 
 , 
  
 () 
  
 = 
>  
 { 
  
 /* API call completed */ 
  
 }); 
  
 stream 
 . 
 write 
 ( 
 request 
 ); 
  
 // Stream the audio from audio file to Dialogflow. 
  
 await 
  
 pump 
 ( 
  
 fs 
 . 
 createReadStream 
 ( 
 audioFileName 
 ), 
  
 // Format the audio stream into the request format. 
  
 new 
  
 Transform 
 ({ 
  
 objectMode 
 : 
  
 true 
 , 
  
 transform 
 : 
  
 ( 
 obj 
 , 
  
 _ 
 , 
  
 next 
 ) 
  
 = 
>  
 { 
  
 next 
 ( 
 null 
 , 
  
 { 
 queryInput 
 : 
  
 { 
 audio 
 : 
  
 { 
 audio 
 : 
  
 obj 
 }}}); 
  
 }, 
  
 }), 
  
 stream 
  
 ); 
 } 
 streamingDetectIntentPartialResponse 
 (); 
 

Python

To authenticate to Dialogflow, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 uuid 
 from 
  
 google.cloud.dialogflowcx_v3.services.sessions 
  
 import 
 SessionsClient 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 audio_config 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 InputAudioConfig 
 from 
  
 google.cloud.dialogflowcx_v3.types 
  
 import 
 session 
 def 
  
 run_sample 
 (): 
  
 """ 
 TODO(developer): Modify these variables before running the sample. 
 """ 
 project_id 
 = 
 "YOUR-PROJECT-ID" 
 location 
 = 
 "YOUR-LOCATION-ID" 
 agent_id 
 = 
 "YOUR-AGENT-ID" 
 audio_file_name 
 = 
 "YOUR-AUDIO-FILE-PATH" 
 encoding 
 = 
 "AUDIO_ENCODING_LINEAR_16" 
 sample_rate_hertz 
 = 
 16000 
 language_code 
 = 
 "en" 
 streaming_detect_intent_partial_response 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 audio_file_name 
 , 
 encoding 
 , 
 sample_rate_hertz 
 , 
 language_code 
 , 
 ) 
 def 
  
 streaming_detect_intent_partial_response 
 ( 
 project_id 
 , 
 location 
 , 
 agent_id 
 , 
 audio_file_name 
 , 
 encoding 
 , 
 sample_rate_hertz 
 , 
 language_code 
 , 
 ): 
 client_options 
 = 
 None 
 if 
 location 
 != 
 "global" 
 : 
 api_endpoint 
 = 
 f 
 " 
 { 
 location 
 } 
 -dialogflow.googleapis.com:443" 
 print 
 ( 
 f 
 "API Endpoint: 
 { 
 api_endpoint 
 } 
 \n 
 " 
 ) 
 client_options 
 = 
 { 
 "api_endpoint" 
 : 
 api_endpoint 
 } 
 session_client 
 = 
 SessionsClient 
 ( 
 client_options 
 = 
 client_options 
 ) 
 session_id 
 = 
 str 
 ( 
 uuid 
 . 
 uuid4 
 ()) 
 session_path 
 = 
 session_client 
 . 
 session_path 
 ( 
 project 
 = 
 project_id 
 , 
 location 
 = 
 location 
 , 
 agent 
 = 
 agent_id 
 , 
 session 
 = 
 session_id 
 , 
 ) 
 def 
  
 request_generator 
 (): 
 audio_encoding 
 = 
 audio_config 
 . 
 AudioEncoding 
 [ 
 encoding 
 ] 
 config 
 = 
 InputAudioConfig 
 ( 
 audio_encoding 
 = 
 audio_encoding 
 , 
 sample_rate_hertz 
 = 
 sample_rate_hertz 
 , 
 single_utterance 
 = 
 True 
 , 
 ) 
 audio_input 
 = 
 session 
 . 
 AudioInput 
 ( 
 config 
 = 
 config 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 audio 
 = 
 audio_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 yield 
 session 
 . 
 StreamingDetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 enable_partial_response 
 = 
 True 
 , 
 ) 
 # Here we are reading small chunks of audio data from a local 
 # audio file.  In practice these chunks should come from 
 # an audio input device. 
 with 
 open 
 ( 
 audio_file_name 
 , 
 "rb" 
 ) 
 as 
 audio_file 
 : 
 while 
 True 
 : 
 chunk 
 = 
 audio_file 
 . 
 read 
 ( 
 4096 
 ) 
 if 
 not 
 chunk 
 : 
 break 
 # The later requests contains audio data. 
 audio_input 
 = 
 session 
 . 
 AudioInput 
 ( 
 audio 
 = 
 chunk 
 , 
 config 
 = 
 config 
 ) 
 query_input 
 = 
 session 
 . 
 QueryInput 
 ( 
 audio 
 = 
 audio_input 
 , 
 language_code 
 = 
 language_code 
 ) 
 yield 
 session 
 . 
 StreamingDetectIntentRequest 
 ( 
 session 
 = 
 session_path 
 , 
 query_input 
 = 
 query_input 
 , 
 enable_partial_response 
 = 
 True 
 , 
 ) 
 responses 
 = 
 session_client 
 . 
 streaming_detect_intent 
 ( 
 requests 
 = 
 request_generator 
 ()) 
 print 
 ( 
 "=" 
 * 
 20 
 ) 
 for 
 response 
 in 
 responses 
 : 
 print 
 ( 
 f 
 'Intermediate transcript: " 
 { 
 response 
 . 
 recognition_result 
 . 
 transcript 
 } 
 ".' 
 ) 
 # Note: The result from the last response is the final transcript along 
 # with the detected content. 
 response 
 = 
 response 
 . 
 detect_intent_response 
 print 
 ( 
 f 
 "Query text: 
 { 
 response 
 . 
 query_result 
 . 
 transcript 
 } 
 " 
 ) 
 response_messages 
 = 
 [ 
 " " 
 . 
 join 
 ( 
 msg 
 . 
 text 
 . 
 text 
 ) 
 for 
 msg 
 in 
 response 
 . 
 query_result 
 . 
 response_messages 
 ] 
 print 
 ( 
 f 
 "Response text: 
 { 
 ' ' 
 . 
 join 
 ( 
 response_messages 
 ) 
 } 
 \n 
 " 
 ) 
 
Design a Mobile Site
View Site in Mobile | Classic
Share by: