2017-02-03 2 views
13

Android 기기에 오프라인 음성 인식 언어가 설치되어 있는지 검색하는 방법이 Java에 있으며, 사용자에게 다운로드하라는 메시지가 표시되지 않으면 어떻게해야합니까?Android에서 오프라인 음성 인식 언어를 자동으로 다운로드하십시오.

나는 당신이 텍스트에 대한 연설을 텍스트로 말하기를 요청할 수 있지만, 장치에 언어가 설치되어 있는지 어떻게 알 수 있습니까?

이 질문은 오프라인 음성을 사용하는 방법과 관련이 없습니다. 질문은 Java 앱 코드에서 "오프라인 음성 언어를 감지하고 다운로드/설치하는 방법"입니다. 즉, 앱에 오프라인 독일어가 설치되어 있는지 감지하고 다운로드/설치하라는 메시지가 표시되지 않는 경우

+0

아니요, "오프라인 음성 사용 방법", 오프라인 음성 작동은 가능하지만 언어 파일을 다운로드해야합니다.이 질문은 "언어 파일 검색 및 다운로드/설치 방법"입니다. – James

+1

에 대한 향상을 요청했습니다. 이것은 오래 전이었으며 이제는 쓸데없는 것으로 표시됩니다. https://code.google.com/p/android/issues/detail?id=59145 – brandall

+0

이 코드를 @gregm [여기]에서 시도하십시오 (http://stackoverflow.com/a/10548680/4394827) –

답변

-1

이 (독일어) 필요한 언어를 사용할 수 있는지 여부를 감지하려면 아래 따르십시오

  • 으로 반복 로케일 목록을 체크 독일어에 사용할 로케일 여부.

  • 대가로 로캘 개체를 얻지 못한 경우 오프라인에서 독일어를 사용할 수 없다고 결론을 내릴 수 있습니다. 그런 다음 코드를 작성하여 다운로드하고 다른 작업을 수행 할 수 있습니다.

  • 내 프로젝트에서 아래 구현을 수행했습니다. 희망의 코드는 당신을 도와줍니다!

    private TextToSpeech t1; 
    
    private void setForOtherLangAudio() { 
    Locale[] locales = Locale.getAvailableLocales(); 
    Locale loc = null; 
    for (Locale locale : locales) { 
        // Replace XXX with your German codes 
        if (locale.getDisplayCountry().equals("XXX") && locale.getDisplayLanguage().equals("XXX")) { 
        loc = locale ; 
        break; 
    } 
    } 
    final Locale germanLocale = loc; 
    t1 = new TextToSpeech(getContext(), new TextToSpeech.OnInitListener() { 
        @Override 
        public void onInit(int status) { 
         if (status != TextToSpeech.ERROR) { 
          t1.setLanguage(germanLocale); 
         } 
        } 
    }); 
    

    }

+2

로컬 인 사용 가능한 것은 오프라인 음성 인식 언어를 사용할 수 있다는 의미는 아닙니다. 또한 귀하의 코드는 SpeechToText가 아닌 TextToSpeech 용입니다. – James

3

이 글을 쓰는 시점에서, 나는이에 대한 정직 솔루션이 믿지 않는, 당신이 기대하는 답이 아니다. 나는 틀리게 증명되기를 아주 희망한다. 이 다음에 추가 사용에 대한

하면 그것은 반드시 사소한 것 : 강화는 추가 매개 변수 RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES을 제안 here

-

내가 프로그래밍 오래 전에이 정보를 제공하기 위해 개선 요청 way :

final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS); 
getContext().sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 

     final ArrayList<String> vrStringLocales = intent.getExtras().getStringArrayList(
       RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES); 

     // This would be nice 
     final ArrayList<String> vrStringOfflineLocales = intent.getExtras().getStringArrayList(
       RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES); 
    } 

}, null, 1234, null, null); 

아아, 그것은 결코 일어난 적이 없다.

정상적으로이 두 가지 방법으로 처리 할 수 ​​있습니다.

응용 프로그램이 루트 권한으로 실행되는 경우 해당 로케일별로 상당히 쉽게 레이블 된 오프라인 파일이 포함 된 /data/data/com.google.android.googlequicksearchbox/app_g3_models/의 위치를 ​​확인할 수 있습니다.

사용자가 누락 된 오프라인 파일을 설치할 것인지 묻는 메시지가 필요한 시점을 알 수 있습니다.

내 경험에 비추어 볼 때, SpeechRecognizer.ERROR_SERVER의 인식 오류는이를 나타낼 수 있지만이를 반드시 확인하는 것은 아닙니다.

@Override 
public void onError(final int error) { 

    switch (error) { 

     case SpeechRecognizer.ERROR_SERVER: 
      // TODO - prompt to install offline files 
      break; 
    } 
} 

발견되면 사용자를 올바른 설치 화면으로 안내 할 수 있습니다.

public static final String PACKAGE_NAME_GOOGLE_NOW = "com.google.android.googlequicksearchbox"; 
public static final String ACTIVITY_INSTALL_OFFLINE_FILES = "com.google.android.voicesearch.greco3.languagepack.InstallActivity"; 

public static boolean showInstallOfflineVoiceFiles(@NonNull final Context ctx) { 

    final Intent intent = new Intent(); 
    intent.setComponent(new ComponentName(PACKAGE_NAME_GOOGLE_NOW, ACTIVITY_INSTALL_OFFLINE_FILES)); 

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    try { 
     ctx.startActivity(intent); 
     return true; 
    } catch (final ActivityNotFoundException e) { 

    } catch (final Exception e) { 

    } 

    return false; 
} 

하드 코딩 된 값을 사용하면 물론 이상적이지는 않지만 이러한 상황도 아닙니다.

일단 위의 모든 내용을 살펴본 후 임시 솔루션을 생각해보십시오. 다시 생각해보십시오! 사용자가 누락 된 오프라인 파일을 올바르게 설치했는지 여부에 관계없이 여전히 작동하지 않을 가능성이 높습니다. .....

answer here은 여전히 ​​내 사용자를 안내해야하는 프로세스를 설명합니다. 매우 실망 스럽습니다.

마지막으로 오류가없는 경우 RecognitionListener.onError(int)의 버그가 하나 더 발생할 수 있습니다. 내 요령 from the answer here에서 BugRecognitionListener을 사용하도록 확인하면 콜백이 올바른 순서로 전송되고 있는지 확인하고 그렇지 않은 경우 무시할 수 있습니다. 내 대답은 이전 릴리스에서 수정 제안을에도 불구하고 이것은 문제가 남아 있습니다.

위 내용을 읽으면 바쁠 것입니다. 행운을 빌어 요 ....