تشخیص صدا و کلمه برای اندروید

این آموزش به شما نشان می‌دهد که چگونه از TensorFlow Lite با مدل‌های یادگیری ماشینی از پیش ساخته شده برای تشخیص صداها و کلمات گفتاری در یک برنامه اندروید استفاده کنید. مدل‌های طبقه‌بندی صوتی مانند مدل‌هایی که در این آموزش نشان داده شده‌اند، می‌توانند برای شناسایی فعالیت، شناسایی اقدامات یا تشخیص دستورات صوتی استفاده شوند.

نسخه نمایشی متحرک تشخیص صدا این آموزش به شما نشان می‌دهد که چگونه کد نمونه را دانلود کنید، پروژه را در Android Studio بارگیری کنید، و بخش‌های کلیدی نمونه کد را توضیح می‌دهد تا بتوانید شروع به افزودن این قابلیت به برنامه خود کنید. کد برنامه مثال از TensorFlow Task Library برای صدا استفاده می‌کند که بیشتر ضبط و پیش‌پردازش داده‌های صوتی را انجام می‌دهد. برای اطلاعات بیشتر در مورد نحوه پیش پردازش صدا برای استفاده با مدل های یادگیری ماشینی، به آماده سازی و تقویت داده های صوتی مراجعه کنید.

طبقه بندی صوتی با یادگیری ماشینی

مدل یادگیری ماشین در این آموزش صداها یا کلمات را از نمونه های صوتی ضبط شده با میکروفون در دستگاه اندرویدی تشخیص می دهد. برنامه مثال در این آموزش به شما امکان می دهد بین YAMNet/Classsifier ، مدلی که صداها را تشخیص می دهد، و مدلی که کلمات گفتاری خاص را تشخیص می دهد که با استفاده از ابزار TensorFlow Lite Model Maker آموزش داده شده است سوئیچ کنید. این مدل‌ها پیش‌بینی‌هایی را روی کلیپ‌های صوتی انجام می‌دهند که شامل 15600 نمونه جداگانه در هر کلیپ است و طول آن حدود 1 ثانیه است.

راه اندازی و اجرای مثال

برای قسمت اول این آموزش، نمونه را از گیت هاب دانلود کرده و با استفاده از اندروید استودیو اجرا کنید. بخش‌های بعدی این آموزش، بخش‌های مربوط به مثال را بررسی می‌کند، بنابراین می‌توانید آن‌ها را در برنامه‌های اندرویدی خود اعمال کنید.

سیستم مورد نیاز

  • Android Studio نسخه 2021.1.1 (Bumblebee) یا بالاتر.
  • Android SDK نسخه 31 یا بالاتر
  • دستگاه Android با حداقل نسخه سیستم عامل SDK 24 (Android 7.0 - Nougat) با حالت توسعه دهنده فعال است.

کد نمونه را دریافت کنید

یک کپی محلی از کد نمونه ایجاد کنید. از این کد برای ایجاد پروژه در اندروید استودیو و اجرای نمونه برنامه استفاده خواهید کرد.

برای شبیه سازی و تنظیم کد مثال:

  1. کلون کردن مخزن git
    git clone https://github.com/tensorflow/examples.git
    
  2. به صورت اختیاری، نمونه git خود را برای استفاده از پرداخت پراکنده پیکربندی کنید، بنابراین فقط فایل‌های برنامه نمونه را داشته باشید:

    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/audio_classification/android
    

پروژه را وارد و اجرا کنید

یک پروژه از کد نمونه دانلود شده ایجاد کنید، پروژه را بسازید و سپس آن را اجرا کنید.

برای وارد کردن و ساخت نمونه پروژه کد:

  1. Android Studio را راه اندازی کنید.
  2. در Android Studio، File > New > Import Project را انتخاب کنید.
  3. به فهرست کد نمونه حاوی فایل build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) بروید و آن دایرکتوری را انتخاب کنید.

اگر دایرکتوری صحیح را انتخاب کنید، Android Studio یک پروژه جدید ایجاد می کند و آن را می سازد. این فرآیند بسته به سرعت کامپیوتر شما و اگر از اندروید استودیو برای پروژه های دیگر استفاده کرده اید، ممکن است چند دقیقه طول بکشد. پس از اتمام ساخت، Android Studio یک پیام BUILD SUCCESSFUL را در پانل وضعیت Build Output نمایش می دهد.

برای اجرای پروژه:

  1. از Android Studio، پروژه را با انتخاب Run > Run 'app' اجرا کنید.
  2. برای آزمایش برنامه، یک دستگاه Android متصل با میکروفون را انتخاب کنید.

بخش های بعدی تغییراتی را که باید در پروژه موجود خود انجام دهید تا این قابلیت را به برنامه خود اضافه کنید، با استفاده از این برنامه مثال به عنوان نقطه مرجع به شما نشان می دهد.

وابستگی های پروژه را اضافه کنید

در برنامه خود، باید وابستگی‌های پروژه خاصی را برای اجرای مدل‌های یادگیری ماشینی TensorFlow Lite اضافه کنید و به توابع ابزاری دسترسی داشته باشید که فرمت‌های داده استاندارد، مانند صدا، را به یک قالب داده تانسور تبدیل می‌کنند که می‌تواند توسط مدلی که استفاده می‌کنید پردازش شود.

برنامه نمونه از کتابخانه های TensorFlow Lite زیر استفاده می کند:

  • TensorFlow Lite Task library Audio API - کلاس های ورودی داده های صوتی مورد نیاز، اجرای مدل یادگیری ماشین و نتایج خروجی از پردازش مدل را ارائه می دهد.

دستورالعمل‌های زیر نشان می‌دهد که چگونه وابستگی‌های پروژه مورد نیاز را به پروژه برنامه Android خود اضافه کنید.

برای افزودن وابستگی های ماژول:

  1. در ماژولی که از TensorFlow Lite استفاده می کند، فایل build.gradle ماژول را به روز کنید تا وابستگی های زیر را شامل شود. در کد نمونه، این فایل در اینجا قرار دارد: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. در Android Studio، وابستگی‌های پروژه را با انتخاب: File > Sync Project with Gradle Files همگام‌سازی کنید.

مدل ML را راه اندازی کنید

در برنامه اندروید خود، باید قبل از اجرای پیش‌بینی‌ها با مدل، مدل یادگیری ماشینی TensorFlow Lite را با پارامترها مقداردهی کنید. این پارامترهای اولیه به مدل وابسته هستند و می‌توانند شامل تنظیماتی مانند آستانه‌های حداقل دقت پیش‌فرض برای پیش‌بینی‌ها و برچسب‌هایی برای کلمات یا صداهایی باشند که مدل می‌تواند تشخیص دهد.

یک مدل TensorFlow Lite شامل یک فایل *.tflite حاوی مدل است. فایل مدل حاوی منطق پیش‌بینی است و معمولاً شامل ابرداده‌هایی درباره نحوه تفسیر نتایج پیش‌بینی، مانند نام‌های کلاس‌های پیش‌بینی است. فایل های مدل باید در دایرکتوری src/main/assets پروژه توسعه شما ذخیره شوند، مانند نمونه کد:

  • <project>/src/main/assets/yamnet.tflite

برای راحتی و خوانایی کد، مثال یک شیء همراه را اعلام می کند که تنظیمات مدل را تعریف می کند.

برای مقداردهی اولیه مدل در برنامه خود:

  1. یک شیء همراه برای تعریف تنظیمات مدل ایجاد کنید:

    companion object {
      const val DISPLAY_THRESHOLD = 0.3f
      const val DEFAULT_NUM_OF_RESULTS = 2
      const val DEFAULT_OVERLAP_VALUE = 0.5f
      const val YAMNET_MODEL = "yamnet.tflite"
      const val SPEECH_COMMAND_MODEL = "speech.tflite"
    }
    
  2. تنظیمات مدل را با ساختن یک شی AudioClassifier.AudioClassifierOptions ایجاد کنید:

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. از این شی تنظیمات برای ساخت یک شیء TensorFlow Lite AudioClassifier استفاده کنید که حاوی مدل است:

    classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
    

فعال کردن شتاب سخت افزار

هنگام راه اندازی یک مدل TensorFlow Lite در برنامه خود، باید از ویژگی های شتاب سخت افزاری برای سرعت بخشیدن به محاسبات پیش بینی مدل استفاده کنید. نمایندگان TensorFlow Lite ماژول‌های نرم‌افزاری هستند که اجرای مدل‌های یادگیری ماشین را با استفاده از سخت‌افزار پردازش تخصصی روی یک دستگاه تلفن همراه، مانند واحد پردازش گرافیکی (GPU) یا واحدهای پردازش تانسور (TPU) تسریع می‌کنند. مثال کد از NNAPI Delegate برای مدیریت شتاب سخت افزاری اجرای مدل استفاده می کند:

val baseOptionsBuilder = BaseOptions.builder()
   .setNumThreads(numThreads)
...
when (currentDelegate) {
   DELEGATE_CPU -> {
       // Default
   }
   DELEGATE_NNAPI -> {
       baseOptionsBuilder.useNnapi()
   }
}

استفاده از نمایندگان برای اجرای مدل‌های TensorFlow Lite توصیه می‌شود، اما الزامی نیست. برای اطلاعات بیشتر در مورد استفاده از نمایندگان با TensorFlow Lite، به TensorFlow Lite Delegates مراجعه کنید.

داده ها را برای مدل آماده کنید

در برنامه Android شما، کد شما با تبدیل داده‌های موجود مانند کلیپ‌های صوتی به قالب داده‌های Tensor که می‌تواند توسط مدل شما پردازش شود، داده‌ها را برای تفسیر در اختیار مدل قرار می‌دهد. داده‌های یک Tensor که به یک مدل منتقل می‌کنید باید ابعاد یا شکل خاصی داشته باشند که با قالب داده‌های مورد استفاده برای آموزش مدل مطابقت داشته باشد.

مدل YAMNet/طبقه‌بند و مدل‌های دستورات گفتاری سفارشی‌شده مورد استفاده در این مثال کد، اشیاء داده‌های Tensor را می‌پذیرد که کلیپ‌های صوتی تک کاناله یا تک‌کاناله ضبط‌شده در ۱۶ کیلوهرتز در کلیپ‌های ۰.۹۷۵ ثانیه (۱۵۶۰۰ نمونه) را نشان می‌دهند. با اجرای پیش‌بینی‌ها روی داده‌های صوتی جدید، برنامه شما باید این داده‌های صوتی را به اشیاء داده‌های Tensor با آن اندازه و شکل تبدیل کند. TensorFlow Lite Task Library Audio API تبدیل داده ها را برای شما انجام می دهد.

در کد مثال کلاس AudioClassificationHelper ، برنامه با استفاده از یک شی Android AudioRecord صدای زنده را از میکروفون های دستگاه ضبط می کند. کد از AudioClassifier برای ساخت و پیکربندی آن شی برای ضبط صدا با نرخ نمونه برداری مناسب برای مدل استفاده می کند. این کد همچنین از AudioClassifier برای ساخت یک شی TensorAudio برای ذخیره داده های صوتی تبدیل شده استفاده می کند. سپس شی TensorAudio برای تجزیه و تحلیل به مدل ارسال می شود.

برای ارائه داده های صوتی به مدل ML:

  • از شی AudioClassifier برای ایجاد یک شی TensorAudio و یک شی AudioRecord استفاده کنید:

    fun initClassifier() {
    ...
      try {
        classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options)
        // create audio input objects
        tensorAudio = classifier.createInputTensorAudio()
        recorder = classifier.createAudioRecord()
      }
    

پیش بینی ها را اجرا کنید

در برنامه Android خود، هنگامی که یک شی AudioRecord و یک شی TensorAudio را به یک شی AudioClassifier متصل کردید، می‌توانید مدل را در برابر آن داده‌ها اجرا کنید تا یک پیش‌بینی یا استنتاج ایجاد کنید. کد مثال برای این آموزش پیش‌بینی‌ها را روی کلیپ‌ها از جریان ورودی صوتی ضبط‌شده زنده با نرخ مشخصی اجرا می‌کند.

اجرای مدل منابع قابل توجهی را مصرف می کند، بنابراین مهم است که پیش بینی های مدل ML را در یک رشته پس زمینه جداگانه اجرا کنید. برنامه مثال از یک [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) استفاده می کند تا پردازش مدل را از سایر عملکردهای برنامه جدا کند.

مدل‌های طبقه‌بندی صوتی که صداهایی را با شروع و پایان واضح تشخیص می‌دهند، مانند کلمات، می‌توانند با تجزیه و تحلیل کلیپ‌های صوتی روی هم‌پوشانی، پیش‌بینی‌های دقیق‌تری در جریان صوتی ورودی ایجاد کنند. این رویکرد به مدل کمک می‌کند تا از پیش‌بینی‌های گمشده برای کلماتی که در انتهای یک کلیپ بریده شده‌اند، اجتناب کند. در برنامه مثال، هر بار که یک پیش‌بینی را اجرا می‌کنید، کد آخرین کلیپ 0.975 ثانیه‌ای را از بافر ضبط صدا برداشته و آن را تجزیه و تحلیل می‌کند. می‌توانید با تنظیم مقدار interval اجرای رشته تحلیل مدل به طولی که کوتاه‌تر از طول کلیپ‌های مورد تجزیه و تحلیل است، مدل را وادار کنید که کلیپ‌های صوتی همپوشانی را تجزیه و تحلیل کند. به عنوان مثال، اگر مدل شما کلیپ های 1 ثانیه ای را تجزیه و تحلیل کند و فاصله را روی 500 میلی ثانیه تنظیم کنید، مدل هر بار نیمه آخر کلیپ قبلی و 500 میلی ثانیه از داده های صوتی جدید را تجزیه و تحلیل می کند و یک همپوشانی تجزیه و تحلیل کلیپ 50٪ ایجاد می کند.

برای شروع اجرای پیش‌بینی‌ها روی داده‌های صوتی:

  1. از متد AudioClassificationHelper.startAudioClassification() برای شروع ضبط صدا برای مدل استفاده کنید:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. با تنظیم interval نرخ ثابت در شی ScheduledThreadPoolExecutor ، تعداد دفعات استنتاج مدل را از کلیپ های صوتی تنظیم کنید:

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. شی classifyRunnable در کد بالا متد AudioClassificationHelper.classifyAudio() را اجرا می کند که آخرین داده های صوتی موجود را از ضبط کننده بارگیری می کند و یک پیش بینی را انجام می دهد:

    private fun classifyAudio() {
      tensorAudio.load(recorder)
      val output = classifier.classify(tensorAudio)
      ...
    }
    

پردازش پیش بینی را متوقف کنید

مطمئن شوید که وقتی بخش یا فعالیت پردازش صوتی برنامه شما تمرکز خود را از دست می دهد، کد برنامه شما طبقه بندی صدا را متوقف می کند. اجرای مداوم مدل یادگیری ماشینی تأثیر قابل توجهی بر عمر باتری دستگاه اندرویدی دارد. از روش onPause() فعالیت یا قطعه مرتبط با طبقه‌بندی صدا برای توقف ضبط صدا و پردازش پیش‌بینی استفاده کنید.

برای توقف ضبط و طبقه بندی صدا:

  • همانطور که در زیر در کلاس AudioFragment نشان داده شده است، از متد AudioClassificationHelper.stopAudioClassification() برای توقف ضبط و اجرای مدل استفاده کنید:

    override fun onPause() {
      super.onPause()
      if (::audioHelper.isInitialized ) {
        audioHelper.stopAudioClassification()
      }
    }
    

خروجی مدل دسته

در برنامه اندرویدی شما، پس از پردازش یک کلیپ صوتی، مدل لیستی از پیش‌بینی‌ها را تولید می‌کند که کد برنامه شما باید با اجرای منطق تجاری اضافی، نمایش نتایج به کاربر یا انجام اقدامات دیگر انجام دهد. خروجی هر مدل TensorFlow Lite از نظر تعداد پیش‌بینی‌هایی که تولید می‌کند (یک یا چند)، و اطلاعات توصیفی برای هر پیش‌بینی متفاوت است. در مورد مدل‌های موجود در برنامه مثال، پیش‌بینی‌ها یا فهرستی از صداها یا کلمات شناخته شده هستند. شیء گزینه های AudioClassifier استفاده شده در مثال کد به شما امکان می دهد حداکثر تعداد پیش بینی ها را با متد setMaxResults() تنظیم کنید، همانطور که در بخش Initialize مدل ML نشان داده شده است.

برای بدست آوردن نتایج پیش بینی از مدل:

  1. نتایج متد classify() شیء AudioClassifier را دریافت کرده و به شی شنونده (مرجع کد) ارسال کنید:

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. از تابع onResult() شنونده برای کنترل خروجی با اجرای منطق تجاری یا نمایش نتایج به کاربر استفاده کنید:

    private val audioClassificationListener = object : AudioClassificationListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        requireActivity().runOnUiThread {
          adapter.categoryList = results
          adapter.notifyDataSetChanged()
          fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
        }
      }
    

مدل مورد استفاده در این مثال فهرستی از پیش‌بینی‌ها را با برچسبی برای صدا یا کلمه طبقه‌بندی‌شده و یک امتیاز پیش‌بینی بین ۰ تا ۱ به‌عنوان شناور نشان‌دهنده اطمینان پیش‌بینی ایجاد می‌کند که ۱ بالاترین رتبه اطمینان است. به طور کلی، پیش‌بینی‌هایی با امتیاز زیر 50 درصد (0.5) غیرقطعی در نظر گرفته می‌شوند. با این حال، نحوه مدیریت نتایج پیش‌بینی کم ارزش به شما و نیازهای برنامه شما بستگی دارد.

هنگامی که مدل مجموعه ای از نتایج پیش بینی را برگرداند، برنامه شما می تواند با ارائه نتیجه به کاربر یا اجرای منطق اضافی بر روی آن پیش بینی ها عمل کند. در مورد کد مثال، برنامه صداها یا کلمات شناسایی شده را در رابط کاربری برنامه فهرست می کند.

مراحل بعدی

می‌توانید مدل‌های اضافی TensorFlow Lite را برای پردازش صدا در TensorFlow Hub و از طریق صفحه راهنمای مدل‌های از پیش آموزش دیده پیدا کنید. برای اطلاعات بیشتر در مورد پیاده سازی یادگیری ماشین در برنامه تلفن همراه خود با TensorFlow Lite، به راهنمای توسعه دهنده TensorFlow Lite مراجعه کنید.