it-swarm.dev

التعرف على الكلام دون اتصال في Android (JellyBean)

يبدو أن Google أتاحت التعرف على الكلام في وضع عدم الاتصال من Google Now لتطبيقات الطرف الثالث. يتم استخدامه من قبل التطبيق المسمى Utter .

هل شاهد أي أحد تطبيقات حول كيفية تنفيذ أوامر صوتية بسيطة باستخدام هذا الكلام دون اتصال؟ هل مجرد استخدام API SpeechRecognizer العادية وأنها تعمل تلقائيا؟

78
rmooney

قامت Google بتمكين التعرف في وضع عدم الاتصال بهدوء في تحديث البحث هذا ، لكن لا توجد (حتى الآن) أي واجهة برمجة تطبيقات أو معلمات إضافية متوفرة في فئة SpeechRecognizer . {راجع التحرير في أسفل هذا المنشور} الوظيفة متوفرة بدون أي تشفير إضافي ، ومع ذلك سيحتاج جهاز المستخدم إلى التهيئة بشكل صحيح حتى يبدأ العمل ، وهنا تكمن المشكلة ، تخيل لماذا يفترض الكثير من المطورين أنهم "يفتقدون شيئًا ما".

أيضًا ، فرضت Google قيودًا على بعض أجهزة Jelly bean من استخدام التعرف دون اتصال بسبب قيود الأجهزة. ما هي الأجهزة التي ينطبق عليها هذا الأمر غير موثقة ، في الواقع ، لا يوجد شيء موثق ، لذلك فقد أثبت تكوين القدرات للمستخدم أنه أمر من التجربة والخطأ (بالنسبة لهما). إنه يعمل من أجل البعض على الفور - بالنسبة لأولئك الذين لا يفعلون ذلك ، فهذا هو "الدليل" الذي أمدهم به.

  1. تأكد من ضبط أداة التعرف على الصوت الافتراضي على Google وليس على Samsung/Vlingo
  2. قم بإلغاء تثبيت أي ملفات التعرف في وضع عدم الاتصال التي قمت بتثبيتها بالفعل من إعدادات بحث Google Voice
  3. انتقل إلى إعدادات تطبيق Android الخاص بك ومعرفة ما إذا كان يمكنك إلغاء تثبيت التحديثات لتطبيقات بحث Google و Google Voice.
  4. إذا لم تتمكن من القيام بما سبق ، فانتقل إلى متجر Play لمعرفة ما إذا كان لديك الخيار هناك.
  5. إعادة التشغيل (إذا حققت 2 أو 3 أو 4)
  6. قم بتحديث بحث Google وبحث Google Voice من متجر Play (إذا كنت قد حققت 3 أو 4 أو إذا كان هناك تحديث متوفر على أي حال).
  7. إعادة التشغيل (إذا حققت 6)
  8. تثبيت ملفات اللغة الإنجليزية متواجد حاليا في المملكة المتحدة
  9. اعادة التشغيل
  10. استخدام ينطق! مع اتصال
  11. التبديل إلى وضع الطائرة وتجربته
  12. بمجرد أن تعمل ، يجب أن يبدأ التعرف دون الاتصال بالإنترنت بلغات أخرى ، مثل الإنجليزية الأمريكية ، في العمل أيضًا.

تحرير: تغيير لغة الجهاز مؤقتًا إلى الإنجليزية في المملكة المتحدة يبدو أيضًا أنه بدأ هذا للعمل من أجل البعض.

أبلغ بعض المستخدمين أنه لا يزال يتعين عليهم إعادة التشغيل عدة مرات قبل أن يبدأ العمل ، لكنهم جميعًا يصلون إلى هناك في نهاية المطاف ، وغالبًا ما لا يمكن تفسيره على ما كان المشغل ، والمفتاح موجود داخل Google Search APK ، لذلك لا في المجال العام أو جزء من AOSP .

بناءً على ما يمكنني إنشاؤه ، تختبر Google مدى توفر الاتصال قبل تقرير ما إذا كنت تريد استخدام التعرّف على الإنترنت أو عدم الاتصال بالإنترنت. إذا كان الاتصال متاحًا في البداية ولكن تم فقده قبل الرد ، فستقدم Google خطأ في الاتصال ، ولن يعود إلى وضع عدم الاتصال. كملاحظة جانبية ، إذا تم تقديم طلب للحصول على صوت توليفه من قبل الشبكة ، فلا يوجد خطأ في توفيره إذا فشل - تحصل على الصمت.

لم يُمكّن تحديث بحث Google أية ميزات إضافية في Google Now وفي الواقع ، إذا حاولت استخدامه بدون اتصال بالإنترنت ، فسيحدث خطأ. أذكر ذلك كما تساءلت عما إذا كان سيتم سحب القدرة بهدوء كما بدا ، وبالتالي لا ينبغي الاعتماد عليها في الإنتاج.

إذا كنت تنوي بدء استخدام فئة SpeechRecognizer ، كن حذرًا ، فهناك خطأ رئيسي كبير مرتبط به ، الأمر الذي يتطلب التنفيذ الخاص بك للتعامل معه.

عدم القدرة على طلب بلا اتصال = true / ، يجعل التحكم في هذه الميزة مستحيلًا دون معالجة اتصال البيانات. القمامة. ستحصل على مئات من رسائل البريد الإلكتروني الخاصة بالمستخدم تسألك عن سبب عدم تمكين شيء بهذه البساطة!

EDIT: منذ مستوى API 23 ، تمت إضافة معلمة جديدة EXTRA_PREFER_OFFLINE التي يبدو أن خدمة التعرف على Google تلتزم بها.

نأمل أن يساعد أعلاه.

70
brandall

أرغب في تحسين الدليل الذي يجيب عليه https://stackoverflow.com/a/17674655/2987828 يرسل إلى مستخدميه ، مع الصور. هذه هي الجملة "بالنسبة لأولئك الذين لا يفعلون ذلك ، فهذا هو" الدليل "الذي أمدهم به." أنني أريد أن تحسين.

يجب على المستخدم النقر فوق الأزرار الأربعة المميزة باللون الأزرق في هذه الصور:

Go to your Android Application Settings, select Languages and input,edit Settings of Google Voice typing,select Download Offline speech recognition,select your languages in the ALL tab.

ثم يمكن للمستخدم تحديد أي اللغات المطلوبة. عند الانتهاء من التنزيل ، يجب عليه قطع الاتصال بالشبكة ، ثم النقر فوق زر "الميكروفون" بلوحة المفاتيح.

لقد نجح هذا الأمر بالنسبة لي (Android 4.1.2) ، ثم تم تشغيل ميزة التعرف على اللغة ، دون إعادة التشغيل. يمكنني الآن إملاء تعليمات إلى Shell of Terminal Emulator! وهو حاليا أسرع مرتين من الإنترنت ، على padfone 2 من ASUS.

تم ترخيص هذه الصور بموجب cc by-sa 3.0 مع الإسناد المطلوب إلى stackoverflow.com/a/21329845/2987828 ؛ يمكنك بالتالي إضافة هذه الصور في أي مكان مع هذا الإسناد.

(هذه هي السياسة القياسية لجميع الصور والنصوص في stackoverflow.com)

20
user2987828

تقوم CMUSphinx ، وهي مجموعة أدوات التعرف على الكلام مفتوحة المصدر ، بتنفيذ التعرف البسيط والمرن في وضع عدم الاتصال على نظام Android. إنه يعمل بلا اتصال محض وسريع وقابل للتكوين ويمكنه الاستماع بشكل مستمر للكلمة الرئيسية ، على سبيل المثال.

يمكنك العثور على أحدث التعليمات البرمجية و البرنامج التعليمي هنا .

16
Nikolay Shmyrev

باختصار ، ليس لدي التطبيق ، لكن التفسير.

لم تتيح Google التعرف على الكلام في وضع عدم الاتصال لتطبيقات الجهات الخارجية. لا يمكن الوصول إلى التعرف دون اتصال إلا عبر لوحة المفاتيح. يشرح بن راندال (مطور اللغة المطلقة!) الحل الخاص به في مقال بشرطة أندرويد:

قمت بتطبيق لوحة المفاتيح الخاصة بي وكنت أقوم بالتبديل بين الكتابة الصوتية من Google ولوحة المفاتيح الافتراضية للمستخدمين بحقل نص غير مرئي ونشاط شفاف للحصول على المدخلات. الاختراق القذر!

كانت هذه هي الطريقة الوحيدة للقيام بذلك ، حيث لا يمكن تشغيل الكتابة الصوتية في وضع عدم الاتصال إلا عن طريق IME أو تطبيق نظام (كان هذا الاختراق الجذر الخاص بي). النوع الآخر من API للتعرّف ... لم يتم تشغيله وفشل في حدوث خطأ في الخادم. ... الكثير من العمل يضيع بالنسبة لي في الحل البديل! ولكن على الأقل كنت مستعدًا للتنفيذ ...

من النطق! يدعي أنه أول تطبيق غير IME يستخدم ميزة التعرف على الصوت دون اتصال في تطبيق Jelly bean

7
Leon Joosse

لقد نجحت في تطبيق خدمة الكلام الخاصة بي مع إمكانيات غير متصلة بالإنترنت باستخدام onPartialResults عندما تكون متصلاً بالإنترنت و onResults عندما تكون متصلاً بالإنترنت.

3
P. Stresow

كنت أتعامل مع هذا ولاحظت أنك بحاجة إلى تثبيت الحزمة غير المتصلة بلغتك. كان إعداد لغتي هو "Español (Estados Unidos)" ، لكن لا توجد حزمة غير متصلة بهذه اللغة ، لذلك عندما أوقفت كل اتصال الشبكة ، تلقيت تنبيهًا من RecognizerIntent يقول أنه لا يمكن الوصول إلى Google ، ثم قمت بتغيير اللغة إلى "اللغة الإنجليزية (الولايات المتحدة)" (لأن لدي بالفعل حزمة دون اتصال بالإنترنت) وأطلقت برنامج RecognizerIntent الذي تم إعداده للتو.

المفاتيح: إعداد اللغة == حزمة التعرف على الصوت دون اتصال

2
Akino

من الواضح أنه من الممكن تثبيت التعرف على الصوت في وضع عدم الاتصال يدويًا عن طريق تنزيل الملفات مباشرة وتثبيتها في المواقع الصحيحة يدويًا. أعتقد أن هذا مجرد وسيلة لتجاوز متطلبات أجهزة Google. ومع ذلك ، أنا شخصياً لم أضطر إلى إعادة تشغيل الكمبيوتر أو أي شيء آخر ، ما عليك سوى الانتقال إلى المملكة المتحدة والعودة مرة أخرى إلى ذلك.

1
Riju Chatterjee

ويرد مثال العمل أدناه ،

MyService.class

public class MyService extends Service implements SpeechDelegate, Speech.stopDueToDelay {

  public static SpeechDelegate delegate;

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    //TODO do something useful
    try {
      if (VERSION.SDK_INT >= VERSION_CODES.KitKat) {
        ((AudioManager) Objects.requireNonNull(
          getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    Speech.init(this);
    delegate = this;
    Speech.getInstance().setListener(this);

    if (Speech.getInstance().isListening()) {
      Speech.getInstance().stopListening();
    } else {
      System.setProperty("rx.unsafe-disable", "True");
      RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> {
        if (granted) { // Always true pre-M
          try {
            Speech.getInstance().stopTextToSpeech();
            Speech.getInstance().startListening(null, this);
          } catch (SpeechRecognitionNotAvailable exc) {
            //showSpeechNotSupportedDialog();

          } catch (GoogleVoiceTypingDisabledException exc) {
            //showEnableGoogleVoiceTyping();
          }
        } else {
          Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show();
        }
      });
    }
    return Service.START_STICKY;
  }

  @Override
  public IBinder onBind(Intent intent) {
    //TODO for communication return IBinder implementation
    return null;
  }

  @Override
  public void onStartOfSpeech() {
  }

  @Override
  public void onSpeechRmsChanged(float value) {

  }

  @Override
  public void onSpeechPartialResults(List<String> results) {
    for (String partial : results) {
      Log.d("Result", partial+"");
    }
  }

  @Override
  public void onSpeechResult(String result) {
    Log.d("Result", result+"");
    if (!TextUtils.isEmpty(result)) {
      Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
    }
  }

  @Override
  public void onSpecifiedCommandPronounced(String event) {
    try {
      if (VERSION.SDK_INT >= VERSION_CODES.KitKat) {
        ((AudioManager) Objects.requireNonNull(
          getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (Speech.getInstance().isListening()) {
      Speech.getInstance().stopListening();
    } else {
      RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> {
        if (granted) { // Always true pre-M
          try {
            Speech.getInstance().stopTextToSpeech();
            Speech.getInstance().startListening(null, this);
          } catch (SpeechRecognitionNotAvailable exc) {
            //showSpeechNotSupportedDialog();

          } catch (GoogleVoiceTypingDisabledException exc) {
            //showEnableGoogleVoiceTyping();
          }
        } else {
          Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show();
        }
      });
    }
  }


  @Override
  public void onTaskRemoved(Intent rootIntent) {
    //Restarting the service if it is removed.
    PendingIntent service =
      PendingIntent.getService(getApplicationContext(), new Random().nextInt(),
        new Intent(getApplicationContext(), MyService.class), PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    assert alarmManager != null;
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, service);
    super.onTaskRemoved(rootIntent);
  }
}

لمزيد من التفاصيل،

https://github.com/sachinvarma/Speech-Recognizer

آمل أن يكون هذا سيساعد شخص ما في المستقبل.

0
Sachin Varma