การเข้าใจระบบ Automatic Speech Recognition (ASR) ผ่านการทดลอง

Source: Deep Learning on Medium


ในปัจจุบัน การเรียนรู้ภาษาเป็นส่วนสำคัญในชีวิตประจำวัน แต่มันไม่ง่ายเลยโดยเฉพาะเมื่อเกี่ยวกับการพูด พวกเรามีโอกาสรู้จักกับ “SayIt” ซึ่งเป็น Application ช่วยในการฝึกการออกเสียงภาษาอังกฤษให้มีความถูกต้อง โดยที่ Application นั้นสร้างขึ้นด้วยระบบ Automatic Speech Recognition (ASR) ที่ใช้เปรียบเทียบความใกล้เคียงของการออกเสียงของผู้ใช้งาน เมื่อเทียบกับเจ้าของภาษา

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

การทดลองนี้จะแบ่งเป็นช่วง ๆ เริ่มจาก

พื้นฐานของ ASR

ในช่วงนี้เริ่มจากความเข้าใจใน ASR โดยที่เราทำ Fourier Transform และ Inverse Fourier Transform นอกจากนั้นยังลอง Window Function อื่นด้วยได้ผลตามรูปที่ 1

รูปที่ 1 การทดลอง Fourier Transform

ผลจากรูปที่ 1 เกิดจากการใช้ Square window function และ Hamming window function จะสังเกตได้ว่า window function ที่แตกต่างกัน จะให้ผลลัพธ์ที่เป็น frequency-domain ที่แตกต่างกัน ซึ่งอาจจะมีความเหมาะสมกับงานแต่ละแบบที่แตกต่างกันด้วย นอกจากนี้ยังมีการทดลองเพิ่มเติม ซึ่งทำให้ทราบว่าการแปลงข้อมูลจาก Frequency-Domain กลับมา Time-Domain จะไม่เหมือนกับอันเดิมทั้งหมด เนื่องจากผลของความไม่ต่อเนื่องและความยาวที่จำกัดของข้อมูล

หลังจากที่ได้ข้อมูล Fourier Transform จากรูปที่ 1 นำมาสร้าง Spectrogram โดยใช้ Matrix Multiplication กับทุก window ที่มี แทนที่จะใช้ Sliding window ที่ช้ากว่า ข้อดีของ Matrix Multiplication คือสามารถใช้ได้กับทุกประเภทของ window function ต่างกับ Sliding window ที่สามารถใช้ได้กับ Square window function เท่านั้น การทำ Matrix Multiplication ได้ผลตามรูปที่ 2

รูปที่ 2 spectrogram ที่ได้จากการทำ Matrix Multiplication

การประมวลผลสัญญาณ

จากความรู้เรื่องการได้ยินของคนกับความรู้พื้นฐาน ASR สามารถตั้งสมมติฐานได้ว่า สัญญาณแต่ละช่วงจะมีเอกลักษณ์ที่แตกต่างกัน และเสียงที่แตกต่างกันสามารถแยก จากกันได้โดยใช้ข้อมูลจาก Spectrogram เพียงอย่างเดียว

การเตรียม spectrogram

พวกเราใช้ technique ที่เรียนจากวิชา ASR คือ DC offset removal และ pre-emphasis แล้วจึงสร้าง Spectrogram จากคลื่นเสียง แล้วเนื่องจากการรับรู้ของมนุษย์จะสามารถแยกเสียงที่ความถี่ต่ำได้ดีกว่าเสียงที่มีความถี่สูง จึงแปลง scale ของความถี่จาก linear scale เป็น exponential scale โดยที่เราเลือก Piano scale มีความใกล้เคียงกับ Mel scale ที่เลียนแบบการรับรู้เสียงของมนุษย์แต่ Piano scale มีความละเอียดในการแบ่งมากกว่า และยังคงความเป็น exponential scale ได้ มีผลลัพธ์ตามรูป 3.1–3.2

รูปที่ 3.1 spectrogram เดิม
รูปที่ 3.2 spectrogram หลังจากแปลงเป็น piano scale

หลังจากนั้น พบว่าลักษณะของ spectrogram ที่ได้มีลักษณะที่สลับไปมาระหว่างค่ามากและค่าน้อยในแกนเวลา จึงใช้การ smoothing เพื่อแก้ปัญหานี้โดยการ smoothing จะทำ weighted arithmetic mean กับ window รอบข้าง ซึ่ง หลังจากทำการ smoothing แล้วพบว่าค่าที่ได้อยู่ในช่วงที่กว้างมาก จึงทำการ scale ค่าลงแบบ exponential และทำ mean normalization โดยค่าสุดท้ายที่ได้จะเรียกว่า feature vector

ผลลัพธ์ทั้งหมดอยู่ในรูปที่ 3.3–3.4 โดยที่รูปที่ 2 และ 3.1–3.3 แสดงผลใน exponential scale เพราะจะดูได้ง่ายกว่า original scale

รูปที่ 3.3 spectrogram หลังจาก smoothing
รูปที่ 3.4 spectrogram หลังจากแปลงเป็น exponential scaling และทำ mean normalization

การแบ่ง phoneme

การแบ่งจะเกิดเมื่อเสียงมีความแตกต่างของ features กับเสียงรอบข้างมากพอ distance ของ feature vector นิยามโดยเป็นค่าขนาดของเวกเตอร์ที่ประกอบด้วยค่าที่มีความต่างมากที่สุด 2 ใน 3 อันดับแรกระหว่าง 2 feature vector ซึ่งแนวคิดของการใช้เพียง 2 ใน 3 คือ หากเสียงบางความถี่มีความแตกต่างกันมากพอ มนุษย์จะสามารถแยกเสียงเหล่านั้นออกจากกันได้ดังนั้น การใช้เพียง 2 ใน 3 จะช่วยให้เห็นความแตกต่างของ feature vector ได้ชัดเจนมากขึ้น

ในขั้นตอนนี้จะนำ feature vector ทั้งหมดมาสร้าง distance graph เพื่อหาจุดแบ่ง phoneme โดยแทนที่ จะใช้ feature vector เป็นคู่ๆ หาค่า distance ไปเรื่อย ๆ ซึ่งจะทำให้เกิดความผันผวนมากและไม่เหมาะกับข้อมูลที่มีเสียงรบกวนจะใช้เป็นค่าเฉลี่ยของ feature vector ด้านซ้าย และค่าเฉลี่ยของ feature vector ด้านขวา ในการหา distance แทน จากนั้นจะนำค่า distance ทั้งหมดทำการ mean normalization แล้วทำการเลือกจุดแบ่ง โดยจุดแบ่งที่เลือกจะต้องมีค่า distance มากพอ และเป็นจุด peak (นั้นคือ มากกว่า distance ข้างซ้าย และ distance ข้างขวาทั้งหมดใน window) โดยมีการกำหนดเพิ่มเติมว่า peak ที่เลือกจะต้องห่างกันมากกว่าบางค่า สุดท้ายจะใช้ dynamic programming เพื่อช่วยหา peak ที่ทำให้ distance รวมมีค่ามากที่สุด

วิธีนี้อาจจะไม่ได้ดีที่สุด แต่สามารถทำงานได้ดีบนข้อมูลส่วนใหญ่ ผลลัพธ์แสดงในรูปที่ 4–5 โดยที่เส้นสีขาวแสดงถึงจุดแบ่งที่ได้

รูปที่ 4 spectrogram ของเสียงพูดคำว่า “vincent” โดยเจ้าของภาษาที่เป็นผู้ชาย และมีเส้นแบ่งพร้อมกราฟ แสดง distance
รูปที่ 5 spectrogram ของเสียงพูดคำว่า “freedom” โดยเจ้าของภาษาที่เป็นผู้หญิงและมีเส้นแบ่งพร้อมกราฟ แสดง distance

การใช้ Deep learning

พวกเราใช้ deep learning เพื่อสร้าง model ที่ใช้สำหรับการ detect ข้อมูล phonetics ของเสียงพูด ซึ่งมีข้อมูลทั้งหมด 2528 ไฟล์โดยแต่ละไฟล์จะเป็นเสียงของคนพูดคำ 1 คำ โดยครึ่งหนึ่งจะเป็นเสียงของเจ้าของภาษาผู้ชาย และอีกครึ่งหนึ่งเป็นเสียงของเจ้าของภาษาผู้หญิง โดยที่แต่ละไฟล์จะมีข้อมูล phonetics อยู่แล้ว จากนั้นแบ่งเป็น 60:20:20 สำหรับ training, development และ testing ตามลำดับ

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

โดยที่ deep learning model จะสร้างจาก attention model ที่เรียนจากวิชา Natural Language Processing (NLP) ซึ่งเกี่ยวกับการประมวลผลภาษา ที่ข้อมูลนำเข้าของ model คือ feature ที่ถูกแบ่งเป็น phoneme แล้ว และผลที่ได้จาก model คือ ลำดับของ phonetics อย่างไรก็ตามหลังจากที่เรียน model แล้วผลลัพธ์ออกมาไม่มีรูปแบบที่แน่นอน ซึ่งน่าจะเกิดจากข้อมูลมีขนาดเล็กเกินไปและรูปแบบของ model เอง นอกจากนั้นยังมีเวลาจำกัดในการทดลองจึงจำเป็นต้องหยุดการทดลองไว้เท่านี้

อุปสรรคที่พบและวิธีแก้

จริง ๆ มีปัญหามากมาย แต่จะขอยกตัวอย่างมา 2 อย่าง

เรื่องแรกคือ การขาดความรู้ในด้าน ASR เนื่องจาก Project เกิดขึ้นก่อนที่จะเรียนวิชา ASR เลยทำให้ค่อย ๆ มีองค์ความรู้เพิ่มขึ้นตามเวลา แต่พอมีความรู้เพิ่มขึ้นเวลาก็เหลือน้อยลง จึงควรที่จะหาทางอื่น ๆ ในการเรียนรู้ให้ได้มากขึ้นเช่น website หรือ research ต่าง ๆ

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

สิ่งที่พวกเราได้รับจาก Project นี้คือ การได้เข้าใจในแง่มุมต่าง ๆ ของ ASR ทั้ง techniques และความรู้ต่าง ๆ นอกจากนั้นยังทำให้เข้าใจใน deep learning มากยิ่งขึ้น และสามารถนำความรู้ต่าง ๆ มาประกอบกันให้เกิดความรู้ใหม่ ๆ ได้

สุดท้ายนี้ พวกเรา Chalat Limpongsawatt และ Chawit Sakulyuenyong หวังว่าประสบการณ์ต่าง ๆ ที่พวกเรารับจาก Project นี้จะสามารถเป็นแรงบันดาลใจให้ผู้อ่านมีความสนใจทางด้าน Automatic Speech Recognition (ASR) เพิ่มขึ้นไม่มากก็น้อย