in api/contactcenteranalysis/analyze_speech.go [51:145]
func (h *handler) analyzeSpeechHandler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
logger := log.Ctx(ctx)
req := &analyzeSpeechRequest{}
if err := hd.DecodeJSONBody(r, req); err != nil {
hd.RespondErrorJSON(w, r, err)
return
}
if req.Config.LanguageCode == "" {
hd.RespondErrorMessage(w, r,
http.StatusBadRequest,
"language_code must be specified")
return
}
wave, err := hd.Base64ToWave(ctx, req.Audio.Content)
if err != nil {
hd.RespondErrorJSON(w, r, err)
return
}
speechReq := &speechpb.RecognizeRequest{
Config: &speechpb.RecognitionConfig{
Encoding: speechpb.RecognitionConfig_LINEAR16,
SampleRateHertz: 48000,
LanguageCode: req.Config.LanguageCode,
EnableAutomaticPunctuation: true,
},
Audio: &speechpb.RecognitionAudio{
AudioSource: &speechpb.RecognitionAudio_Content{Content: wave},
},
}
speechRes, err := h.Speech.Recognize(ctx, speechReq)
if err != nil {
err := hd.Errorf(ctx,
http.StatusInternalServerError,
http.StatusText(http.StatusInternalServerError),
"failed to requeest to Speech.Recognize: %w", err)
hd.RespondErrorJSON(w, r, err)
return
}
if len(speechRes.Results) == 0 {
err := hd.Errorf(ctx,
http.StatusBadRequest,
"no text was recognized",
"no text was recognized")
hd.RespondErrorJSON(w, r, err)
return
}
text := speechRes.Results[0].Alternatives[0].Transcript
logger.Debug().Msgf("recognized text = '%s'", text)
doc, err := buildDocument(ctx, req.Config.LanguageCode, text)
if err != nil {
hd.RespondErrorJSON(w, r, err)
return
}
languageReq := &languagepb.AnnotateTextRequest{
Document: doc,
Features: languageSupportedFeatures[doc.Language],
EncodingType: languagepb.EncodingType_UTF8,
}
logger.Debug().Msgf("%+v", languageReq)
languageRes, err := h.Language.AnnotateText(ctx, languageReq)
if err != nil {
err := hd.Errorf(ctx,
http.StatusInternalServerError,
http.StatusText(http.StatusInternalServerError),
"failed to requeest to Language.AnnotateText: %w", err)
hd.RespondErrorJSON(w, r, err)
return
}
logger.Debug().Msgf("%+v", languageRes)
res := &analyzeSpeechResponse{
Document: &document{
Content: text,
Language: doc.Language,
},
Entities: languageRes.Entities,
DocumentSentiment: languageRes.DocumentSentiment,
Language: req.Config.LanguageCode,
Categories: languageRes.Categories,
}
hd.RespondJSON(w, r, http.StatusOK, res)
}