Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드 앱에 음성 인식(STT) 기능을 통합하는 방법

안드로이드는 RecognizerIntent.ACTION_RECOGNIZE_SPEECH를 통해 구글에서 기본 제공하는 음성 인식(음성 → 텍스트 변환, STT) API를 지원합니다. 이 글에서는 안드로이드 앱에 음성 인식 기능을 단계별로 통합하는 방법을 알아보겠습니다.

1단계: 새 프로젝트 생성

Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

2단계: 레이아웃 구성 (activity_main.xml)

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "https://schemas.android.com/apk/res/android"
    xmlns:app = "https://schemas.android.com/apk/res-auto"
    xmlns:tools = "https://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity">
    <LinearLayout
        android:layout_width = "match_parent"
        android:gravity = "center"
        android:layout_height = "match_parent">
    <TextView
        android:id = "@+id/text"
        android:textSize = "30sp"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width = "wrap_content"
        android:layout_alignParentBottom = "true"
        android:layout_centerInParent = "true"
        android:orientation = "vertical"
        android:layout_height = "wrap_content">
    <ImageView
        android:id = "@+id/speak"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:background = "?selectableItemBackground"
        android:src = "@android:drawable/ic_btn_speak_now"/>
    </LinearLayout>
</RelativeLayout>

위 레이아웃은 두 개의 요소로 구성되어 있습니다. 화면 중앙에는 인식된 텍스트를 표시할 TextView가 있고, 하단에는 마이크 이미지가 담긴 ImageView가 배치됩니다. 사용자가 이 ImageView를 클릭하면 구글 음성 인식 API가 호출되고, 그 결과가 TextView에 출력됩니다.

3단계: 메인 액티비티 작성 (MainActivity.java)

src/MainActivity.java 파일에 아래 코드를 추가합니다.

package com.example.andy.myapplication;

import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.speech.RecognizerIntent;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    private final int REQ_CODE = 100;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text);
        ImageView speak = findViewById(R.id.speak);
        speak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
                intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Need to speak");
                try {
                    startActivityForResult(intent, REQ_CODE);
                } catch (ActivityNotFoundException a) {
                    Toast.makeText(getApplicationContext(),
                    "Sorry your device not supported",
                    Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case REQ_CODE: {
                if (resultCode == RESULT_OK && null != data) {
                    ArrayList result = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    textView.setText(result.get(0));
                }
                break;
            }
        }
    }
}

핵심 코드 살펴보기

사용자가 ImageView(마이크 버튼)를 클릭하면 다음과 같이 인텐트(Intent)가 호출됩니다.

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Need to speak");
try {
    startActivityForResult(intent, REQ_CODE);
} catch (ActivityNotFoundException a) {
    Toast.makeText(getApplicationContext(), "Sorry your device not supported", Toast.LENGTH_SHORT).show();
}

위 코드에서는 구글 음성 인식 API를 호출합니다. 각 파라미터의 역할은 다음과 같습니다.

  • EXTRA_LANGUAGE_MODEL: 자유 형식(LANGUAGE_MODEL_FREE_FORM) 언어 모델을 지정하여 일상 회화 수준의 인식률을 높입니다.
  • EXTRA_LANGUAGE: Locale.getDefault()를 사용해 기기의 기본 언어로 음성을 인식합니다.
  • EXTRA_PROMPT: 음성 입력 대화상자에 표시될 안내 문구입니다.
  • ActivityNotFoundException 처리: 음성 인식을 지원하지 않는 기기일 경우 토스트 메시지로 사용자에게 알립니다.

API 호출 결과는 onActivityResult() 콜백으로 전달됩니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQ_CODE: {
            if (resultCode == RESULT_OK && null != data) {
                ArrayList result = data
                .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                textView.setText(result.get(0));
            }
            break;
        }
    }
}

인식 결과는 ArrayList 형태로 반환되며, 여기서는 첫 번째 항목(0번째 위치)을 가져와 TextView에 설정합니다. 결과 목록에는 인식 정확도 순으로 여러 후보 텍스트가 포함될 수 있습니다.

앱 실행 및 테스트

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 스마트폰을 컴퓨터에 연결했다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 목록에서 본인의 모바일 기기를 선택하면 앱이 설치되고 기본 화면이 표시됩니다.

안드로이드 앱에 음성 인식(STT) 기능을 통합하는 방법

화면 하단의 마이크 버튼을 클릭하면 구글 음성 인식 API가 호출되어 다음과 같은 대화상자가 나타납니다.

안드로이드 앱에 음성 인식(STT) 기능을 통합하는 방법

여기서 "Hey GOOGLE"이라고 말해 보겠습니다. 음성 인식이 완료되면 결과가 TextView에 자동으로 입력됩니다.

안드로이드 앱에 음성 인식(STT) 기능을 통합하는 방법

마무리

이처럼 RecognizerIntent만 활용하면 별도의 외부 라이브러리나 복잡한 설정 없이도 몇 줄의 코드로 음성 인식 기능을 손쉽게 구현할 수 있습니다. 음성 메모, 검색, 접근성 기능 등 다양한 앱에 활용해 보시기 바랍니다.