Detect intent with audio input file
Stay organized with collections
Save and categorize content based on your preferences.
This guide shows how to send audio input to a detect intent request using the API.
Dialogflow processes the audio and converts it to text before attempting an intent match.
This conversion is known as
audio input, speech recognition, speech-to-text, or STT.
Before you begin
This feature is only applicable when using the API for
end-user interactions.
If you are using an
integration,
you can skip this guide.
You should do the following before reading this guide:
Click Create Agent in the left sidebar menu.
(If you already have other agents, click the agent name,
scroll to the bottom and click Create new agent.)
Enter your agent's name, default language, and default time zone.
If you have already created a project, enter that project.
If you want to allow the Dialogflow Console to create the project,
select Create a new Google project.
Click the Create button.
Import the example file to your agent
The steps in this guide make assumptions about your agent,
so you need to
import
an agent prepared for this guide.
When importing, these steps use the restore option,
which overwrites all agent settings, intents, and entities.
Click the
settings settings button
next to the agent name.
Select the Export and Import tab.
Select Restore From Zip
and follow instructions to restore the zip file that you downloaded.
Detect intent
To detect intent,
call the detectIntent method on the
Sessions
type.
REST
Download the
book-a-room.wav
sample input audio file,
which says "book a room".
The audio file must be base64 encoded for this example,
so it can be provided in the JSON request below.
Here is a Linux example:
Copy the request body and open the
method reference page.
The APIs Explorer panel opens on the right side of the page.
You can interact with this tool to send requests.
Paste the request body in this tool, complete any other required fields, and click Execute.
You should receive a JSON response similar to the following:
{
"responseId": "3c1e5a89-75b9-4c3f-b63d-4b1351dd5e32",
"queryResult": {
"queryText": "book a room",
"action": "room.reservation",
"parameters": {
"time": "",
"date": "",
"guests": "",
"duration": "",
"location": ""
},
"fulfillmentText": "I can help with that. Where would you like to reserve a room?",
"fulfillmentMessages": [
{
"text": {
"text": [
"I can help with that. Where would you like to reserve a room?"
]
}
}
],
"intent": {
"name": "projects/PROJECT_ID/agent/intents/e8f6a63e-73da-4a1a-8bfc-857183f71228",
"displayName": "room.reservation"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {},
"languageCode": "en-us"
}
}
Notice that the value of the queryResult.action field is "room.reservation",
and the value of the queryResult.fulfillmentMessages[0|1].text.text[0]
field asks the user for more information.
funcDetectIntentAudio(projectID,sessionID,audioFile,languageCodestring)(string,error){ctx:=context.Background()sessionClient,err:=dialogflow.NewSessionsClient(ctx)iferr!=nil{return"",err}defersessionClient.Close()ifprojectID==""||sessionID==""{return"",fmt.Errorf("detect.DetectIntentAudio empty project (%s) or session (%s)",projectID,sessionID)}sessionPath:=fmt.Sprintf("projects/%s/agent/sessions/%s",projectID,sessionID)// In this example, we hard code the encoding and sample rate for simplicity.audioConfig:=dialogflowpb.InputAudioConfig{AudioEncoding:dialogflowpb.AudioEncoding_AUDIO_ENCODING_LINEAR_16,SampleRateHertz:16000,LanguageCode:languageCode}queryAudioInput:=dialogflowpb.QueryInput_AudioConfig{AudioConfig:&audioConfig}audioBytes,err:=os.ReadFile(audioFile)iferr!=nil{return"",err}queryInput:=dialogflowpb.QueryInput{Input:&queryAudioInput}request:=dialogflowpb.DetectIntentRequest{Session:sessionPath,QueryInput:&queryInput,InputAudio:audioBytes}response,err:=sessionClient.DetectIntent(ctx,&request)iferr!=nil{return"",err}queryResult:=response.GetQueryResult()fulfillmentText:=queryResult.GetFulfillmentText()returnfulfillmentText,nil}
importcom.google.api.gax.rpc.ApiException;importcom.google.cloud.dialogflow.v2.AudioEncoding;importcom.google.cloud.dialogflow.v2.DetectIntentRequest;importcom.google.cloud.dialogflow.v2.DetectIntentResponse;importcom.google.cloud.dialogflow.v2.InputAudioConfig;importcom.google.cloud.dialogflow.v2.QueryInput;importcom.google.cloud.dialogflow.v2.QueryResult;importcom.google.cloud.dialogflow.v2.SessionName;importcom.google.cloud.dialogflow.v2.SessionsClient;importcom.google.protobuf.ByteString;importjava.io.IOException;importjava.nio.file.Files;importjava.nio.file.Paths;publicclassDetectIntentAudio{// DialogFlow API Detect Intent sample with audio files.publicstaticQueryResultdetectIntentAudio(StringprojectId,StringaudioFilePath,StringsessionId,StringlanguageCode)throwsIOException,ApiException{// Instantiates a clienttry(SessionsClientsessionsClient=SessionsClient.create()){// Set the session name using the sessionId (UUID) and projectID (my-project-id)SessionNamesession=SessionName.of(projectId,sessionId);System.out.println("Session Path: "+session.toString());// Note: hard coding audioEncoding and sampleRateHertz for simplicity.// Audio encoding of the audio content sent in the query request.AudioEncodingaudioEncoding=AudioEncoding.AUDIO_ENCODING_LINEAR_16;intsampleRateHertz=16000;// Instructs the speech recognizer how to process the audio content.InputAudioConfiginputAudioConfig=InputAudioConfig.newBuilder().setAudioEncoding(audioEncoding)// audioEncoding = AudioEncoding.AUDIO_ENCODING_LINEAR_16.setLanguageCode(languageCode)// languageCode = "en-US".setSampleRateHertz(sampleRateHertz)// sampleRateHertz = 16000.build();// Build the query with the InputAudioConfigQueryInputqueryInput=QueryInput.newBuilder().setAudioConfig(inputAudioConfig).build();// Read the bytes from the audio filebyte[]inputAudio=Files.readAllBytes(Paths.get(audioFilePath));// Build the DetectIntentRequestDetectIntentRequestrequest=DetectIntentRequest.newBuilder().setSession(session.toString()).setQueryInput(queryInput).setInputAudio(ByteString.copyFrom(inputAudio)).build();// Performs the detect intent requestDetectIntentResponseresponse=sessionsClient.detectIntent(request);// Display the query resultQueryResultqueryResult=response.getQueryResult();System.out.println("====================");System.out.format("Query Text: '%s'\n",queryResult.getQueryText());System.out.format("Detected Intent: %s (confidence: %f)\n",queryResult.getIntent().getDisplayName(),queryResult.getIntentDetectionConfidence());System.out.format("Fulfillment Text: '%s'\n",queryResult.getFulfillmentMessagesCount() > 0?queryResult.getFulfillmentMessages(0).getText():"Triggered Default Fallback Intent");returnqueryResult;}}}
constfs=require('fs');constutil=require('util');const{struct}=require('pb-util');// Imports the Dialogflow libraryconstdialogflow=require('@google-cloud/dialogflow');// Instantiates a session clientconstsessionClient=newdialogflow.SessionsClient();// The path to identify the agent that owns the created intent.constsessionPath=sessionClient.projectAgentSessionPath(projectId,sessionId);// Read the content of the audio file and send it as part of the request.constreadFile=util.promisify(fs.readFile);constinputAudio=awaitreadFile(filename);constrequest={session:sessionPath,queryInput:{audioConfig:{audioEncoding:encoding,sampleRateHertz:sampleRateHertz,languageCode:languageCode,},},inputAudio:inputAudio,};// Recognizes the speech in the audio and detects its intent.const[response]=awaitsessionClient.detectIntent(request);console.log('Detected intent:');constresult=response.queryResult;// Instantiates a context clientconstcontextClient=newdialogflow.ContextsClient();console.log(` Query: ${result.queryText}`);console.log(` Response: ${result.fulfillmentText}`);if(result.intent){console.log(` Intent: ${result.intent.displayName}`);}else{console.log(' No intent matched.');}constparameters=JSON.stringify(struct.decode(result.parameters));console.log(` Parameters: ${parameters}`);if(result.outputContexts && result.outputContexts.length){console.log(' Output contexts:');result.outputContexts.forEach(context=>{constcontextId=contextClient.matchContextFromProjectAgentSessionContextName(context.name);constcontextParameters=JSON.stringify(struct.decode(context.parameters));console.log(` ${contextId}`);console.log(` lifespan: ${context.lifespanCount}`);console.log(` parameters: ${contextParameters}`);});}
defdetect_intent_audio(project_id,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."""fromgoogle.cloudimportdialogflowsession_client=dialogflow.SessionsClient()# Note: hard coding audio_encoding and sample_rate_hertz for simplicity.audio_encoding=dialogflow.AudioEncoding.AUDIO_ENCODING_LINEAR_16sample_rate_hertz=16000session=session_client.session_path(project_id,session_id)print("Session path: {}\n".format(session))withopen(audio_file_path,"rb")asaudio_file:input_audio=audio_file.read()audio_config=dialogflow.InputAudioConfig(audio_encoding=audio_encoding,language_code=language_code,sample_rate_hertz=sample_rate_hertz,)query_input=dialogflow.QueryInput(audio_config=audio_config)request=dialogflow.DetectIntentRequest(session=session,query_input=query_input,input_audio=input_audio,)response=session_client.detect_intent(request=request)print("="*20)print("Query text: {}".format(response.query_result.query_text))print("Detected intent: {} (confidence: {})\n".format(response.query_result.intent.display_name,response.query_result.intent_detection_confidence,))print("Fulfillment text: {}\n".format(response.query_result.fulfillment_text))
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-05-29 UTC."],[],[]]