2012년 1월 4일 수요일

IME에 음성 타이핑 추가하기

[이 글은 음성 타이핑을 작업하는 안드로이드 엔지니어 Luca Zonolin가 작성하였습니다. - Tim Bray](Add Voice Typing To Your IME의 번역입니다.)

안드로이드 4.0에 추가된 새 기능 중 음성 타이핑이 있습니다. 말하고 있는 동안에 텍스트 박스에 인식 결과가 나타나는게 차별점입니다. 당신이 IME 개발자라면 기존의 IME에 음성 타이핑을 쉽게 결합할 수 있습니다.

라이브러리를 받고 IME를 아래처럼 수정하면 간단히 통합됩니다. 안드로이드 2.2 버전 이상의 장비에서 부드럽게 실행되죠. 4.0 이상 버전 사용자는 음성 타이핑을 사용하게 되고 이전 버전에서는 일반적인 음성 인식을 사용하게 됩니다. 둘의 차이는 아래의 그림을 보세요.

어떻게 음성 입력을 통합시키는지 보고 싶다면 sample IME를 보면 됩니다. IME는 정말 단순한 단지 하나의 버튼만 포함하고 있습니다. 마이크(microphone)입니다. 사용자는 마이크를 눌러 음성 인식을 동작시킵니다.

아래 순서대로하면 IME에 음성 인식을 통합할 수 있습니다.

라이브러리 다운 받기

라이브러리를 받아 당신의 IME APK에 추가합니다.

음성 인식 트리거를 만들기

라이브러리는 VoiceRecognitionTrigger 헬퍼 클래스를 포함합니다. 여러분의 IME의 InputMethodService#onCreate 메서드에서 클래스의 인스턴스를 만듭시다.
public void onCreate() {
    super.onCreate();
    ...
    mVoiceRecognitionTrigger = new VoiceRecognitionTrigger(this);
}

IME에 마이크 아이콘 추가하기

IME의 UI를 수정하고, 마이크 아이콘을 추가하며, 음성 인식을 개시할 OnClickListener를 등록해야합니다. 샘플 IME의 에셋(asset)에서  찾을 수 있습니다. 마이크 아이콘은 음성 인식이 설치되었을 때만 표시됩니다. VoiceRecognitionTrigger#isInstalled()를 사용합시다.
public View onCreateInputView() {
  LayoutInflater inflater = (LayoutInflater) getSystemService(
      Service.LAYOUT_INFLATER_SERVICE);
  mView = inflater.inflate(R.layout.ime, null);
  ...
  mButton = (ImageButton) mView.findViewById(R.id.mic_button);
  if (mVoiceRecognitionTrigger.isInstalled()) {
    mButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        mVoiceRecognitionTrigger.startVoiceRecognition();
      }
    });
    mButton.setVisibility(View.VISIBLE);
  } else {
    mButton.setVisibility(View.GONE);
  }
  return mView;
}
IME가 여러 언어를 지원할 경우 어떤 언어가 인식될지 startVoiceRecognition()의 인자로 지정할 수 있습니다.

IME 시작할 때 트리거 작동하기

IME 시작할 때 트리거를 알려 텍스트 뷰에 인식 중인 결과를 표시할 수 있습니다.
@Override
public void onStartInputView(EditorInfo info, boolean restarting) {
  super.onStartInputView(info, restarting);
  if (mVoiceRecognitionTrigger != null) {
    mVoiceRecognitionTrigger.onStartInputView();
  }
}

AndroidManifest 수정하기

인텐트 API를 통해 음성 인식하려면 라이브러리가 서비스와 액티비티를 사용해야하도록 메니페스트에 추가해야 합니다.
<manifest ... >
  <application ...>
    ...
    <service android:name="com.google.android.voiceime.ServiceHelper" />
    <activity
        android:name="com.google.android.voiceime.ActivityHelper"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:excludeFromRecents="true"
        android:windowSoftInputMode="stateAlwaysHidden"
        android:finishOnTaskLaunch="true"
        android:configChanges="keyboard|keyboardHidden|navigation
                               |orientation"/>
  </application>
</manifest>

마이크 아이콘 동적으로 갱신하기 (선택)

이 단계는 선택적이지만 사용자 경험을 향상시키려면 구현하는게 좋습니다. 음성 인식은 네트워크 연결이 필요합니다. 네트워크가 되지 않을 때 사용자에게 음성 인식이 현재 작동되지 않은 것을 알려야 합니다. 이렇게 할려면 VoiceRecognitionTrigger.Listener을 등록하고 이에 따라 마이크를 활성화/비활성화해야 합니다.

리스너는 InputMethodService#onCreate에서 등록하고 InputMethodService#onDestroy에서 해제합니다. 이를 지키지 않으면 리스너가 샙니다.
@Override
public void onCreate() {
  super.onCreate();
  ... 
  mVoiceRecognitionTrigger = new VoiceRecognitionTrigger(this);
  mVoiceRecognitionTrigger.register(new VoiceRecognitionTrigger.Listener() {
    @Override
    public void onVoiceImeEnabledStatusChange() {
      updateVoiceImeStatus();
    }
  });
}
...
@Override
public void onDestroy() {
  ...
  if (mVoiceRecognitionTrigger != null) {
    mVoiceRecognitionTrigger.unregister(this);
  }
  super.onDestroy();
}
private void updateVoiceImeStatus() {
  if (mVoiceRecognitionTrigger.isInstalled()) {
    mButton.setVisibility(View.VISIBLE);
    if (mVoiceRecognitionTrigger.isEnabled()) {
      mButton.setEnabled(true);
    } else {
      mButton.setEnabled(false);
    }
  } else {
    mButton.setVisibility(View.GONE);
  }
  mView.invalidate();
}
그리고 메니페스트에 퍼미션을 추가합니다.
<manifest ... >
  ...
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  ...</manifest>

이게 전부에요

음성 인식은 사용자에게 많은 것을 쉽게 해줍니다. IME에 음성인식을 지원하는 것에 대해 감사드립니다.

댓글 1개:

  1. Borgata Hotel Casino & Spa - MapYRO
    Address, 7406 Route 45, Atlantic City, 충주 출장마사지 NJ. 안동 출장안마 Map. 안산 출장샵 Borgata Hotel Casino & 익산 출장마사지 Spa. Borgata 거제 출장샵 Hotel Casino & Spa is an Atlantic City luxury resort

    답글삭제