2017-02-03 22 views
13

Có cách nào trong Java để phát hiện xem thiết bị Android có cài đặt ngôn ngữ nhận dạng giọng nói ngoại tuyến hay không và liệu nó có không nhắc người dùng tải xuống không?Tự động tải xuống ngôn ngữ nhận dạng giọng nói ngoại tuyến trên Android

Tôi biết bạn có thể yêu cầu chuyển lời thành văn bản để thích lời nói ngoại tuyến thành văn bản hơn, nhưng làm cách nào để biết liệu thiết bị đã cài đặt ngôn ngữ chưa?

Câu hỏi này không phải là cách sử dụng lời nói ngoại tuyến, tính năng này hoạt động. Câu hỏi đặt ra là "cách phát hiện và tải xuống/cài đặt ngôn ngữ nói ngoại tuyến" từ mã ứng dụng Java. nghĩa là ứng dụng sẽ phát hiện nếu chúng đã cài đặt ngôn ngữ Đức ngoại tuyến và nếu không nhắc người dùng tải xuống/cài đặt nó.

+0

Không, câu hỏi đó là "cách sử dụng lời nói ngoại tuyến", công cụ phát biểu ngoại tuyến, nhưng bạn cần tải xuống tệp ngôn ngữ, câu hỏi này là "cách phát hiện và tải xuống/cài đặt tệp ngôn ngữ" – James

+1

Tôi yêu cầu nâng cao điều này một thời gian dài trước đây, mà bây giờ được đánh dấu là lỗi thời. https://code.google.com/p/android/issues/detail?id=59145 – brandall

+0

thử mã này từ @gregm [tại đây] (http://stackoverflow.com/a/10548680/4394827) –

Trả lời

-1

Để phát hiện xem cần ngôn ngữ (tiếng Đức) có sẵn, hãy làm theo dưới đây:

  • Lặp danh sách Locale và kiểm tra xem Locale sẵn cho ngôn ngữ Đức.

  • Nếu bạn không nhận được bất kỳ đối tượng Locale nào, bạn có thể kết luận rằng tiếng Đức không khả dụng khi ngoại tuyến. Sau đó, bạn có thể viết mã để tải xuống và thực hiện các công cụ khác.

  • Tôi đã thực hiện bên dưới cho dự án của mình. Hy vọng dưới đây mã giúp bạn !!!

    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

Địa phương có sẵn không có nghĩa là ngôn ngữ nhận dạng giọng nói ngoại tuyến khả dụng. Ngoài ra, mã của bạn là cho TextToSpeech không SpeechToText – James

3

Đây không phải là câu trả lời bạn đang mong đợi, như tại thời điểm viết bài, tôi không tin rằng có một giải pháp chuyển tiếp thẳng đến này. Tôi rất hy vọng được chứng minh là sai.

tôi yêu cầu một nâng cao để cung cấp thông tin này lập trình một thời gian dài trước - here

Việc tăng cường cho một tham số bổ sung RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES:

Nó chắc chắn sẽ là tầm thường cho điều này sẽ được bổ sung và sử dụng trong những điều sau đây cách:

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); 

Than ôi, nó chưa bao giờ xảy ra.

Bạn có hai tùy chọn khác để cố gắng xử lý điều này một cách duyên dáng.

Trong trường hợp không chắc bạn chạy ứng dụng với quyền root, bạn có thể kiểm tra vị trí của /data/data/com.google.android.googlequicksearchbox/app_g3_models/ chứa tệp ngoại tuyến, được gắn nhãn khá thủ công theo ngôn ngữ của chúng.

Điều thứ hai liên quan đến việc biết khi nào người dùng cần lời nhắc để cài đặt các tệp ngoại tuyến bị thiếu.

Từ kinh nghiệm của tôi, lỗi nhận dạng của SpeechRecognizer.ERROR_SERVER thường biểu thị điều này nhất, nhưng nó không phải là không dễ dàng.

@Override 
public void onError(final int error) { 

    switch (error) { 

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

Khi được phát hiện, bạn có thể hướng dẫn người dùng đến màn hình cài đặt chính xác.

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; 
} 

Sử dụng các giá trị mã hóa cứng như thế này, tất nhiên là không lý tưởng, nhưng cả hai đều không phải là tình huống này!

Khi bạn đã rối tung với tất cả những điều trên và nghĩ rằng bạn có một giải pháp tạm thời tốt - hãy suy nghĩ lại! Bất kể người dùng đã cài đặt đúng các tệp ngoại tuyến bị thiếu hay chưa, rất có khả năng nó vẫn không hoạt động .....

My answer here mô tả quy trình Tôi vẫn phải hướng dẫn người dùng của mình. Nó rất bực bội.

Cuối cùng thêm một lỗi nữa để đưa vào danh sách kết hợp - RecognitionListener.onError(int) có thể được ném khi không có lỗi. Kiểm tra gist của tôi from the answer here để sử dụng BugRecognitionListener để bạn có thể kiểm tra các cuộc gọi lại đang được gửi theo đúng thứ tự và bỏ qua những người không được. Điều này vẫn còn là một vấn đề, mặc dù câu trả lời của tôi cho thấy một bản sửa lỗi trong bản phát hành trước.

Điều trên sẽ khiến bạn bận rộn! Chúc may mắn ....

Các vấn đề liên quan