in dialogflow/detect_intent/detect_intent.go [102:183]
func DetectIntentStream(projectID, sessionID, audioFile, languageCode string) (string, error) {
ctx := context.Background()
sessionClient, err := dialogflow.NewSessionsClient(ctx)
if err != nil {
return "", err
}
defer sessionClient.Close()
if projectID == "" || sessionID == "" {
return "", fmt.Errorf("detect.DetectIntentStream 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}
queryInput := dialogflowpb.QueryInput{Input: &queryAudioInput}
streamer, err := sessionClient.StreamingDetectIntent(ctx)
if err != nil {
return "", err
}
f, err := os.Open(audioFile)
if err != nil {
return "", err
}
defer f.Close()
go func() {
audioBytes := make([]byte, 1024)
request := dialogflowpb.StreamingDetectIntentRequest{Session: sessionPath, QueryInput: &queryInput}
err = streamer.Send(&request)
if err != nil {
log.Fatal(err)
}
for {
_, err := f.Read(audioBytes)
if err == io.EOF {
streamer.CloseSend()
break
}
if err != nil {
log.Fatal(err)
}
request = dialogflowpb.StreamingDetectIntentRequest{InputAudio: audioBytes}
err = streamer.Send(&request)
if err != nil {
log.Fatal(err)
}
}
}()
var queryResult *dialogflowpb.QueryResult
for {
response, err := streamer.Recv()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
recognitionResult := response.GetRecognitionResult()
transcript := recognitionResult.GetTranscript()
log.Printf("Recognition transcript: %s\n", transcript)
queryResult = response.GetQueryResult()
}
fulfillmentText := queryResult.GetFulfillmentText()
return fulfillmentText, nil
}