음성 기능 추가

음성 액션은 웨어러블 환경의 중요한 부분입니다. 사용자는 음성 액션을 통해 작업을 핸즈프리로 신속하게 실행할 수 있습니다. Wear OS by Google은 두 가지 유형의 음성 액션을 제공합니다.

시스템 제공
이 음성 액션은 작업 기반이며 Wear 플랫폼에 내장되어 있습니다. 음성 액션을 말할 때 시작하려는 활동에서 음성 액션을 필터링합니다. 예를 들어 '메모하기', '알람 설정' 등이 있습니다.
앱 제공
이 음성 액션은 앱 기반이며 런처 아이콘처럼 선언합니다. 사용자가 이 음성 액션을 사용하기 위해 "앱 이름 시작"이라고 말하면 지정한 활동이 시작됩니다.

시스템 제공 음성 액션 선언

Wear OS 플랫폼은 '메모하기', '알람 설정' 등의 사용자 액션을 기반으로 하는 여러 가지 음성 인텐트를 제공합니다. 이 때문에 사용자가 실행하려는 작업을 말하면 시스템은 시작할 최상의 활동을 파악할 수 있습니다.

사용자가 음성 액션을 말하면, 앱은 실행된 인텐트를 필터링하여 활동을 시작할 수 있습니다. 백그라운드에서 작업을 실행하기 위해 서비스를 시작하려는 경우, 활동을 시각적 신호로 표시하고 활동에서 서비스를 시작합니다. 시각적 신호를 제거하려면 finish()를 호출합니다.

예를 들어 '메모하기' 명령의 경우 다음 인텐트 필터를 선언하여 MyNoteActivity라는 활동을 시작합니다.

      <activity android:name="MyNoteActivity">
          <intent-filter>
              <action android:name="android.intent.action.SEND" />
              <category android:name="com.google.android.voicesearch.SELF_NOTE" />
          </intent-filter>
      </activity>
    

다음은 Wear 플랫폼에서 지원하는 음성 인텐트 목록입니다.

이름 예시 문구 인텐트
차/택시 부르기 "Ok Google, 택시를 불러 줘"

"Ok Google, 차를 불러 줘"
액션
com.google.android.gms.actions.RESERVE_TAXI_RESERVATION
메모하기 "Ok Google, 메모해 줘"

"Ok Google, 내게 메모해 줘"
액션
android.intent.action.SEND
카테고리
com.google.android.voicesearch.SELF_NOTE
기타
android.content.Intent.EXTRA_TEXT - 메모 본문이 포함된 문자열
알람 설정 "Ok Google, 오전 8시에 알람 설정해 줘"

"Ok Google, 내일 6시에 깨워 줘"
액션
android.intent.action.SET_ALARM
기타
android.provider.AlarmClock.EXTRA_HOUR - 알람 시간이 포함된 정수

android.provider.AlarmClock.EXTRA_MINUTES - 알람 분이 포함된 정수

이 두 가지 기타는 선택사항이며, 둘 다 제공되거나 둘 다 제공되지 않습니다.

타이머 설정 "Ok Google, 타이머를 10분으로 맞춰 줘"
액션
android.intent.action.SET_TIMER
기타
android.provider.AlarmClock.EXTRA_LENGTH - 타이머 길이를 나타내는 1에서 86400(24시간의 초 수) 사이의 정수
스톱워치 시작 "Ok Google, 스톱워치 시작"
액션
com.google.android.wearable.action.STOPWATCH
자전거 타기 시작/중지 "Ok Google, 자전거 타기 시작"

"Ok Google, 내 자전거 타기 시작"

"Ok Google, 자전거 타기 중지"
액션
vnd.google.fitness.TRACK
MIME 형식
vnd.google.fitness.activity/biking
기타
actionStatus - 시작할 때는 ActiveActionStatus 값, 중지할 때는 CompletedActionStatus 값이 포함된 문자열
달리기 시작/중지 "Ok Google, 내 달리기를 추적해 줘"

"Ok Google, 달리기 시작"

"Ok Google, 달리기 중지"
액션
vnd.google.fitness.TRACK
MIME 형식
vnd.google.fitness.activity/running
기타
actionStatus - 시작할 때는 ActiveActionStatus 값, 중지할 때는 CompletedActionStatus 값이 포함된 문자열
운동 시작/중지 "Ok Google, 운동 시작"

"Ok Google, 내 운동을 추적해 줘"

"Ok Google, 운동 중지"
액션
vnd.google.fitness.TRACK
MIME 형식
vnd.google.fitness.activity/other
기타
actionStatus - 시작할 때는 ActiveActionStatus 값, 중지할 때는 CompletedActionStatus 값이 포함된 문자열
심박수 표시 "Ok Google, 심박수를 알려 줘"

"Ok Google, bpm을 알려 줘"
액션
vnd.google.fitness.VIEW
MIME 형식
vnd.google.fitness.data_type/com.google.heart_rate.bpm
걸음 수 표시 "Ok Google, 몇 걸음이나 걸었지?"

"Ok Google, 걸음 수를 알려 줘"
액션
vnd.google.fitness.VIEW
MIME 형식
vnd.google.fitness.data_type/com.google.step_count.cumulative

플랫폼 인텐트를 등록하고 인텐트에 포함된 기타 정보에 액세스하는 방법에 관한 문서는 일반적인 인텐트를 참조하세요.

앱 제공 음성 액션 선언

적용되는 플랫폼 음성 인텐트가 없으면, 'MyActivityName 시작' 음성 액션을 사용하여 직접 앱을 시작할 수 있습니다.

'시작' 액션 등록은 핸드헬드에 런처 아이콘을 등록하는 것과 같습니다. 런처에서 앱 아이콘을 요청하는 대신, 앱이 음성 액션을 요청합니다.

'시작' 다음에 말할 텍스트를 지정하려면 시작하려는 활동의 label 속성을 지정합니다. 예를 들어 다음 인텐트 필터는 'MyRunningApp 시작' 음성 액션을 인식하고 StartRunActivity를 시작합니다.

    <application>
      <activity android:name="StartRunActivity" android:label="MyRunningApp">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
    </application>
    

자유 형식 음성 입력 얻기

음성 액션을 사용하여 활동을 시작하는 것 외에도, 시스템의 내장 음성 인식기 활동을 호출하여 사용자로부터 음성 입력을 얻을 수 있습니다. 이 기능은 사용자로부터 검색, 메시지로 보내기 등의 입력을 얻은 다음 처리하는 데 유용합니다.

앱에서 ACTION_RECOGNIZE_SPEECH 액션을 사용하여 startActivityForResult()를 호출합니다. 그러면 음성 인식 활동이 시작되고, onActivityResult()에서 결과를 처리할 수 있습니다.

Kotlin

    private const val SPEECH_REQUEST_CODE = 0
    ...
    // Create an intent that can start the Speech Recognizer activity
    private fun displaySpeechRecognizer() {
        val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
            putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
        }
        // Start the activity, the intent will be populated with the speech text
        startActivityForResult(intent, SPEECH_REQUEST_CODE)
    }

    // This callback is invoked when the Speech Recognizer returns.
    // This is where you process the intent and extract the speech text from the intent.
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
        if (requestCode == SPEECH_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            val spokenText: String? =
                    data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS).let { results ->
                        results[0]
                    }
            // Do something with spokenText
        }
        super.onActivityResult(requestCode, resultCode, data)
    }
    

자바

    private static final int SPEECH_REQUEST_CODE = 0;

    // Create an intent that can start the Speech Recognizer activity
    private void displaySpeechRecognizer() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    // Start the activity, the intent will be populated with the speech text
        startActivityForResult(intent, SPEECH_REQUEST_CODE);
    }

    // This callback is invoked when the Speech Recognizer returns.
    // This is where you process the intent and extract the speech text from the intent.
    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) {
            List<String> results = data.getStringArrayListExtra(
                    RecognizerIntent.EXTRA_RESULTS);
            String spokenText = results.get(0);
            // Do something with spokenText
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
    

다음 관련 리소스를 참조하세요.