1. 소개
ML Kit는 강력하고 사용하기 쉬운 패키지로 Android 및 Android 앱에 Google의 머신러닝 전문 지식을 적용하는 모바일 SDK입니다. 머신러닝 분야에 경험이 있든 없든 코드 몇 줄만 작성하면 필요한 기능을 쉽게 구현할 수 있습니다. 따라서 신경망이나 모델 최적화에 대한 심층적인 지식 없이도 시작할 수 있습니다.
어떤 방식으로 작동되나요?
ML Kit를 사용하면 Mobile Vision, TensorFlow Lite와 같은 Google의 ML 기술을 단일 SDK에 통합하여 앱에서 ML 기법을 쉽게 적용할 수 있습니다. Mobile Vision의 기기 내 모델에 있는 강력한 실시간 기능이 필요한지 또는 커스텀 TensorFlow Lite 모델의 유연성이 필요한지와 관계없이 ML Kit를 사용하면 몇 줄의 코드로 이를 실현할 수 있습니다.
이 Codelab에서는 실시간 카메라 피드의 텍스트 인식, 언어 식별, 번역을 기존 Android 앱에 추가하는 간단한 단계를 안내합니다. 또한 이 Codelab에서는 ML Kit API와 함께 CameraX를 사용하는 것과 관련된 권장사항을 강조 표시합니다.
빌드할 항목
이 Codelab에서는 ML Kit를 사용하여 Android 앱을 빌드합니다. 앱은 ML Kit Text Recognition On-device API를 사용하여 실시간 카메라 피드의 텍스트를 인식합니다. ML Kit Language Identification API를 사용하여 인식된 텍스트의 언어를 식별합니다. 마지막으로 앱은 ML Kit Translation API를 사용하여 59가지 옵션 중 선택한 언어로 이 텍스트를 번역합니다.
최종적으로 아래 이미지와 비슷한 것을 볼 수 있습니다.
학습할 내용
- ML Kit SDK를 사용하여 Android 앱에 머신러닝 기능을 쉽게 추가하는 방법
- ML Kit 텍스트 인식, 언어 식별, 번역 API 및 기능
- ML Kit API와 함께 CameraX 라이브러리를 사용하는 방법
필요한 항목
- Android 스튜디오의 최신 버전 (v4.0 이상)
- 실제 Android 기기
- 샘플 코드
- Kotlin 기반 Android 개발에 관한 기본 지식
이 Codelab에서는 ML Kit에 중점을 둡니다. 관련 없는 개념과 코드 블록은 이미 제공되고 구현되어 있습니다.
2. 설정
코드 다운로드
다음 링크를 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.
다운로드한 ZIP 파일의 압축을 해제합니다. 그러면 필요한 모든 리소스가 포함된 루트 폴더 (mlkit-android
)가 압축 해제됩니다. 이 Codelab에서는 translate
하위 디렉터리의 리소스만 있으면 됩니다.
mlkit-android
저장소의 translate
하위 디렉터리에는 다음 디렉터리가 포함됩니다.
- starter: 이 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 ( )을 클릭합니다.
앱이 기기에서 실행되고 카메라를 다양한 텍스트에 비춰 실시간 피드를 볼 수 있지만 텍스트 인식 기능은 아직 구현되지 않았습니다.
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 ( )을 클릭합니다. 앱이 로드되면 카메라에서 실시간으로 텍스트를 인식하기 시작합니다. 카메라로 텍스트를 가리켜 확인합니다. 앱에서 텍스트를 인식하지 못하는 경우 카메라를 텍스트가 아닌 빈 공간에 가져간 후 텍스트에 가져가 감지를 '재설정'해 보세요.
6. 언어 식별 추가
ML Kit 언어 식별자 인스턴스화
MainViewModel.kt
은 기본 폴더에 있습니다. 파일로 이동하여 MainViewModel.kt
에 다음 필드를 추가합니다. 다음 단계에서 사용할 언어 식별자의 핸들을 가져오는 방법입니다.
MainViewModel.kt
private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
또한 더 이상 필요하지 않을 때 클라이언트가 제대로 종료되는지 확인해야 합니다. 이렇게 하려면 ViewModel
의 onCleared()
메서드를 재정의합니다.
MainViewModel.kt
override fun onCleared() {
languageIdentifier.close()
translators.evictAll()
}
감지된 텍스트에 기기 내 언어 식별 실행
ML Kit Language Identifier를 사용하여 이미지에서 감지된 텍스트의 언어를 가져옵니다.
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 ( )을 클릭합니다. 앱이 로드되면 카메라에서 텍스트를 인식하고 실시간으로 텍스트의 언어를 식별하기 시작합니다. 카메라로 텍스트를 가리켜 확인합니다.
7. 번역 추가
MainViewModel.kt
의 translate()
함수를 코드를 다음 코드로 바꿉니다. 이 함수는 출발어 값, 도착어 값, 소스 텍스트를 사용하여 번역을 실행합니다. 선택한 대상 언어 모델이 아직 기기에 다운로드되지 않은 경우 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 ( )을 클릭합니다. 앱이 로드되면 아래의 움직이는 이미지와 같이 텍스트 인식 및 식별된 언어 결과와 선택한 언어로 번역된 텍스트가 표시됩니다. 59개 언어 중 원하는 언어를 선택할 수 있습니다.
8. 축하합니다.
축하합니다. ML Kit를 사용하여 앱에 기기 내 텍스트 인식, 언어 식별, 번역을 추가했습니다. 이제 라이브 카메라 피드에서 텍스트와 언어를 인식하고 이 텍스트를 선택한 언어로 실시간으로 번역할 수 있습니다.
학습한 내용
- Android 앱에 ML Kit를 추가하는 방법
- ML Kit의 기기 내 텍스트 인식을 사용하여 이미지에서 텍스트를 인식하는 방법
- ML Kit에서 기기 내 언어 식별을 사용하여 텍스트의 언어를 식별하는 방법
- ML Kit의 기기 내 번역을 사용하여 텍스트를 59개 언어로 동적으로 번역하는 방법
- ML Kit API와 함께 CameraX를 사용하는 방법
다음 단계
- 나만의 Android 앱에서 ML Kit와 CameraX를 사용하세요.