Разработчик Twilio здесь.
Я думаю, что проблема заключается в том, что <Gather>
не настроен на прослушивание звонящих, если они начинают говорить во время части разговора <Say>
.
Ваш TwiML из кода, которым вы поделились, выглядит примерно так:
<Response>
<Say>Welcome to Twilio, please tell us why you're calling</Say>
<Gather input="speech" timeout="5" action="https://f2b4fbc1.ngrok.io/asr/test"></Gather>
</Response>
Итак, <Gather>
начинает слушать только после завершения <Say>
.
Вместо этого вы должны вкладывать <Say>
в <Gather>
, чтобы сделать TwiML следующим образом:
<Response>
<Gather input="speech" timeout="5" action="https://f2b4fbc1.ngrok.io/asr/test">
<Say>Welcome to Twilio, please tell us why you're calling</Say>
</Gather>
</Response>
Код для этого должен выглядеть так:
Say say = new Say.Builder("Welcome to Twilio, please tell us why you're calling").build();
Gather gather = new Gather.Builder().input(Gather.Input.SPEECH).timeout(5).action("https://f2b4fbc1.ngrok.io/asr/test").say(say).build();
VoiceResponse response = new VoiceResponse.Builder().gather(gather).build();
Дайте мне знать, если это поможет.
[править]
Я также считаю, что вам нужно установить тип содержимого при возврате XML. Я не разработчик Spring / Java, но вот что я думаю, вам нужно изменить
@RequestMapping(method = RequestMethod.POST, value = "/recordTheSpeech", produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<String> recordTheSpeech() throws IOException {
Say say = new Say.Builder("Welcome to Twilio, please tell us why you're calling").build();
Gather gather = new Gather.Builder().input(Gather.Input.SPEECH).timeout(5).action("https://f2b4fbc1.ngrok.io/asr/test").say(say).build();
VoiceResponse response = new VoiceResponse.Builder().gather(gather).build();
return new ResponseEntity.ok().body(response.toXml());
}