华为机器学习套件下载模型时出现异常

Posted

技术标签:

【中文标题】华为机器学习套件下载模型时出现异常【英文标题】:Huawei ML kit Exception while downloading Model 【发布时间】:2021-11-25 11:17:59 【问题描述】:

我正在使用华为机器学习套件进行设备翻译,但下载模型总是显示异常。我正在关注Huawei Doc On-device Translation。我尝试了以下代码,但仍然不断收到异常。

build.gradle(app)

plugins 
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.huawei.agconnect'
    id 'kotlin-kapt'


android 
    compileSdk 30

    defaultConfig 
        applicationId "com.example.huaweitestads"
        minSdk 21
        targetSdk 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        
    
    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    
    kotlinOptions 
        jvmTarget = '1.8'
    
    buildFeatures 
        dataBinding true
    


dependencies 

    implementation 'androidx.core:core-ktx:1.6.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    kapt "com.android.databinding:compiler:3.5.0"
    //Huawei Dependency
    implementation 'com.huawei.agconnect:agconnect-core:1.5.2.300'
    implementation 'com.huawei.hms:ads-lite:13.4.45.308'
    implementation 'com.huawei.hms:ads:3.4.45.308'

    implementation 'com.huawei.hms:ads-identifier:3.4.39.302'
    implementation 'com.huawei.hms:ads-installreferrer:3.4.39.302'
    implementation 'com.huawei.hms:ml-computer-voice-asr-plugin:1.0.4.300'
    implementation 'com.huawei.hms:ml-computer-translate:3.0.0.300'
    implementation 'com.huawei.hms:ml-computer-translate-model:3.0.0.300'
//    implementation 'com.huawei.hms:ml-computer-voice-asr:2.2.0.300'

主活动

    class MainActivity : AppCompatActivity() 
        private val permissionsRequestCode = 123
        private lateinit var managePermissions: ManagePermissions
        private lateinit var binding: ActivityMainBinding
        private lateinit var buttonClick: Button
        private var interestitialAd: InterstitialAd? = null
        private lateinit var sharedPreferences: SharedPreferences
        val REQUEST_CODE_ASR : Int = 100
        var dialogBinding: LayCustomDialogBinding? = null
        var customDialog: AlertDialog? = null
         override fun onCreate(savedInstanceState: Bundle?) 
                super.onCreate(savedInstanceState)
                binding = ActivityMainBinding.inflate(layoutInflater)
                val view = binding.root
                setContentView(view)
                dialogBinding = DataBindingUtil.inflate(
                    LayoutInflater.from(this),
                    R.layout.lay_custom_dialog,
                    null,
                    false
                )
        
                customDialog = AlertDialog.Builder(this,0).create()
                customDialog?.apply 
                    window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
                    setView(dialogBinding?.root)
                    setCancelable(false)
                
                //initialize the Huawei Ads
                HwAds.init(this)
                MLApplication.getInstance().apiKey = "App Key"
                val list = listOf(
                   Manifest.permission.READ_EXTERNAL_STORAGE,
                   Manifest.permission.RECORD_AUDIO,
                   Manifest.permission.WRITE_EXTERNAL_STORAGE
                )
        
                sharedPreferences = getSharedPreferences(getString(R.string.pref_file_name), Context.MODE_PRIVATE)
                managePermissions = ManagePermissions(this, list, permissionsRequestCode, sharedPreferences)
      
                buttonClick = findViewById(R.id.btn_click)
                interestitialAd = InterstitialAd(this)
                interestitialAd!!.adId = "testb4znbuh3n2"
                createSharedPrefFile()
                  
                binding.btnClick.setOnClickListener 
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                        val checkerDialog = managePermissions.checkPermissions()
                        if (!checkerDialog) 
                            showDialogForListening()
                        
                       
                    
                
               
            
         private fun showDialogForListening() 
            val intent = Intent(this, MLAsrCaptureActivity::class.java)
                .putExtra(MLAsrCaptureConstants.LANGUAGE, "en-US")
                .putExtra(MLAsrCaptureConstants.FEATURE, MLAsrCaptureConstants.FEATURE_WORDFLUX)
            startActivityForResult(intent, REQUEST_CODE_ASR)
        
        override protected fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
            super.onActivityResult(requestCode, resultCode, data)
            var text = ""
            // REQUEST_CODE_ASR: request code between the current activity and speech pickup UI activity defined in step 3.
            if (requestCode == REQUEST_CODE_ASR) 
                when (resultCode) 
                    MLAsrCaptureConstants.ASR_SUCCESS -> if (data != null) 
                        val bundle = data.extras
                        // Obtain the text information recognized from speech.
                        if (bundle!!.containsKey(MLAsrCaptureConstants.ASR_RESULT)) 
                            text = bundle.getString(MLAsrCaptureConstants.ASR_RESULT).toString()
                            // Process the recognized text information.
                            if(text.isNotEmpty())
                                binding.tvInput.text = text
                                TranslateLocally(text)
                            else
                                Toast.makeText(this, "Text Couldn't Recognize. Please try again", Toast.LENGTH_SHORT).show()
                            
                        
                    
 // Processing logic for recognition failure.
                    MLAsrCaptureConstants.ASR_FAILURE ->                    
                        if (data != null) 
                            val bundle = data.extras
                            // Check whether a result code is contained.
                            if (bundle!!.containsKey(MLAsrCaptureConstants.ASR_ERROR_CODE)) 
                                val errorCode = bundle.getInt(MLAsrCaptureConstants.ASR_ERROR_CODE)
                                // Perform troubleshooting based on the result code.
                            
                            // Check whether error information is contained.
                            if (bundle.containsKey(MLAsrCaptureConstants.ASR_ERROR_MESSAGE)) 
                                val errorMsg = bundle.getString(MLAsrCaptureConstants.ASR_ERROR_MESSAGE)
                                // Perform troubleshooting based on the error information.
                            
                            // Check whether a sub-result code is contained.
                            if (bundle.containsKey(MLAsrCaptureConstants.ASR_SUB_ERROR_CODE)) 
                                val subErrorCode = bundle.getInt(MLAsrCaptureConstants.ASR_SUB_ERROR_CODE)
                                // Process the sub-result code.
                            
                        
                    else -> 
                    
                
            
        
    private fun TranslateLocally(input: String)
        
            val setting = MLLocalTranslateSetting.Factory()
                .setSourceLangCode("zh")
                .setTargetLangCode("en")
                .create()
            val mlLocalTranslator = MLTranslatorFactory.getInstance().getLocalTranslator(setting)
            MLTranslateLanguage.getLocalAllLanguages().addOnSuccessListener
                for (item in it)
                    Log.d("SupportedLang", "TranslationBeginWithInternet: $item")
            
            obtainModel()
        
    
        private fun obtainModel() 
            val manager = MLLocalModelManager.getInstance()
            val sourceLangCode = "en"
            val model = MLLocalTranslatorModel.Factory(sourceLangCode).create()
            val downloadStrategy = MLModelDownloadStrategy.Factory()
                .needWifi()
                .create()

            customDialog?.show()
            val downloadProgressListener = MLModelDownloadListener alreadyDownLength, totalLength ->
                runOnUiThread 
                    setProgressBar(alreadyDownLength,totalLength)
                
            
            manager.downloadModel(model,downloadStrategy,downloadProgressListener).addOnSuccessListener
                Toast.makeText(this, "Downloading: $it", Toast.LENGTH_SHORT).show()
    //            customDialog?.dismiss()
            .addOnFailureListener
    This is the Line where I m Getting the Error.Can any one help please.
    **//**Error is: The model doesn't Exist!****
                Toast.makeText(this, "this is Error: $it", Toast.LENGTH_SHORT).show()
                dialogBinding?.btnOk?.setOnClickListener
                    customDialog?.dismiss()
                
            
        
    
        private fun setProgressBar(alreadyDownlength: Long, totalLength: Long) 
            dialogBinding?.customProgressBar?.setProgressWithAnimation(alreadyDownlength.toFloat())
            dialogBinding?.customProgressBar?.setMax(totalLength.toInt())
        
        

清单文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.huaweitestads">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


    <application
        android:name=".AdSampleApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.HuaweiTestAds"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".InterestitialActivity"
            android:exported="true" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="com.huawei.hms.ml.DEPENDENCY"
            android:value= "translate"/>
    </application>

</manifest>

我已经在项目中添加了agconnect文件。远程翻译工作正常。任何帮助都非常感谢谢谢。

屏幕截图:异常

Detailed LogFile:

【问题讨论】:

hi@waheed shah,能否分享一下问题发生时得到的详细日志? hi@shirley,感谢您的回复。我添加了屏幕截图和详细的 logcatFile 以供参考。请查看并建议我解决方案。 @waheed shah 你能提供你看到的异常的日志吗?这将有助于解决问题。如果您能看到错误代码,您可以参考设备上的模型下载错误代码来排除错误。以下是定义:developer.huawei.com/consumer/en/doc/development/… @waheedshah 我正在调查您的问题,会尽快更新您的信息 @Zinna 好的,等待解决方案。 【参考方案1】:

日志显示下载的翻译语言为en_en,调用接口时找不到对应的接口。

所以你可以尝试更改以下代码:

val sourceLangCode = "en"

val sourceLangCode = "zh"

【讨论】:

我添加了 "Log.d("SourceLang", "obtainModel: $model.languageCode")" 来检查正在获取什么。我将 en-US 作为语言代码,但问题仍然存在。当我从“en-US”更改为“zh”时。模型开始下载。为什么它不适用于“en-US”? 界面中没有找到下载翻译语言en_en。因此,会报告错误。您可以在日志文件中搜索关键字“translation”并查看下载的翻译语言 en_name。 This picture 是哪里出了问题。 实际上,最初我添加了带有 null 值的 sourceCode,我得到了错误。然后,我已更改为您在图片中显示的内容。最后我将语言代码添加为“en-US”,但问题仍然存在。型号“en-US”不可用吗? 型号“en-US”不是 ISO 639-1 格式。下载模型的格式为“en_name”,“en_name”前面的“en”不能更改。你只需要设置“name”,“name”就是“sourceLangCode”。使用 ISO 639-1。例如,如果要将德语转换为俄语,则需要下载“en_de”和“en_ru”模型。

以上是关于华为机器学习套件下载模型时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

为华为相机套件添加“专业模式”时出现问题

隆重介绍恩智浦MCU机器学习教育套件——OpenART

我正在使用 GridSearchCV 训练一个 Ann 机器学习模型,但在 gridSearchCV 中遇到了 IndexError

机器学习:利用华为云ModelArts模型识别几种难以辨别的动物

华为云技术分享机器学习(01)——机器学习简介

加载 mlmodel 时出现机器学习错误“No known class for loading model type > MLModelType_pipelineClassifier”