본문으로 건너뛰기

Make the first API call

SpeechToText API 호출 순서와 API로 구현할 수 있는 시나리오 예제를 설명합니다. SpeechToText SDK는 SERVER, ON DEVICE, HYBRID Mode를 제공하고 앱에서 설정하지 않으면 HYBRID MODE가 기본 설정됩니다.

API 호출 순서

Initialize SDK

SpeechToText SDK를 시작할 때 앱에서 원하는 모드 설정과 함께 initialize API를 호출하여 SpeechToText SDK를 초기화합니다.


enum class Mode {
HYBRID, // 네트워크가 연결되지 않을 경우 SDK 에서 상황에 맞게 OnDevice 음성인식을 연결합니다.
SERVER, // 네트워크가 연결되어 있을 경우에만 음성인식을 연결합니다.
ON_DEVICE // OnDevice 음성인식을 연결합니다.
}

val speechToText = SpeechToText(context, Mode.HYBRID) // Mode 설정

speechToText.initialize();

Add Listener

SpeechToText 앱을 등록하기 전에 addListener API를 호출하여 SpeechToText 이벤트 콜백을 등록합니다.

speechToText.addListener(object: ResultListener { 
override fun onUpdated(stt: String, completed: Boolean) {
// stt : 인식된 텍스트 결과
// completed : True 일 경우 사용자의 음성이 인식 완료된 상태입니다.
}

override fun onUpdatedEpdData(on: Long, off: Long) {
// on : 사용자의 음성 시작 지점의 Buffer Size 를 Byte 값으로 전달 합니다.
// off : 사용자의 음성 끝 지점의 Buffer Size 를 Byte 값으로 전달 합니다.
}

override fun onStartedRecognition() {
// 사용자의 음성이 시작되었음을 알려 줍니다.
}

override fun onEndedRecognition() {
// 사용자의 음성인식 과정이 끝났음을 알려 줍니다.
}

override fun onError() {
// 사용자의 음성인식 과정 중 에러가 발생한 경우를 알려 줍니다.
}

override fun onReady() {
// 사용자의 마이크를 통해서 말을 할 수 있는 상태를 알려 줍니다.
}
})

Register App

registerApp API를 호출하여 앱을 Speech 서버에 등록합니다. MODE 가 ON_DEVICE 일 경우에는 이 API를 사용할 필요는 없습니다.

val clientID = "your_client_id"
val clientSecret = "your_client_secret"
speechToText.registerApp(clientID, clientSecret, object : OnServerConnectionListener {
override fun onConnected() {
// Speech 서버에 등록이 완료되면 앱은 이벤트를 받을 수 있습니다.
}

override fun onFailed(msg: String) {
// Speech 서버 등록 실패가 일어나면 에러 메시지와 함께 이벤트를 앱으로 전달 합니다.
}
})

Remove Listener

앱을 종료하기에 앞서 등록했던 이벤트 콜백을 해제합니다. 이벤트 콜백을 해제하려면 removeListener API를 호출합니다.

speechToText.removeListener(listener: ResultListener)

Release SDK

release API를 호출하여 SpeechToText SDK 리소스를 해제합니다.

speechToText.release()

API 사용 시나리오 예시

1. SpeechToText 음성입력 시작/중지

다음은 SpeechToText 음성 입력을 시작하고 중지하는 예제 코드입니다.

speechToText.request()
speechToText.addListener(object: ResultListener {
override fun onUpdated(stt: String, completed: Boolean) {
// 예) 안
// 예) 안녕
// 예) 안녕하
// 예) 안녕하세
// 예) 안녕하세요. complete(true)
}

override fun onUpdatedEpdData(on: Long, off: Long) {
// 예) on(0) off(3200)
}

override fun onStartedRecognition() {
}

override fun onEndedRecognition() {
}

override fun onError() {
}
})


speechToText.stop()

2. Audio 데이터 전송

다음은 Audio 데이터를 전송하는 예제 코드입니다. 한 번에 데이터를 전송할 수 있고 최소 100ms 마다 데이터를 전송할 수도 있습니다. 주기적으로 데이터를 전송할 경우 전송이 끝나는 시점에 completeAudioSend API 를 호출해야 합니다.

- 하나의 데이터를 전송하는 경우
context.assets.open("test_audio.pcm").readBytes().also {
speechToText.sendAudio(it)
}

- 여러 번 데이터를 나눠서 전송하는 경우
var offset = 0
val testPCM = assets.open("call_test_audio.pcm").readAllBytes()

while (offset < testPCM.size) {
val end = (offset + 3200).coerceAtMost(testPCM.size)
val chunk = testPCM.copyOfRange(offset, end)
offset += BYTES_IN_100_MS
speechToText.sendAudio(chunk)
Thread.sleep(100L)
}

- 데이터를 다 전송하면 completeAudioSend API 를 호출 합니다.
speechToText.completeAudioSend()