ML Kit 및 CameraX로 언어 인식, 텍스트 번역, 텍스트 번역: Android

ML Kit 및 CameraX로 언어 인식, 텍스트 번역, 텍스트 번역:
Android

이 Codelab 정보

subject최종 업데이트: 11월 4, 2021
account_circle작성자: carenc

1. 소개

ML Kit는 강력하고 사용하기 쉬운 패키지로 Android 및 Android 앱에 Google의 머신러닝 전문 지식을 적용하는 모바일 SDK입니다. 머신러닝 경험이 있든 없든 단 몇 줄의 코드로 필요한 기능을 쉽게 구현할 수 있습니다. 신경망이나 모델 최적화에 대한 심층적인 지식이 없어도 시작할 수 있습니다.

ML Kit를 사용하면 Mobile VisionTensorFlow Lite와 같은 Google의 ML 기술을 단일 SDK에 통합하여 앱에 ML 기술을 쉽게 적용할 수 있습니다. Mobile Vision 온디바이스 모델의 실시간 기능이든 커스텀 TensorFlow Lite 모델의 유연성이 필요하든 ML Kit를 사용하면 단 몇 줄의 코드로 작업을 수행할 수 있습니다.

이 Codelab에서는 실시간 카메라 피드의 텍스트 인식, 언어 식별, 번역을 기존 Android 앱에 추가하는 간단한 단계를 안내합니다. 또한 이 Codelab에서는 ML Kit API로 CameraX를 사용하는 방법에 관한 권장사항을 중점적으로 설명합니다.

빌드할 항목

이 Codelab에서는 ML Kit를 사용하여 Android 앱을 빌드합니다. 앱에서 ML Kit 텍스트 인식 온디바이스 API를 사용하여 실시간 카메라 피드의 텍스트를 인식합니다. 인식된 텍스트의 언어를 식별하기 위해 ML Kit Language Identification API를 사용합니다. 마지막으로 앱은 ML Kit Translation API를 사용하여 59가지 옵션 중 선택한 언어로 이 텍스트를 번역합니다.

최종적으로 아래 이미지와 비슷한 것을 볼 수 있습니다.

e2a9b80f1ff442d7.png

학습할 내용

  • ML Kit SDK를 사용하여 Android 앱에 머신러닝 기능을 쉽게 추가하는 방법
  • ML Kit 텍스트 인식, 언어 식별, Translation API 및 관련 기능
  • ML Kit API와 함께 CameraX 라이브러리를 사용하는 방법

필요한 항목

  • Android 스튜디오 최신 버전 (v4.0 이상)
  • 실제 Android 기기
  • 샘플 코드
  • Kotlin을 이용한 Android 개발에 관한 기본 지식

이 Codelab에서는 ML Kit에 중점을 둡니다. 이와 관련 없는 개념과 코드 블록은 이미 제공되어 구현되어 있습니다.

2. 설정

코드 다운로드

다음 링크를 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

다운로드한 ZIP 파일의 압축을 해제합니다. 이렇게 하면 필요한 모든 리소스가 포함된 루트 폴더 (mlkit-android)의 압축이 해제됩니다. 이 Codelab에서는 translate 하위 디렉터리의 리소스만 있으면 됩니다.

mlkit-android 저장소의 translate 하위 디렉터리에는 다음 디렉터리가 포함됩니다.

  • android_studio_folder.pngstarter: 이 Codelab에서 빌드하는 코드를 시작합니다.

3. 프로젝트 가져오기 및 ML Kit 및 CameraX 종속 항목 확인

시작 프로젝트를 Android 스튜디오로 가져옵니다. app/build.gradle 파일에 필요한 ML Kit 및 CameraX 종속 항목이 포함되어 있는지 확인합니다.

// CameraX dependencies
def camerax_version = "1.0.0-beta05"
implementation
"androidx.camera:camera-core:${camerax_version}"
implementation
"androidx.camera:camera-camera2:${camerax_version}"
implementation
"androidx.camera:camera-lifecycle:${camerax_version}"
implementation
"androidx.camera:camera-view:1.0.0-alpha12"

// ML Kit dependencies
implementation
'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
implementation
'com.google.mlkit:language-id:16.0.0'
implementation
'com.google.mlkit:translate:16.0.0'

4. 시작 앱 실행

이제 프로젝트를 Android 스튜디오로 가져오고 ML Kit 종속 항목을 확인했으므로 앱을 처음으로 실행할 수 있습니다. Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다.

앱이 기기에서 실행되고 카메라를 다양한 텍스트로 가리켜 실시간 피드를 볼 수 있지만 텍스트 인식 기능은 아직 구현되지 않았습니다.

bd1489441c334de3.png

5. 텍스트 인식 추가

이 단계에서는 비디오 카메라의 텍스트를 인식하는 기능을 앱에 추가합니다.

ML Kit 텍스트 감지기 인스턴스화

TextAnalyzer.kt 상단의 TODO를 바꿔 TextRecognition를 인스턴스화합니다. 이는 이후 단계에서 사용할 텍스트 인식기에 핸들을 가져오는 방법입니다. 또한 더 이상 필요하지 않을 때 감지기를 올바르게 닫으려면 감지기를 수명 주기 관찰자로 추가해야 합니다.

TextAnalyzer.kt

private val detector = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

init
{
   lifecycle
.addObserver(detector)
}

입력 이미지에서 텍스트 인식 실행 (카메라에서 버퍼로 생성됨)

CameraX 라이브러리는 이미지 분석에 사용할 수 있도록 카메라에서 이미지 스트림을 제공합니다. TextAnalyzer 클래스의 recognizeText() 메서드를 대체하여 각 이미지 프레임에서 ML Kit 텍스트 인식을 사용합니다.

TextAnalyzer.kt

private fun recognizeText(
   image
: InputImage
): Task<Text> {
   
// Pass image to an ML Kit Vision API
   
return detector.process(image)
       
.addOnSuccessListener { text ->
           
// Task completed successfully
           result
.value = text.text
       
}
       
.addOnFailureListener { exception ->
           
// Task failed with an exception
           
Log.e(TAG, "Text recognition error", exception)
           val message
= getErrorMessage(exception)
           message
?.let {
               
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
           
}
       
}
}

다음 줄은 텍스트 인식을 시작하기 위해 위의 메서드를 호출하는 방법을 보여줍니다. analyze() 메서드 끝에 다음 줄을 추가합니다. 이미지에서 분석이 완료되면 imageProxy.close를 호출해야 합니다. 그러지 않으면 실시간 카메라 피드에서 분석을 위해 추가 이미지를 처리할 수 없습니다.

TextAnalyzer.kt

recognizeText(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
   imageProxy
.close()
}

기기에서 앱 실행

이제 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다. 앱이 로드되면 실시간으로 카메라의 텍스트 인식을 시작해야 합니다. 확인하려면 카메라로 텍스트를 가리키세요. 앱이 텍스트를 인식하지 못하는 경우 '재설정'을 시도해 보세요. 카메라로 텍스트를 가리키기 전에 빈 공간을 가리켜서 감지를 시작합니다.

6. 언어 식별 추가

ML Kit 언어 식별자 인스턴스화

MainViewModel.kt은 기본 폴더에 있습니다. 파일로 이동하여 다음 필드를 MainViewModel.kt에 추가합니다. 이는 다음 단계에서 사용할 언어 식별자의 핸들을 가져오는 방법입니다.

MainViewModel.kt

private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

또한 클라이언트가 더 이상 필요하지 않으면 적절하게 종료되는지 확인하는 것이 좋습니다. 이렇게 하려면 ViewModelonCleared() 메서드를 재정의합니다.

MainViewModel.kt

override fun onCleared() {
   languageIdentifier
.close()
   translators
.evictAll()
}

감지된 텍스트에서 기기 내 언어 식별 실행

ML Kit 언어 식별자를 사용하여 이미지에서 감지된 텍스트의 언어를 가져옵니다.

MainViewModel.kt에 있는 sourceLang 필드 정의의 TODO를 다음 코드로 바꿉니다. 이 스니펫은 언어 식별 메서드를 호출하고 정의되지 않은 경우('und') 결과를 할당합니다. 언어가 정의되지 않은 경우 API가 지원되는 언어 목록에 따라 언어를 식별할 수 없음을 의미합니다.

MainViewModel.kt

val sourceLang = Transformations.switchMap(sourceText) { text ->
   val result
= MutableLiveData<Language>()
   languageIdentifier
.identifyLanguage(text)
       
.addOnSuccessListener { languageCode ->
           
if (languageCode != "und")
               result
.value = Language(languageCode)
       
}
   result
}

기기에서 앱 실행

이제 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다. 앱이 로드되면 카메라의 텍스트를 인식하고 실시간으로 텍스트의 언어를 식별해야 합니다. 확인하려면 카메라로 텍스트를 가리키세요.

7. 번역 추가

MainViewModel.kttranslate() 함수를 코드를 다음 코드로 바꿉니다. 이 함수는 출발어 값, 도착어 값, 출발어 텍스트를 가져와 번역을 수행합니다. 선택한 도착어 모델이 아직 기기에 다운로드되지 않은 경우 downloadModelIfNeeded()를 호출하여 번역한 다음 계속 진행합니다.

MainViewModel.kt

private fun translate(): Task<String> {
   val text = sourceText.value
   val source = sourceLang.value
   val target = targetLang.value
   if (modelDownloading.value != false || translating.value != false) {
       return Tasks.forCanceled()
   }
   if (source == null || target == null || text == null || text.isEmpty()) {
       return Tasks.forResult("")
   }
   val sourceLangCode = TranslateLanguage.fromLanguageTag(source.code)
   val targetLangCode = TranslateLanguage.fromLanguageTag(target.code)
   if (sourceLangCode == null || targetLangCode == null) {
       return Tasks.forCanceled()
   }
   val options = TranslatorOptions.Builder()
       .setSourceLanguage(sourceLangCode)
       .setTargetLanguage(targetLangCode)
       .build()
   val translator = translators[options]
   modelDownloading.setValue(true)

   // Register watchdog to unblock long running downloads
   Handler().postDelayed({ modelDownloading.setValue(false) }, 15000)
   modelDownloadTask = translator.downloadModelIfNeeded().addOnCompleteListener {
       modelDownloading.setValue(false)
   }
   translating.value = true
   return modelDownloadTask.onSuccessTask {
       translator.translate(text)
   }.addOnCompleteListener {
       translating.value = false
   }
}

시뮬레이터에서 앱 실행

이제 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다. 앱이 로드되면 아래 동영상과 같이 텍스트 인식과 식별된 언어 결과, 번역된 텍스트가 선택한 언어로 표시됩니다. 59개 언어 중에서 선택할 수 있습니다.

e2a9b80f1ff442d7.png

8. 축하합니다.

축하합니다. ML Kit를 사용하여 앱에 온디바이스 텍스트 인식, 언어 식별, 번역을 추가했습니다. 이제 실시간 카메라 피드에서 텍스트와 언어를 인식하고 이 텍스트를 내가 선택한 언어로 실시간으로 번역할 수 있습니다.

학습한 내용

  • Android 앱에 ML Kit를 추가하는 방법
  • ML Kit에서 기기 내 텍스트 인식을 사용하여 이미지 속 텍스트를 인식하는 방법
  • ML Kit에서 기기 내 언어 식별을 사용하여 텍스트 언어를 식별하는 방법
  • ML Kit에서 기기 내 번역을 사용하여 텍스트를 59개 언어로 동적으로 번역하는 방법
  • CameraX를 ML Kit API와 함께 사용하는 방법

다음 단계

  • 자체 Android 앱에서 ML Kit 및 CameraX를 사용하세요.

자세히 알아보기