-2

Nhận dạng giọng nói - Speech To Text - Sample Android

Trên các ứng dụng như Google Voice hay Facebook Message, ứng dụng nhận dạng giọng nói không còn xa lạ với các dân IT hay các ứng dụng thường ngày trên SmartPhone của hầu hết mọi người. Vậy với Developer làm sao ta có thể kế thừa sử dụng lại và nhận biết được dữ liệu gì đã nhận được sau khi input vào là voice để thực hiện cho các ứng dụng bên dưới như: Đọc báo, ứng dụng cho người khiếm thị, ứng dụng cho người cao tuổi hay ứng dụng cho trẻ em, người chưa biết được mặt chữ vẫn có thể sử dụng được

Nếu các bạn sử dụng 1 trong các ứng dụng trên thì đều việc này rất đơn giản nhưng trong thực tế xử lý thì không hoàn toàn như vậy

Thứ nhất, các nhà phát triển phải xây dựng nên một công nghệ có thể lắng nghe, phân tích và phiên dịch một cách chính xác giọng nói của người dùng. Nếu không thì làm sao app biết bạn đang nói gì, còn nếu độ chính xác không cao thì cũng như không.

Thứ hai, vấn đề bản địa hóa (localization) cũng là một chuyện làm đau đầu các lập trình viên. Mỗi quốc gia sẽ có ngôn ngữ của riêng mình, vấn đề đó là làm thế nào để có thể hỗ trợ càng nhiều ngôn ngữ càng tốt. Hiện nay hầu hết những dịch vụ giọng nói đều hỗ trợ tiếng Anh, Google Voice Input trong Android và Voice Dictation trong iOS 8 thì có hỗ trợ tiếng Việt nhưng cũng còn nhiều hạn chế. Đó là chưa nói đến việc mỗi vùng miền lại có cách nói, giọng điệu khác nhau mặc dù họ sử dụng cùng một ngôn ngữ.

Mô hình triển khai công nghệ

Có nhiều cách thức mà các công ty hiện nay đang triển khai voice technology, có thể kể đến 2 phương pháp phổ biến như sau:

Điện toán đám mây: Trong trường hợp này, việc nhận dạng, xử lý ngôn ngữ (chính là TTS hoặc NLP mà mình đã nói ở trên) sẽ diễn ra trên máy chủ của các công ty cung cấp dịch vụ. Phương pháp đám mây giúp việc nhận dạng được chính xác hơn, ứng dụng thì có dung lượng nhỏ, nhưng bù lại thì thiết bị ở phía người dùng phải luôn kết nối với Internet. Độ trễ trong quá trình gửi giọng nói từ máy lên server rồi trả kết quả từ server về lại máy cũng là những thứ đáng cân nhắc. Siri, Google Voice, Cortana hiện đang xài cách này.

Tích hợp thẳng vào app: Với phương thức này, quá trình xử lý giọng nói sẽ diễn ra trong nội bộ ứng dụng, không cần giao tiếp với bên ngoài, chính vì thế tốc độ sẽ nhanh hơn. Người dùng cũng không bắt buộc phải kết nối vào mạng thường trực. Tuy nhiên, giải pháp này gặp nhược điểm đó là khi có cập nhật hoặc thay đổi gì đó về bộ máy nhận dạng, nhà sản xuất sẽ phải cập nhật lại cả một app, trong khi với phương thức đám mây thì những thay đổi đó chỉ cần làm ở phía server. Kích thước ứng dụng cũng sẽ tăng lên, có thể lên tới cả vài trăm MB. Hiện có Nuance và một vài app nhỏ là xài phương pháp tích hợp. Apple, Google cũng có bổ sung tùy chọn offline cho một số ngôn ngữ nhất định dùng trong việc chuyển văn bản thành chữ viết.

**Một số thư viện phổ biến **

Nuance có lẽ là cái tên được nhắc đến nhiều nhất trong việc cung cấp thư viện giọng nói cho app di động. Chính nhờ vào những thư viện như thế này mà lập trình viên không cần phải tự mình thiết kế hệ thống nhận dạng, phiên dịch cho app mà chỉ cần xài lại cái có sẵn, tiết kiệm được nhiều thời gian, công sức và tiện bạc. Nuance có hỗ trợ cho tiếng Việt trong ứng dụng Dragon Dictation do chính hãng này phát triển.

OpenEars cũng là một thư viện khác nhưng nó thuộc dạng nguồn mở và hoạt động offline, hạn chế là chỉ hỗ trợ tiếng Anh và Tây Ban Nha. Vài cái tên khác có thể kể đến như Ivona, iSpeech, Vocalkit and Acapela.

Một cách khác mà nhiều phần mềm hiện cũng đang xài đó là tận dụng bộ nguồn nhận dạng có sẵn trên các hệ điều hành di động. Người dùng có thể kích hoạt tính năng này ở những chỗ cần nhập văn bản. Từ iOS 7 về trước thì tính năng này không hỗ trợ tiếng Việt, phải lên iOS 8 mới có. Google thì bắt đầu hỗ trợ nhập liệu tiếng Việt cho Android khoảng một năm về trước. Ngoài ra, Apple, Google cũng có cung cấp các hàm API giúp app của lập trình viên biết nói chỉ với vài dòng mã nguồn.

**Lập trình demo ứng dụng sử dụng công nghệ được tích hợp sẵn trong android support **

Tạo ứng dụng Sample và chỉnh một số file: Manifest, layout, MainActivity

  1. Thêm 1 số string value cho ứng dụng
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--- .... --->
    <string name="speech_prompt">Say something…</string>
    <string name="speech_not_supported">Sorry! Your device doesn\'t support speech input</string>
    <string name="tap_on_mic">Tap on mic to speak</string>
</resources>
  1. Thêm color trong sử dụng ứng dụng
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="bg_gradient_start">#31244e</color>
    <color name="bg_gradient_end">#6b394c</color>
</resources>
  1. Điều chỉnh activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_gradient"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/txtSpeechInput"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:textColor="@color/white"
        android:textSize="26dp"
        android:textStyle="normal" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="60dp"
        android:gravity="center"
        android:orientation="vertical" >

 <!--- Button start, stop speech --->
        <ImageButton
            android:id="@+id/btnSpeak"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            android:src="@drawable/ico_mic" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="@string/tap_on_mic"
            android:textColor="@color/white"
            android:textSize="15dp"
            android:textStyle="normal" />
    </LinearLayout>

</RelativeLayout>
  1. Việc cuối cùng là gọi code trong lib support để thực hiện input giọng nói MainActivity.java
public class MainActivity extends Activity {

    // Gọi các biến từ layout
    private TextView txtSpeechInput;
    private ImageButton btnSpeak;
    private final int REQ_CODE_SPEECH_INPUT = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtSpeechInput = (TextView) findViewById(R.id.txtSpeechInput);
        btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);

        // ẩn actionbar
        getActionBar().hide();

        // sự kiện cho start speech
        btnSpeak.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                promptSpeechInput();
            }
        });

    }

    /**
     * Gọi dialog của google speech thông qua Intent
     * Một số action quan trọng trong Intent như
     * ACTION_RECOGNIZE_SPEECH, LANGUAGE_MODEL_FREE_FORM, EXTRA_PROMPT
     * */
    private void promptSpeechInput() {
        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,
                getString(R.string.speech_prompt));
        try {
            startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
        } catch (ActivityNotFoundException a) {
            Toast.makeText(getApplicationContext(),
                    getString(R.string.speech_not_supported),
                    Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * Trả lại dữ liệu sau khi nhập giọng nói vào
     * */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                txtSpeechInput.setText(result.get(0));
            }
            break;
        }

        }
    }
}

Ok sau khi build t có được ứng dụng đơn giản sử dụng library mặc định của Google để nhận biết hay lấy được thông tin giọng nói input vào. Để thực hiện sâu hơn các bạn nên kế thừa từ 1 trong những lib nổi tiếng trên, vì nó đã được phát triển và cập nhật qua rất nhiều quá trình hoàn thiện

Chúc các bạn thành công với những ý tưởng về Speech to Text

Nguồn: Tinhte.vn, androidhive.info


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.