음성 입력

음성 입력을 사용하면 진정한 핸즈프리 인터페이스를 만들 수 있습니다. 유리 에서는 음성 입력을 활용할 수 있는 세 가지 방법을 제공합니다.

기본 음성 명령은 홈 카드에서 Glass 소프트웨어를 시작하며, 상황에 맞는 음성입니다. 명령을 통해 활동 내에서 작업을 실행할 수 있으며, 시스템 음성은 인식 활동을 사용하면 사용자로부터 자유 형식 음성 입력을 받을 수 있습니다.

기본 음성 명령

이러한 음성 명령을 통해 홈 카드 (시계 카드)에서 Glass 소프트웨어를 실행할 수 있습니다. 기본 음성 명령을 선언하면 Glass가 자동으로 터치 메뉴 항목을 생성함 사용자가 아이콘을 탭하여 Glass 소프트웨어를 사용하기로 한 경우 홈 카드

ok Glass 음성 기본 메뉴에 음성 명령을 추가하려면 다음 단계를 따르세요.

  1. 다음에서 음성 명령을 위한 XML 리소스 생성: 기존 음성 명령 중 하나를 사용하는 res/xml/<my_voice_trigger>.xml 정의된 위치 VoiceTriggers.Command 예를 들어 "달리기 시작"을 사용하는 방법은 다음과 같습니다.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="START_A_RUN" />
    

    사용자에게 추가 정보를 말하도록 요청하는 음성 명령을 만들기 위해 input를 포함하는 것이 좋습니다. 요소도 포함해야 합니다. 예를 들어 '업데이트 게시'를 사용하면 됩니다.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger command="POST_AN_UPDATE">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    
  2. 다음을 사용하여 인텐트 필터 등록 com.google.android.glass.action.VOICE_TRIGGER 액션 Android 매니페스트를 참조하세요. 인텐트 필터가 활동 또는 서비스를 시작함 음성 명령으로 말하는 사용자를 감지하는 경우

    <?xml version="1.0" encoding="utf-8"?>
    <application ...>
        <activity | service ...>
            <intent-filter>
                <action android:name=
                        "com.google.android.glass.action.VOICE_TRIGGER" />
            </intent-filter>
            <meta-data android:name="com.google.android.glass.VoiceTrigger"
                android:resource="@xml/my_voice_trigger" />
        </activity | service>
        // ...
    </application>
    
  3. 활동 또는 서비스의 android:icon 속성을 선언합니다. 이렇게 하면 Glass에서 알겠습니다 터치 메뉴입니다.

    <activity |service
        android:icon="@drawable/my_icon" ...>
      ...
    </activity | service>
    
  4. 음성 명령이 음성 프롬프트를 사용하고 활동을 시작하는 경우 (예: onResume()):

    ArrayList<String> voiceResults = getIntent().getExtras()
            .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
    

    음성 명령이 서비스를 시작하면 추가 인텐트를 onStartCommand() 콜백:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        ArrayList<String> voiceResults = intent.getExtras()
                .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
        // ...
    }
    

제약조건 설정

Glass 소프트웨어를 시작하는 데 다음 기능 중 하나 또는 모두가 필요한 경우 res/xml/<my_voice_trigger>.xml 리소스에서 지정해야 합니다. 기능을 사용할 수 없는 경우 Glass에서 음성 명령을 사용 중지합니다.

  • camera
  • network
  • microphone

    <trigger command="POST_AN_UPDATE">
        <constraints
            camera="true"
            network="true" />
    </trigger>
    

상황별 음성 명령

상황별 음성 명령을 통해 사용자는 활동에서 작업을 실행할 수 있습니다. 표준 Android 메뉴 API를 사용하여 상황별 음성 명령을 빌드하지만 사용자는 터치 대신 음성 명령으로 메뉴 항목을 호출할 수 있습니다.

특정 활동에 상황별 음성 명령을 사용 설정하려면 다음을 수행합니다.

  1. getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS)번으로 전화하기 활성화하여 상황별 음성 명령을 활성화합니다. 이 기능 사용 시 사용 설정하면 화면의 바닥글 영역에 'ok Glass' 메뉴가 표시됩니다. 이 활동이 포커스를 받을 때마다.

  2. onCreatePanelMenu() 재정의 인코더-디코더 아키텍처를 WindowUtils.FEATURE_VOICE_COMMANDS 사용 설정되어 있는지 확인합니다. 사용 설정된 경우 여기서 메뉴 팽창과 같은 일회성 메뉴를 설정할 수 있습니다. 메뉴 리소스 또는 Menu.add() 호출 방법을 알아보겠습니다.

  3. onMenuItemSelected() 재정의 사용자가 말할 때 음성 명령을 처리합니다. 사용자가 작업을 완료했을 때 메뉴 항목을 선택하면 "ok, Glass" 음성 명령을 자동으로 실행할 수 있습니다. 화면의 바닥글 섹션에 다시 표시되어 새로운 음성을 받을 준비가 됨 명령을 실행할 수 있습니다.

    다음 코드는 문맥 음성 명령을 사용 설정하고 메뉴 리소스를 확장합니다. 필요한 경우 처리하고, 음성 명령이 들리면 이를 처리합니다.

    public class ContextualMenuActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle bundle) {
            super.onCreate(bundle);
    
            // Requests a voice menu on this activity. As for any other
            // window feature, be sure to request this before
            // setContentView() is called
            getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean onCreatePanelMenu(int featureId, Menu menu) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }
            // Pass through to super to setup touch menu.
            return super.onCreatePanelMenu(featureId, menu);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onMenuItemSelected(int featureId, MenuItem item) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
                switch (item.getItemId()) {
                    case R.id.dogs_menu_item:
                        // handle top-level dogs menu item
                        break;
                    case R.id.cats_menu_item:
                        // handle top-level cats menu item
                        break;
                    case R.id.lab_menu_item:
                        // handle second-level labrador menu item
                        break;
                    case R.id.golden_menu_item:
                        // handle second-level golden menu item
                        break;
                    case R.id.calico_menu_item:
                        // handle second-level calico menu item
                        break;
                    case R.id.cheshire_menu_item:
                        // handle second-level cheshire menu item
                        break;
                    default:
                        return true;
                }
                return true;
            }
            // Good practice to pass through to super if not handled
            return super.onMenuItemSelected(featureId, item);
        }
    }
    

    다음은 이전 활동에서 사용한 메뉴 리소스의 예입니다. 계층적 음성을 위한 중첩 메뉴 항목을 만드는 방법 관리됩니다. 다음 예에서 첫 번째 메뉴 항목은 ok Glass, Show me dogs, Labrador로 액세스합니다.

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Use the constants defined in the ContextualMenus.Command enum-->
        <item
            android:id="@+id/dogs_menu_item"
            android:title="@string/show_me_dogs">
            <menu>
                <item
                    android:id="@+id/lab_menu_item"
                    android:title="@string/labrador" />
                <item
                    android:id="@+id/golden_menu_item"
                    android:title="@string/golden" />
            </menu>
        </item>
        <item
            android:id="@+id/cats_menu_item"
            android:title="@string/show_me_cats">
            <menu>
                <item
                    android:id="@+id/cheshire_menu_item"
                    android:title="@string/cheshire" />
                <item
                    android:id="@+id/calico_menu_item"
                    android:title="@string/calico" />
            </menu>
        </item>
    </menu>
    
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Use the constants defined in the ContextualMenus.Command enum-->
        <item
            android:id="@+id/play_menu_item"
            android:title="PLAY_MUSIC" />
        <item
            android:id="@+id/pause_menu_item"
            android:title="PAUSE_MUSIC" />
    </menu>
    
  4. (선택사항) 재정의 onPreparePanel()님, 또는 악성 코드인지 WindowUtils.FEATURE_VOICE_COMMANDS 사용 설정됨 사용 설정하면 여기에서 다른 로직을 실행하여 메뉴 시스템을 설정할 수 있습니다. 추가 및 제거와 같은 특정 메뉴 항목을 삭제할 수 있습니다 다음과 같은 작업을 할 수 있습니다. 또한 컨텍스트 음성 메뉴를 켜거나 (true 반환) 사용 중지합니다. (false 반환). 예를 들면 다음과 같습니다.

        private boolean mVoiceMenuEnabled;
        ...
        @Override
        public boolean onPreparePanel(int featureId, View view, Menu menu) {
            if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) {
            // toggle this boolean on and off based on some criteria
                return mVoiceMenuEnabled;
            }
            // Good practice to call through to super for other cases
            return super.onPreparePanel(featureId, view, menu);
        }
    

음성 및 터치 메뉴 동시 지원

문맥 음성 명령은 기존 Android 메뉴 API를 사용하므로 터치 메뉴를 위해 이미 보유하고 있는 많은 코드와 리소스를 두 가지 유형의 메뉴를 동시에 지원할 수 있습니다.

Window.FEATURE_OPTIONS_PANEL 기능을 확인하기만 하면 됩니다. 기존의 WindowUtils.FEATURE_VOICE_COMMANDS 기능 외에 몇 가지 메서드에서 확인한 다음 터치를 여는 로직을 추가합니다. 탭 등의 사용자 동작에 대한 메뉴

예를 들어 이전 활동을 변경할 수 있습니다. 다음과 같은 터치 메뉴 지원을 추가하는 예입니다 (변경사항은 주석 처리됨).

// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
    if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
            featureId == Window.FEATURE_OPTIONS_PANEL) {
    ...
}

// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
            featureId == Window.FEATURE_OPTIONS_PANEL) {
    ...
}

이렇게 변경하면 ok Glass를 탭하거나 말할 수 있습니다. 찾을 수 있습니다.

개발용으로 목록에 없는 음성 명령 사용

유리 제품을 배포하려면 승인된 기본 유리 제품을 사용해야 합니다. 음성 명령 내 VoiceTriggers.Command 드림 컨텍스트 기반 음성 명령으로 ContextualMenus.Command

GDK에서 사용할 수 없는 음성 명령을 사용하려면 AndroidManifest.xml 파일에서 Android 권한을 요청할 수 있습니다.

<uses-permission
     android:name="com.google.android.glass.permission.DEVELOPMENT" />

목록에 없는 기본 음성 명령 사용

  1. res/values/strings.xml에 다음을 정의하는 문자열 값을 선언합니다. 음성 트리거의 이름입니다. 원하는 경우 음성 프롬프트 선언 음성 인식 Glass 웨어를 표시합니다.

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="glass_voice_trigger">read me a story</string>
        <string name="glass_voice_prompt">what story?</string>
    </resources>
    
  2. 다음에서 음성 트리거를 위한 XML 리소스 만들기: res/xml/<my_voice_trigger>.xml 일부 공개 음성 명령에는 승인에 사용된 command 속성 대신 keyword 속성 음성 명령입니다. keyword 속성은 문자열에 대한 참조여야 합니다. 리소스를 정의합니다. 경보를 시작하는 간단한 음성 트리거의 경우 trigger 요소를 지정하기만 하면 됩니다.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger" />
    

    사용자에게 추가 문구를 말하도록 요청하는 음성 트리거를 만들기 위해 문구는 입력 요소를 포함합니다. 확인할 수 있습니다.

    <?xml version="1.0" encoding="utf-8"?>
    <trigger keyword="@string/glass_voice_trigger">
        <input prompt="@string/glass_voice_prompt" />
    </trigger>
    

목록에 없는 문맥 음성 명령 사용

메뉴 항목을 만들 때 메뉴 항목의 제목에 텍스트를 사용하세요. 예를 들면 다음과 같습니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Use the constants defined in the ContextualMenus.Command enum-->
    <item
        android:id="@+id/pizza_menu_item"
        android:title="@string/find_pizza" />
</menu>

음성 인식 시작


음성 인식 글래스웨어는 사용자가 말할 때까지 기다렸다가 작성된 텍스트를 생성합니다. 활동을 시작하려면 다음 단계를 따르세요.

  1. startActivityForResult()를 호출합니다. (ACTION_RECOGNIZE_SPEECH 인텐트 사용). 활동을 시작할 때 다음 인텐트 추가 항목이 지원됩니다. <ph type="x-smartling-placeholder">
  2. onActivityResult() 드림 스크립트를 작성하여 EXTRA_RESULTS 인텐트 추가 항목을 사용합니다. 사용자가 말하기를 마치면 이 콜백이 호출됩니다.

    private static final int SPEECH_REQUEST = 0;
    
    private void displaySpeechRecognizer() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        startActivityForResult(intent, SPEECH_REQUEST);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        if (requestCode == SPEECH_REQUEST && 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);
    }