리티 음성 검색을 해봤습니다.

12103 단어 Android
이 기사는 Retty Advent Calendar의 다음 날이다.
어제는 초밥@takumi-suzukiMySQL 로그 시각화입니다.
그럼 안드로이드를 사용하는 여러분, "OK Googless 33;"목소리로 검색해요?
응, 나는 내 응용 프로그램으로 시험해 보고 싶어.그래서 해봤어요.٩( 'ω' )و

그 전에 주의사항.


Android의 Voice Interact API는 API Level 23만 지원합니다.
Retty의 Android 애플리케이션은 당연히 더 낮은 API Version을 지원합니다.
이번에는 타겟 SDK 버젼을 24로 설정한 샘플 애플리케이션을 제작했다.
또한 보이스 인터레이션 자체가 불안정하며, 터미널의 Google 보이스 Typing은 영어로 설정되어 있음
그리고 영어 입력법 상황에서만 정상적으로 작동할 수 있다...
그럼 시작합시다.٩( 'ω' )و

하고 싶은 일

  • "OK Google"에 표시된 검색어를 찾아서 응용 프로그램 열기
  • (예) "OK Google, Retty에서 검색"이라고 하면 Retty 사운드 검색 화면
  • 을 엽니다.
  • 열려 있는 애플리케이션을 사용하여 사운드 입력 대기
  • 음성 입력을 키워드로 하고 Retty의 검색 API를 두드려 결과를 표시한다
  • 1 Android API Lebel 24 에서는 지원되지 않습니다 (\;ω;`)
    대신 음성 검색 화면을 수동으로 켰다.

    설치 방법


    그러면 2, 3에 대해서 설치를 해보도록 하겠습니다.

    음성 입력 대기


    API Level 23까지 Voice Intraction 모드
    나는 android.intent.category.VOICE의category가 설정된 Intent에서 시작해야 한다고 기억한다
    APU 레벨24에 추가Activtiy#startLocalVoiceInteraction()돼 있어 언제든지 보이스 인터내셔널 모드로 설정할 수 있다.
    예를 들어 화면을 켤 때 보이스 인터레이션 모드로 들어가면 이 줄은 OK1입니다.편리합니다!!
        override fun onResume() {
            super.onResume()
            this.startLocalVoiceInteraction(Bundle())
        }
    
    그럼 이제 음성 입력을 기다리겠습니다.
    보이스 인터내셔널에 들어가면 불려Activity#onLocalVoiceInteractionStarted()오니 여기서 소리를 기다리자.
        override fun onLocalVoiceInteractionStarted() {
            super.onLocalVoiceInteractionStarted()
            val request = object: VoiceInteractor.PickOptionRequest(VoiceInteractor.Prompt("Say what you eat?"),
                                                                     this.getOptions(),
                                                                     Bundle()) {
                override fun onPickOptionResult(finished: Boolean,
                                                selections: Array<out Option>?,
                                                result: Bundle?) {
                    super.onPickOptionResult(finished, selections, result)
                    val voiceInputWord = selections?.let { it[0].label.toString() }
                    this@VoiceIneractActivity.seachRestaurant(voiceInputWord)
                }
            }
            this.voiceInteractor.submitRequest(request)
        }
    
    대기 상태로 전환하려면 Voice Interactor#submit Request()를 호출해야 하지만 API level 24에 사용되는 Request는 다음 5가지입니다.
    죄송합니다. 음성 입력에 대한 임의의 단어의 Request를 가져오는 사용자2가 없습니다.
    Request
    Description
    AbortVoiceRequest
    Reports that the current interaction can not be complete with voice
    CommandRequest
    Execute a vendor-specific command using the trusted system VoiceInteractionService
    CompleteVoiceRequest
    Reports that the current interaction was successfully completed with voice
    ConfirmationRequest
    Confirms an operation with the user via the trusted system VoiceInteractionService
    PickOptionRequest
    Select a single option from multiple potential options with the user via the trusted system VoiceInteractionService
    이번에는 가장 아래의 PickoptionRequest를 사용합니다.
    PickoptionRequest는 미리 선택할 수 있는 동작을 지정하고 이 동작과 일치할 때만 호출을 되돌려줍니다.
    (일치하지 않으면 사용자의 음성 입력 내용을 얻을 수 없습니다.)
    리티에는 요리의 종류와 가게 구역 등에 대한 일람표가 있다.이번엔 옵션에도 요리의 범주를 더했다.
    PickoptionRequest의 작성기 매개변수는 3개입니다.
    첫 번째는 Proompt입니다.사운드를 입력하라는 메시지가 표시될 때 시스템에서 읽어들이는 문자열을 지정할 수 있습니다.
    두 번째는 Option입니다.요리류의aray에서option을 생성하세요.
        private fun getOptions(): Array<VoiceInteractor.PickOptionRequest.Option> =
                this.getSearchCategoryWords().mapIndexed { index, string ->
                    VoiceInteractor.PickOptionRequest.Option(string, index)
                }.toTypedArray()
    
        private fun getSearchCategoryWords(): Array<String> {
            // 内部からデータを引っ張ってきて["pizza", "steak" , ...]のようなarrayを返すメソッド
        }
    
    
    세 번째 버블은 additional information을 설정할 수 있습니다.이번에는 특별히 필요하지 않아서 공중 버블을 설정했습니다.
    그러면 사용자의 목소리를 기다릴 수 있습니다.

    음성 입력을 키워드로 하고 Retty의 검색 API를 두드려 결과를 표시합니다.


    우선 사용자의 음성 입력을 꺼내 주십시오.
    옵션에 있는 문자열이 사용자의 음성 입력과 일치한다면 PickOptionRequest#onPickOptionResult().
    두 번째 인자의 selections와 일치하는 문자열이 들어갈 수 있기 때문입니다.
    (비어 있음을 주의하십시오.)
    검색 API를 두드려 결과를 표시합니다.
             val request = object: VoiceInteractor.PickOptionRequest(VoiceInteractor.Prompt(""),
                                                                     this.getOptions(),
                                                                     Bundle()) {
                override fun onPickOptionResult(finished: Boolean,
                                                selections: Array<out Option>?,
                                                result: Bundle?) {
                    super.onPickOptionResult(finished, selections, result)
                    val voiceInputWord = selections?.let { it[0].label.toString() }
                    this@VoiceIneractActivity.seachRestaurant(voiceInputWord)
                }
            }
    
        private fun seachRestaurant(keyWord: String?) {
            // do search and show result
        }
    
    아쉽게도 리티의 API가 공개되지 않아 계속 쓸 수 없지만 이렇게 하면 음성 검색이 가능합니다!! ٩( 'ω' )و

    총결산


    어때요?
    소리 입력이 일본에서 별로 유행하지 않는다는 인상을 주지만 새로운 검색 체험으로 가능성과 꿈도 커진다!!
    사용하기 편한 Request 레벨이 높아지면 장면 사용이 늘어나므로 Google이 기대됩니다.
    코드 예제에서 볼 수 있듯이 Kotlin은 Retty 섹션에서 가져옵니다.원래 Java에 쓰인 코드를 사용하면 새로 추가된 파일의 경우 Java나 Kotlin 모두 가능하다.현재 Kotlin의 비율은 끊임없이 상승하고 있다.귀엽다. 
    Retty에는 사용자를 직접 부르지 않고 "방부"로 부르는 문화가 있다. 

    좋은 웹페이지 즐겨찾기