华为 ML Kit 下载模型时出现异常。

3

我正在使用华为ML Kit进行设备上的翻译,但下载模型时总是显示异常。我遵循 华为文档设备上的翻译。我已尝试以下代码,但仍然一直出现异常。

文件 build.gradle(应用程序)

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. How can I fix it?
    // **//**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())
    }
}

清单文件

<?xml version="1.0" encoding="utf-8"?>

<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文件添加到项目中。 远程翻译正常工作。

截图:异常

在此输入图片描述

详细的日志文件:


1
嗨,Waheed Shah,您能否分享在问题发生时获得的详细日志? - zhangxaochen
hi@shirley,感谢您的回复。我已经添加了屏幕截图和详细的logcat文件以供参考。请查看并为我提供解决方案。 - waheed shah
@waheed shah,您能提供您看到的异常日志吗?这将有助于解决问题。如果您能看到错误代码,您可以参考设备上模型下载错误代码以排除错误。以下是定义:https://developer.huawei.com/consumer/en/doc/development/hiai-References/mlsdkmodeldownload-errorcode-0000001058609238 - Zinna
@waheedshah,我正在研究您的问题,很快会给您更新。 - Zinna
@shirley 我正在使用中文“zh”作为源代码,将其翻译成英文“en”作为目标代码。 - waheed shah
显示剩余6条评论
1个回答

1
日志显示下载的翻译语言是en_en,当调用接口时找不到相应的接口。

因此,您可以尝试更改以下代码:

val sourceLangCode = "en"

val sourceLangCode = "zh"


1
我已经添加了"Log.d("SourceLang", "obtainModel: ${model.languageCode}")"来检查正在获取的内容。我得到的是en-US作为languageCode,但问题仍然存在。当我从"en-US"更改为"zh"时,模型开始下载。为什么"en-US"不能工作呢? - waheed shah
下载翻译语言en_en未在接口中找到,因此报告错误。您可以搜索日志文件中的关键字“translation”,并查看已下载的翻译语言en_name。这张图片是出错的地方。 - zhangxaochen
实际上,最初我将sourceCode添加了空值,导致出现错误。然后,我按照您在图片中展示的方式进行了更改。最后,我将languageCode添加为"en-US",但问题仍然存在。难道模型"en-US"不可用吗? - waheed shah
1
模型“en-US”不符合ISO 639-1格式。下载模型的格式为“en_name”,且“en_name”前面的“en”不能更改。您只需要设置“name”,而“name”是“sourceLangCode”。请使用ISO 639-1。例如,如果您想将德语转换为俄语,则需要下载“en_de”和“en_ru”模型。 - zhangxaochen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接