음성 입력

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

기본 음성 명령은 홈 카드에서 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에서 왼쪽에 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);
    }