Huawei Machine Learning Kit Kullanımı — 1

Murat Çakır
Huawei Developers - Türkiye
8 min readJun 26, 2020

Merhabalar,

Bu yazımızda Huawei Machine Learning(Makine Öğrenmesi) Kit’in bazı özelliklerini kullanarak sıfırdan basit bir uygulama yapacağız. Machine Learning Kit ile ilgili yazacağım serinin ilk yazısında uygulama geliştirirken Huawei App Gallery’i nasıl kullanacağımızdan teknik detaylara kadar bir çok konu üzerinden geçeceğiz. Yazılım dili olarak ise Kotlin’i kullacağız.

Öncelikle Machine Learning nedir sorusunun cevabını vererek yazıya başlamak istiyorum. Biraz detaylı tanımlamak gerekirse machine learning, bilgisayarların algılayıcı verisi ya da veritabanları gibi veri türlerine dayalı öğrenimini olanaklı kılan algoritmaların tasarım ve geliştirme süreçlerini konu edinen bir bilim dalıdır. Kısaca tanımlarsak verileri kullanan bir yapay zeka alt kümesidir. Peki Huawei geliştiricilere hangi Machine Learning özelliklerini kullanma imkanı tanıyor? Buraya tıklayarak Huawei resmi sitesinden her zaman en güncel dökümanlara kolaylıkla ulaşabilirsiniz. Unutmamalıyız ki her geçen gün Huawei Machine Learning Kit’inin özellikleri gelişmekte. Belki de gelecek teknolojileri arasında en önden yerini ayırtmış bir bilim dalından bahsediyoruz. Hatta şu an bile en önemli teknolojilerden biri olarak görebiliriz.

Biz bu yazıda 3 farklı özellik kullanacağız. Bunlar tanınmış yerleri görsel ile analiz eden “Landmark Recognition” özelliği, yazıyı bir çok dile çevirebilen “Text Translate” özelliği ve son olarak yazının hangi dil olduğunu analiz eden “Language Detection” özelliği. Diğer Huawei Machine Learning Kit’lerini ise bu yazının devam serilerinde sizler ile paylaşacağım. Hadi şimdi yapacaklarımıza adım adım başlayalım.

1- İlk adım olarak daha önce Huawei geliştirici hesabı açmadıysak Huawei Developer Console üzerinden geliştirici olarak kayıt olmamız gerekiyor. Bu link üzerinden giderek adımları takip edebilirsiniz.

2- Kayıt işlemi yaptıktan sonra veya daha önce kayıt olmuşsanız Huawei Developer hesabımızdan bir proje açmamız gerekmektedir. Bu link ile dökümanlardan işlemleri detaylı şekilde takip edebilirsiniz.

3- Proje açtıktan sonra uygulama bilgileri sayfası otomatik olarak görüntülenecektir. Bu sayfada, sistem tarafından uygulamanıza atanan Uygulama Kimliğini bulabilirsiniz.

4- Daha sonra ise “Develop” sekmesine tıklıyoruz ve sistem paket adını manuel mi otomatik mi oluşturmak istediğimizi bize soruyor. Ben manuel olarak ekliyorum ve aynı paket adında Android Studio’da bir proje oluşturuyorum.

5- Sonrasında AppGallery Connect sayfasında App information kısmına SHA256 parmak izini ekleyelim. SHA256 parmak izini Android Studio’dan görselde göreceğiniz gibi signingReport’a tıklayarak oluşturabilirsiniz.

6- Daha sonra üstteki görselde de göreceğiniz Add SDK butonuna tıklayarak Gradle dosyasında yapılması gereken adımları takip edelim. Bu adımlardan sonra uygulamamız artık App Connecte bağlanmış olcak. Hemen ardından projemizde kullanacağımız “Text Translate”, “Language Detection” ve “Landmark Recognition” kütüphaneleri de ekleyelim ve gradle dosyalarımız tamamen hazır duruma gelsin.

implementation 'com.huawei.hms:ml-computer-vision-ocr:1.0.3.300'
implementation 'com.huawei.hms:ml-computer-translate:1.0.3.300'
implementation 'com.huawei.hms:ml-computer-language-detection:1.0.3.300'

7- Huawei geliştirici consolunda yapacağımız son işlem ise en son bulunduğumuz sayfada Manage APIs sekmesinden ML Kit’i aktif etmek olacaktır. Artık bu adımları yaptıktan sonra geliştirmelere başlayabiliriz.

8- İlk olarak Manifest.xml dosyasına ekleyeceğimiz izinlerle başlayabiliriz. Uygulamada kamera ile resim çekme veya galeriden fotoğraf seçme özellikleri olacağı için 2 izin ekleyeceğiz.

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

9- İzinleri ekledikten sonra uygulama ana ekran tasarımını yapalım. Tasarımda 2 buton kullanalım bu buttonlar ile galeriden resim seçip veya kamera ile fotoğraf çekerek bitmap haline getirip ML Landmark Recognition özelliğini kullanacağımız aktiviteye göndereceğiz.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ImageView
android:id="@+id/take_picture_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_camera_alt_24" />

<TextView
android:id="@+id/take_picture_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Picture"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/take_picture_icon" />

<ImageView
android:id="@+id/pick_image_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="64dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/take_picture_text"
app:srcCompat="@drawable/ic_baseline_collections_24" />

<TextView
android:id="@+id/pick_image_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pick Image from Gallery"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pick_image_icon" />
</androidx.constraintlayout.widget.ConstraintLayout>

10- Şimdi aktivitimizde butonlara tıklandığında önce kullanıcıdan gerekli izinler alınmış mı diye kontrolleri yapalım alınmış ise resim çekme/seçme işlemini başlatalım. Önce ImageView’lara clickListener ekliyorum.

take_picture_icon.setOnClickListener {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf(Manifest.permission.CAMERA), myCameraRequestCode)
} else {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, 100)
}
}

pick_image_icon.setOnClickListener {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), myStorageRequestCode)
} else {
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent, 200)
}
}

11- İzinleri kontrol etmek için onRequestPermissionResult fonksiyonunu override ederek içinde izin kontrollerini yapıyoruz. İzin verilir ise direk yapmak istediğimiz işleme geçiyoruz.

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == myCameraRequestCode) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, 100)
} else {
Toast.makeText(this, "Camera permission denied", Toast.LENGTH_LONG).show();
}
}
else if(requestCode == myStorageRequestCode){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent, 200)
} else {
Toast.makeText(this, "Storage permission denied", Toast.LENGTH_LONG).show();
}
}
}

12- Kamera ile resim çektikten sonra veya galeriden resim seçildikten sonra kullandığımız fotoğrafın bitmap verisini Machine Learning Landmark Recognition işlemi yapacağımız aktivitede kullanacağız ben veriyi companion object ile diğer aktivitede kullanacağım. Değişkenimize bitmapi atadıktan sonra bu aktivitede işimiz bitmiş oluyor ve intent ile LandmarkRecognitionActivity’i başlatıyoruz.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 100) {
if (resultCode == Activity.RESULT_OK) { // resim seçildiğinde yapılacaklar
selectedImageBitmap = if (data?.data == null) {
data?.extras!!["data"] as Bitmap?
} else {
MediaStore.Images.Media.getBitmap(
this.contentResolver,
data.data
)
}
val intentFromCamera = Intent(this, LandmarkRecognitionActivity::class.java)
startActivity(intentFromCamera)
}
}
if (requestCode == 200) {
if (resultCode == Activity.RESULT_OK) {
val pickedImage: Uri? = data?.data
try {
selectedImageBitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, pickedImage)
val intentFromGallery = Intent(this, LandmarkRecognitionActivity::class.java)
startActivity(intentFromGallery)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
}

13- Oluşturduğumuz LandmarkRecognitionActivity isimli aktivitenin ilk olarak tasarımını yapalım. Tasarımda önceki aktiviteden yolladığımız bitmapi ekranda göstereceğimiz bir ImageView kullanacağız. Bunun yanı sıra landmark analizi yapıldıktan sonra analiz sonucunu ekranda göstermek için bir TextView oluşturacağız. Son olarak ise çeviri özelliklerini kullanmak için oluşturacağımız aktiviteye geçiş yapmak için bir buton kullanacağız.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LandmarkRecognitionActivity">

<TextView
android:id="@+id/landmark_information_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"
android:text="Landmark Analyzing..."
android:textColor="#000000"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@+id/open_translate_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" />

<ImageView
android:id="@+id/landmark_recognition_image"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="24dp"
android:src="@drawable/ic_launcher_background"
app:layout_constraintBottom_toTopOf="@+id/landmark_information_text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/open_translate_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open Translate"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

14- Tasarımı yaptıktan sonra onCreate içinde önce “Landmark Recognition” özelliğini kullanmak istediğimiz görseli ekrandaki ImageView’e yükledik. Sonra ise analiz özelliğini yazdığımız landmarkAnalyzer fonksiyonunu çağırdım.

landmark_recognition_image.setImageBitmap(selectedImageBitmap)
selectedImageBitmap?.let { landmarkAnalyzer() }

15- Sırasıyla önce MLRemoteLandmarkAnalyzerSetting nesnesini oluşturuyoruz. Burada ben setLargestNumOfReturns(1) ayarını 1 olarak ayarladım yani analiz sonucu olarak sadece bir değer dönmesini istiyorum. Sonrasında MLAnalyzerFactory nesnesini oluşturup öncesinde yaptığımız settings ayarlarını bu nesnede kullanıyoruz. Analiz yapılacak bitmap değişkenimizi de kullanarak analizi başlatıyoruz. İstek başarılı olursa displaySuccess fonksiyonumuzu çağırıyoruz. Başarılı olmazsa ise displayFailure fonksiyonumuzu çağırıyoruz.

private fun landmarkAnalyzer() {
val settings = MLRemoteLandmarkAnalyzerSetting.Factory()
.setLargestNumOfReturns(1)
.setPatternType(MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN)
.create()
val analyzer = MLAnalyzerFactory.getInstance()
.getRemoteLandmarkAnalyzer(settings)

val mlFrame = MLFrame.Creator()
.setBitmap(selectedImageBitmap).create()
val task: Task<List<MLRemoteLandmark>> =
analyzer.asyncAnalyseFrame(mlFrame)

task.addOnSuccessListener {
displaySuccess(it[0])
}.addOnFailureListener {
displayFailure()
}
}

16- displaySuccess() fonksiyonunda ise istek sonucu dönen veriyi, sonuçları göstereceğimiz TextView’a ayarlıyoruz ve ekranda kullanıcıya göstermiş oluyoruz. Bunun yanı sıra eğer sonuç bulunamamış ise ekranda kullanıcının bunun görmesini sağlıyoruz. Bu işlemle Huawei Machine Learning Kit’inin “Landmark Recognition” özelliğini kullanmış olduk.

fun displaySuccess(landmark: MLRemoteLandmark) {
if (landmark.landmark.contains("retCode") || landmark.landmark
.contains("retMsg") || landmark.landmark.contains("fail")
) {
landmark_information_text.text = "The landmark was not recognized."
} else {
var longitude = 0.0
var latitude = 0.0
var possibility = ""
var landmarkName = ""
var result = StringBuilder()
if (landmark.landmark != null) {
result = StringBuilder(
"""
Landmark information
${landmark.landmark}
""".trimIndent()
)
landmarkName = landmark.landmark
}
landmark_information_text.text = "LANDMARK INFORMATION : ${landmark.landmark}"

if (landmark.positionInfos != null) {
for (coordinate in landmark.positionInfos) {
// setText(Html.fromHtml("<b>" + myText + "</b>");
result.append("\nLatitude: ").append(coordinate.lat)
result.append("\nLongitude: ").append(coordinate.lng)
result.append("\nPossibility: %")
.append(DecimalFormat("##.##").format(landmark.possibility * 100))
longitude = coordinate.lng
latitude = coordinate.lat
possibility = DecimalFormat("##.##").format(landmark.possibility * 100)
}
}
landmark_information_text.text = Html.fromHtml("<big><b>Landmark Information</b></big> <br><big><b>$landmarkName</b></big><br><b>Latitude: </b>$latitude<br><b>Longitude: </b>$longitude<br><b>Possibility: </b>%$possibility")
}
}

17- “Landmark Recognition” özelliğini kullandıktan sonra ise artık “Text Translate” ve “Language Detection” özelliğini kullanmak için oluşturduğumuz buton ile TranslateActivity’e geçişi sağlıyoruz.

open_translate_button.setOnClickListener {
val intentFromGallery = Intent(this, TranslateActivity::class.java)
startActivity(intentFromGallery)
}

18- İlk olarak TranslateActivity’nin tasarımını yapalım. Tasarımda önce bir EditText’imiz olacak. Bu Edittext çevirilmesini istediğimiz cümleyi yazacağımız kısım için kullanılacak. Sonrasında bir Spinner kullanacağız ve hangi dile çevirmek istediğimizi buradan seçeceğiz. Son olarak ise Translate butonu ile çeviri işlemimizi yapacağız ve çeviri TextView’ımıza bu veriyi atayacağız.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#E4E4E4"
tools:context="com.huawei.example.huaweimlkitsample.TranslateActivity">

<EditText
android:id="@+id/translate_edittext"
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:background="#FFFFFF"
android:ems="10"
android:hint="Write any language here"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Detect Language"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<View
android:id="@+id/divede_view"
android:layout_width="wrap_content"
android:layout_height="2dp"
android:layout_marginTop="16dp"
android:background="#4DD0E1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/translate_edittext" />

<TextView
android:id="@+id/translation_text"
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_marginTop="8dp"
android:background="#FFFFFF"
android:text="Translation"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="@+id/translate_edittext"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/translate_edittext"
app:layout_constraintTop_toBottomOf="@+id/language_spinner" />

<Spinner
android:id="@+id/language_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divede_view" />

<TextView
android:id="@+id/translation_language_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:text="French"
app:layout_constraintBottom_toBottomOf="@+id/language_spinner"
app:layout_constraintEnd_toStartOf="@+id/language_spinner"
app:layout_constraintStart_toStartOf="@+id/translation_text"
app:layout_constraintTop_toTopOf="@+id/language_spinner" />

<Button
android:id="@+id/translate_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Translate"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/translation_text" />
</androidx.constraintlayout.widget.ConstraintLayout>

19- TranslateActivity çalışınca OnCreate içinde yazacağımız metinimizi hangi dile çevirmek istiyorsak onu seçebileceğimiz Spinner’ımızın adapterini ayarlıyoruz. Bunun yanında değişken tanımlamalarımızı da yapıyoruz.

val languageArray = arrayOf("Chinese", "English", "French", "Arabic", "Thai","Spanish","Turkish","Portuguese","Japanese","German","Italian","Russian")
var sourceLangCode="en"
var targetLangCode="zh"
var mlRemoteTranslator: MLRemoteTranslator?=null
var translateSetting:MLRemoteTranslateSetting?=null
val spinnerAdapter: ArrayAdapter<*> = ArrayAdapter<Any?>(this, android.R.layout.simple_spinner_item, languageArray)
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
language_spinner?.adapter = spinnerAdapter

20- OnCreate’de gerekli işlemleri yaptıktan sonra EditText’imize languageArray listemizde tanımlı olan dillerden herhangi bir dil ile bir cümle yazıp Translate butonumuza tıklıyoruz. Translate butonuna ilk tıkladığımızda önce hangi dil olduğunu belirlememiz gerekiyor. Bunun için MLRemoteLangDetector nesnesini kullanarak yazdığım metni de bu nesne ile kullanarak bir istek atıyoruz. Sonuç onSuccess’e düşerse isteğimiz başarılı olmuş demektir ve daha önce oluşturduğumuz sourceLangCode değişkenine istek sonucu bize dönen dil kodunu atıyoruz. Sonrasında MLRemoteTranslateSetting nesnemizi sourceCode ve targetLangCode değişkenimizi de kullanarak oluşturuyoruz. Bu şekilde Huawei Machine Learning “Language Detection” özelliğini kullanmış olduk. Dil analizi yaptıktan sonra ise metni translate etmek için translate() fonksiyonumuzu çağırıyoruz.

translate_button.setOnClickListener {
val mlRemoteLangDetect: MLRemoteLangDetector = MLLangDetectorFactory.getInstance()
.remoteLangDetector
val firstBestDetectTask: Task<String> = mlRemoteLangDetect.firstBestDetect(translate_edittext.text.toString())
firstBestDetectTask.addOnSuccessListener {
sourceLangCode=it
translateSetting = MLRemoteTranslateSetting.Factory() // Set the source language code. The ISO 639-1 standard is used. This parameter is optional. If this parameter is not set, the system automatically detects the language.
.setSourceLangCode(sourceLangCode) // Set the target language code. The ISO 639-1 standard is used.
.setTargetLangCode(targetLangCode)
.create()
mlRemoteTranslator = MLTranslatorFactory.getInstance().getRemoteTranslator(translateSetting)

translate()
// Processing logic for detection success.
}.addOnFailureListener {
// Processing logic for detection failure.
}
}

21- Translate fonksiyonunda ise daha önce oluşturduğumuz MLRemoteTranslateSetting nesnemizi kullanarak çeviri isteği yolluyoruz ve çeviri onSuccess’e düşer ise TextView’ımıza çeviri sonucunu atıyoruz ve böylece “Text Translate” özelliğini de kullanmış olduk.

private fun translate(){
val task = mlRemoteTranslator?.asyncTranslate(translate_edittext.text.toString())
task?.addOnSuccessListener { text ->
translation_text.text=text
}
?.addOnFailureListener {}
}

22- Son olarak ise Spinner ile farklı bir dile çeviri yapmak istersek OnItemSelected fonksiyonu içinde hangi dili seçersek o dilin kodunu targetLangCode değişkenimize atıyoruz.

override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
translation_language_text.text=languageArray[p2]
when {
languageArray[p2]=="Chinese" -> {
targetLangCode="zh"
}
languageArray[p2]=="Russian" -> {
targetLangCode="ru"
}
languageArray[p2]=="Turkish" -> {
targetLangCode="tr"
}
languageArray[p2]=="Portuguese" -> {
targetLangCode="pt"
}
languageArray[p2]=="Japanese" -> {
targetLangCode="ja"
}
languageArray[p2]=="German" -> {
targetLangCode="de"
}
languageArray[p2]=="Italian" -> {
targetLangCode="it"
}
languageArray[p2]=="English" -> {
targetLangCode="en"
}
languageArray[p2]=="French" -> {
targetLangCode="fr"
}
languageArray[p2]=="Arabic" -> {
targetLangCode="ar"
}
languageArray[p2]=="Thai" -> {
targetLangCode="th"
}
languageArray[p2]=="Spanish" -> {
targetLangCode="es"
}
}
}

Son adımla birlikte artık Huawei Machine Learning Kit’inin 3 özelliğini uygulamamızda kullanmış olduk. Proje kaynak kodunu bu linkten bulabilirsiniz. Bu yazının devam serilerinde görüşmek dileğiyle.

--

--