07 สิงหาคม 2556

[Android Code] เปลี่ยนเสียงพูดให้กลายเป็นข้อความด้วย Voice Recognition



        Voice Recognition (บ้างก็เรียกว่า Speech Recognition) หรือที่รู้จักกันในนามของฟีเจอร์สั่งงานด้วยเสียง ซึ่งบนแอนดรอยด์ถือเป็นฟีเจอร์ปกติที่มีอยู่แทบทุกอุปกรณ์แอนดรอยด์อยู่แล้ว และการเรียกใช้งานก็โคตรจะง่ายเลยล่ะ

        ซึ่งบนแอนดรอยด์จะรองรับการเรียกใช้งานความสามารถนี้อยู่แล้ว โดยไม่จำเป็นต้องเขียนโค้ดใดๆเพื่อเรียกใช้งาน Voice Recognition ภายในแอพ แต่จะเป็นการเรียกหน้าต่าง Voice Recognition ขึ้นมาแทน

เรื่อง (ที่ควรจะ) น่ารู้

        Voice Recognition บนแอนดรอยด์แทบทุกเครื่องในทุกวันนี้ เบื้องหลังของมันก็คือ Google นั่นเอง ซึ่งทาง Google ก็ได้พัฒนาระบบตัวนี้มาตลอดทุกเวอร์ชัน ซึ่งเมื่อก่อนนั้นจะมีข้อจำกัดที่ว่าเวลาใช้งานจะต้องต่ออินเตอร์เน็ตเท่านั้น เพราะว่าเสียงที่พูดจะถูกส่งขึ้นไปประมวลผลบนเซิฟเวอร์แล้วส่งผลลัพธ์ที่ได้กลับมา ในตอนนั้นการทำ Offline Voice Recognition ยังไม่อำนวยมากนัก แถมยังไม่มีภาษาไทยด้วย

        จนมาวันหนึ่ง Google ก็ได้ประกาศกร้าวว่ารองรับภาษาไทยแล้ว​ (ก็เฮสิครับ) จึงทำให้นักพัฒนาหลายๆคนสามารถใช้ประโยชน์จาก Voice Recognition ได้สะดวกขึ้น จากเดิมที่ต้องใช้เฉพาะภาษาอังกฤษ เพียงแค่ไปตั้งค่าใน Settings > Language and input > Voice input ก็สามารถเลือกภาษาไทยเพิ่มได้เลย


        ล่าสุดนี้บนแอนดรอยด์ก็ได้มี Offline Voice Recognition เป็นที่เรียบร้อยแล้ว โดยจะต้องดาวน์โหลดข้อมูลที่ใช้ในการวิเคราะห์มาเก็บไว้ในเครื่องก่อนถึงจะทำงานได้ ซึ่งที่น่าเสียดายก็คือในตอนนี้ภาษาไทยยังทำ Offline Voice Recognition ไม่ได้จ้า ต้องใช้แบบต่ออินเตอร์เน็ตไปก่อน


        แต่ก็ดีกว่าไม่มีให้ใช้เนอะ

การใช้งานที่โคตรจะง่าย

        ในการทำ Text To Speech จะต้องใช้คลาส TextToSpeech แต่สำหรับ Voice Recognition นั้นไม่ต้องใช้คลาสอะไรเกี่ยวกับมันเลย เพียงแค่เรียกใช้งานด้วย Intent และคำสั่ง StartActivityForResult ก็สามารถทำงานได้แล้ว

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;

public class MainActivity extends Activity implements View.OnClickListener {
    private final static int REQUEST_VOICE_RECOGNITION = 10001;

    ...

    private void callVoiceRecognition() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        startActivityForResult(intent, REQUEST_VOIC_RECOGINITION);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // ผลลัพธ์ที่ส่งกลับมา       
    }
}

        แค่นี้แหละ!! ซึ่ง Request Code ที่กำหนดเป็น 10001 ไม่ใช่เลขตายตัว กำหนดเป็นเลขอะไรก็ได้ เอาไว้เช็คตอนขากลับเฉยๆว่าข้อมูลที่ส่งกลับมาเป็นอันเดียวกับตอนที่ส่งไปในตอนแรกหรือป่าว

        ทีนี้ก็เหลือแค่การดึงข้อมูลผลลัพธ์ที่ได้นั่นเอง ก่อนอื่นต้องแยกจาก Request Code กับ Result Code ก่อนเลย ว่า Request Code เป็นอันเดียวกับที่ส่งไปตอนแรกใช่มั้ย และผลลัพธ์ที่ได้คือ OK ใช่มั้ย มีข้อมูลส่งกลับมาใช่มั้ย

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_VOIC_RECOGINITION &&
            resultCode == RESULT_OK &&
            data != null) {
        ArrayList<String> resultList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        
        
    }
}

        จะเห็นว่าผลลัพธ์ที่ได้นั้นเป็น String Array List ทั้งนี้ก็เพราะว่าผลลัพธ์ไม่ได้แม่นยำ 100% เสมอไป ดังนั้นอันไหนที่น่าจะใกล้เคียงก็จะถูกส่งกลับมาด้วย ซึ่งเรียงลำดับตามความน่าจะเป็น Array Index ตัวที่ 0 ก็จะใกล้เคียงที่สุด

        สมมติว่าเจ้าของบล็อกพูดไปว่า "Digital Smart Box" ผลลัพธ์ที่ได้กลับมาก็จะมีให้เลือกดังนี้
                • (อันดับ 1) Digital smart box
                • (อันดับ 2) digital smart box
                • (อันดับ 3) Digital smart lock
                • (อันดับ 4) Digital Smart Watch
                • (อันดับ 5) digital smart lock

        ถ้าไม่คิดอะไรมากก็ใช้ตัวแรกสุดน่ะแหละครับ เพราะเป็นตัวที่น่าจะถูกต้องมากที่สุดแล้ว พอได้ข้อความเป็น String แล้วก็เอาไปใช้ทำอะไรตามใจชอบเลยครับ

กำหนดที่ต้องการได้ด้วยนะ

        สมมติว่าผู้ที่หลงเข้ามาอ่านอยากให้ Voice Recognition รับข้อความเป็นภาษาไทย ถึงแม้ว่าเครื่องนั้นๆจะใช้เป็นภาษาอังกฤษอยู่ก็ตาม สามารถกำหนดค่าเข้าไปใน Intent ได้ครับ เพื่อเลือกภาษาที่ต้องการ

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "th-TH");
startActivityForResult(intent, REQUEST_VOIC_RECOGINITION);

        เวลาเรียกขึ้นมาก็จะเห็นว่ามีห้อยท้ายบรรทัดว่าเป็นภาษาอะไรอยู่ด้วย



        ไม่น่าจะยากสำหรับทุกคนเนอะ XD





เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium