Speech Dysarthria Detection by Text classification and Audio classification(MFCC+CNN)

Panjapongpoolbanchean
3 min readNov 9, 2023

--

สวัสดีครับ ผมเป็นแค่เด็กม.6ที่กำลังศึกษา data sci และได้เริ่มศึกษา neuroscience จากค่าย Brain code camp​ บางเรื่องผมอาจจะมีความรู้ไม่ถึงที่จะเข้าใจมันอย่างลึกซึ้ง แต่ก็จะพยายามทำความเข้าใจมันอย่างเต็มที่ และอธิบายให้เข้าใจง่ายที่สุดเท่าที่ทำได้ครับ หากผิดพลาดประการใด กราบขออภัยมา ณ ที่นี้ครับ

ปล.projectนี้จะไม่สำเร็จเลย ถ้าไม่ได้mentorช่วยติดตามความคืบหน้าทุกสัปดาห์ และให้feed back ความคิดเห็น ขอบคุณอาจารย์ และพี่ๆในBrain code camp ที่ช่วยตอบคำถาม ช่วยแก้ปัญหา เวลาผมไปต่อไม่ได้ สุดท้ายนี้ขอบคุณตัวผม ที่ได้ไปค่ายอีกค่ายเกี่ยวกับdata sciพอดี แล้วก็ใช้โอกาสนี้ ถามความคิดเห็นกับพี่ๆและอาจารย์ที่มาสอนในค่ายนี้อีกที จะเห็นว่า ผมก็คือคนธรรมดาคนหนึ่ง ไม่ได้เก่งกว่าใครๆ เป็นแค่เด็กคนหนึ่งที่กำลังคลั่งรักวงการdata sciและจะสำรวจมันไปเรื่อยๆ เพราะผมชอบการสำรวจครับ มันทำให้เราได้ไปเจอสิ่งใหม่ๆ และได้เลือก ว่าเราจะไปทางไหนดี

Speech Dysarthria

ภาพลักษณะอาการที่อาจพบได้ในผู้ป่วยที่เป็น Speech dysarthria

ผู้ที่มีอาการกล้ามเนื้อในการพูดผิดปกติจะมีอาการแตกต่างกันไป ดังนี้
- พูดไม่ชัด พูดช้า หรือพูดเร็วจนฟังไม่เข้าใจ
- มีปัญหาด้านการควบคุมระดับเสียง เช่น ระดับเสียงในการพูดสูงหรือต่ำไม่สม่ำเสมอ พูดแบบไม่มีเสียงสูงต่ำ พูดเสียงดังหรือเบาเกินไป
- เสียงแหบ เสียงขึ้นจมูก เค้นเสียง
- มีจังหวะการพูดที่ไม่สม่ำเสมอหรือผิดปกติ
- ไม่สามารถขยับลิ้น ริมฝีปาก หรือกล้ามเนื้อบนใบหน้าได้อย่างปกติ
ซึ่งการวินิฉัยจำเป็นต้องใช้ทักษะและประสบการณ์ในการฟังของประสาทแพทย์ ร่วมกับการตรวจวัดผลด้านอื่นๆ ซึ่งใช้ระยะเวลา และสิ้นเปลืองทรัพยากรทางการแพทย์ จะดีกว่าไหม ถ้าเราช่วยลดภาระให้เหล่าแพทย์ได้ เพื่อให้แพทย์ได้มีเวลาโฟกัสกับการรักษาผู้ป่วยมากขึ้น ผมจึงอยากนำงานนี้มาต่อยอดโดยใช้ Machine learning​ ที่สามารถแยกเสียงได้ดีกว่ามนุษย์ นำมันมาปรับใช้ในการจำแนกเสียงว่าผู้ป่วยคนนี้เป็นโรค Speech dysarthria หรือไม่

ข้อมูลทั่วไปของdatasetที่ได้มาจาก Brain code camp เป็นไปดังภาพนี้ครับ

SP = ผู้ป่วยโรค Speech dysarthria , CT = คนทั่วไป

work​ flow ภาพรวมของงาน

มาดูที่ work flow ที่ผมจะนำเสนอกันครับ
จะแบ่งเป็น2ทางหลักๆ
ทางที่1 เราจะมาลองทำ text classification กัน
โดยเราจะนำไฟล์เสียง(wav.)​มาผ่านตัว pre-trained model(whisper) เพื่อแปลงไฟล์เสียง(wav.)​เป็น text แล้วนำมาสร้างเป็น dataset นามสกุล .csv
1.1นำไปผ่านกระบวนการ TF-IDF เพื่อแปลง text เป็น vector ค่านึง แล้วนำไปทำ text classification​ ด้วย model ต่างๆ เพื่อทำนายว่าเป็นโรค Speech dysarthria​ หรือไม่
1.2ผมได้ตรวจคำพูดของ dataset ทั้งหมดแล้วเห็นความสัมพันธ์และได้ clean ข้อมูลบางอย่างออก เพื่อนำไปทำ text classification ​อีกครั้ง
ทางที่2 เราจะทำ audio classification กันโดยเราจะนำไฟล์เสียง(wav.)​มาผ่านกระบวนการ MFCC แล้วได้ค่าตัวเลขมาจำนวนนึง
2.1นำไปเข้าmodel deep learning CNN เพื่อทำนายว่าเป็นโรค speech dysarthria​หรือไม่

เมื่อเข้าใจแผนคร่าวๆแล้ว เราก็มาเริ่มทำกัน!!!

ซึ่งตัวlibraryที่ผมใช้คือ Librosa

Librosa

เป็น library ของ python ที่สามารถดึงข้อมูลเสียง วิเคราะห์เสียง แปลงไฟล์เสียงเป็นค่าต่างๆได้
ศึกษาเพิ่มเติม

whisper

เป็นPre-trained model(machine learningที่ผ่านการtrainจากdatasetมาเยอะแล้ว เราสามารถเรียกใช้ได้เลย หรือจะนำมาtrainด้วยdatasetของเราเพิ่ม เพื่อใช้สำหรับข้อมูลเฉพาะทางได้)​
ซึ่งผมเลือกใช้model whisperที่มีคนไทย นำมาtrain ด้วยdatasetภาษาไทยเพิ่ม มาใช้ครับ นำข้อมูลtextที่แปลงได้มาสร้างเป็นdataset
โดยผมจะกำหนดrowเป็น
sentence(ประโยคเฉลย)​
type(ประโยคเฉลยที่เท่าไร)​
audio(ประโยคที่พูดแล้วแปลงมาเป็นtextด้วยwhisper)​

ศึกษาเพิ่มเติม

model ที่ใช้(Whisper)

Colab =>แปลงไฟล์wav.เป็นtext+สร้างdataset(csv.และexcel)

Text classification​

ผมเลือกแปลงtextเป็นvector ด้วยวิธีTF-IDFเพื่อให้Machine learningสามารถนำมาคำนวณได้
ผมเลือกใช้supervised learning model4ตัว ได้ผลลัพธ์ดังนี้ (acc=accuracy)
Gaussian Naive Bayes acc=55%
Logistic Regression acc=55%
Support Vector Machines acc=58%
Decision Tree acc=65%

Colab =>Text classification

เป็นผลลัพธ์ที่ไม่ค่อยน่าพอใจสักเท่าไร เพราะความแม่น(accuracy)​แค่นี้ ไม่ต่างกับทายผลด้วยการโยนเหรียญหัวก้อยเลยครับ(ความแม่น50%เท่ากัน)​

ผมชอบคำพูดนึง ที่ว่า “Data Scientist Significantly Better Than Random”
แปลตามที่ผมเข้าใจคือ นักวิทยาศาสตร์​ข้อมูลต้องทำยังไงก็ได้ให้solutionของเขา(ทั้งการวิเคราะห์ข้อมูล การทำdata visualization​ แม้กระทั่งmachine learning)​ นั้นดีกว่าการสุ่มคำตอบ(random)​ เพราะถ้าการสุ่มคำตอบดีกว่า เราก็คงไม่ต้องทำกันแล้ว เดาสุ่มสบายกว่าเยอะ
ดังนั้น data scientist​ทั้งหลาย เลยพยายามต่อสู้กับการrandomอยู่เสมอๆ

โอเค……ชีวิตก็ต้องสู้ต่อไป
จากนั้นผมก็ได้ลองมาเช็คdatasetว่า คนที่เป็นspeech dysarthria​กับคนทั่วไป จะพูดผิดกี่คำกันบ้าง หลังจากไล่เช็คทุกประโยค ได้ผลสรุปดังนี้

Colab =>EDA

EDA

ผมละเว้นคำที่ออกเสียงเหมือนกัน แต่สะกดต่างกัน ไม่ถือว่าเป็นคำผิด(สีเหลือง) เช่น คำว่า ทำ:ธรรม
ส่วนใหญ่ประโยค5–8จะผิดเกือบหมด ทั้งSPและCT

ผมได้เห็นความผิดปกติบางอย่าง คือ ประโยค5–8ที่เป็นการออกเสียง”อา” ในรูปแบบต่างๆ whisperแปลงเป็นtextที่ผิดกับเฉลยแทบทุกครั้งทั้งคนที่เป็นspeech dysarthria​และคนทั่วไป
ผมคิดว่าผู้ตรวจคงจะดูทักษะการควบคุมเสียง ดูความแหบของเสียง จากประโยค5–8 ซึ่งถ้าเราแปลงเป็นtextเราจะวัดความแตกต่างไม่ได้เลย
ผมจึงตัดสินใจตัดข้อมูลประโยค5–8ออก แล้วลองเอากลับมาทำtext classification​อีกครั้ง พบว่าได้accuracyที่ดีขึ้น ดังภาพ
Gaussian Naive Bayes acc=63%
Logistic Regression acc=71%
Support Vector Machines acc=73%
Decision Tree acc=69%

Colab =>Text classification ver.ตัดประโยค5–8ออก

Audio classification

เรามาลองทำอีกวิธีคือ audio classification​ กันบ้าง ว่าจะได้ผลอย่างไร
โดยเราจะนำไฟล์เสียง(wav.)​มาแปลงเป็นค่าที่modelสามารถคำนวณได้ ด้วยวิธีMFCC(Mel frequency cepstrum coefficient)

MFCC(Mel frequency cepstrum coefficient)

การสกัดคุณลักษณะสำคัญจากค่าสัมประสิทธ์เซปสตรัมบนสเกลเมล (Mel Frequency Cepstral Coefficient หรือ MFCC) การสกัดคุณลักษณะสำคัญที่จะนำมาใช้เป็นตัวแทนของเสียงนั้นๆ ด้วยการปรับสเกลของเปคตรัมให้อยู่บนสเกลที่เหมาะสมสำหรับการได้ยินของมนุษย์ (0–1,000 Hz) โดยการดึงเอาสัญญาณเสียงในช่วงความถี่ต่ำให้มีความสำคัญกว่าช่วงความถี่สูง เกิดการพัฒนาสเกลของสเปคตรัมที่สามารถเก็บรายละเอียดของสัญญาณเสียงในช่วงความถี่ต่ำได้มากกว่าที่เรียกว่า สเกลเมล (Mel Scale)

งง ใช่ไหมครับ ผมก็งง แต่เท่าที่ผมไปศึกษามา และลองทำความเข้าใจ จะสรุปคร่าวๆ แบบเข้าใจง่ายได้ว่า

เสียงพูด(speech) เกิดจากGlottal pulses + Vocal tract

ภาพการเกิดเสียงพูด

ซึ่งตัวที่เราต้องการในการระบุการออกเสียง ว่ามาจากตำแหน่งไหนของปาก ซึ่งสัมพันธ์กับการควบคุมการออกเสียง นั่นก็คือ Vocal tract

แปลว่าสิ่งที่MFCCทำคือ การกรองเอาสิ่งรบกวนที่เราไม่สนใจจะพิจารณาออกจากตัวเสียง(กรองเจ้าGlottal plusesออก) เหลือแต่จุดที่เราต้องการจะพิจารณา นั่นก็คือ Vocal tract นั่นเอง

สรุปง่ายๆแบบง่ายขึ้นอีก คือ MFCC จะทำให้เราได้รู้ตำแหน่งการออกเสียงจากเสียงพูดนั้นเอง

ศึกษาเพิ่มเติม

https://youtu.be/4_SH2nfbQZ8?si=fyE_sBtvJtPsb9Nt

จากนั้นผมจะใช้model deep learning ที่ชื่อว่าCNN ได้ผลลัพธ์ดังนี้

acc = 91%

accที่ทำได้ คือ 91%!!! ซึ่งสูงมากๆ ชนะขาดลอย ตัวmodelทายผิดไปแค่5ตัวอย่าง

เสียงของของผู้ที่เป็น Speech dysarthria แต่modelทายผิดว่าเป็นคนทั่วไป 4 ตัวอย่าง

เสียงของของคนทั่วไป แต่modelทายผิดว่าเป็นSpeech dysarthria 1 ตัวอย่าง

Colab =>Audio classification

ทำไมMFCCถึงทำนาย Speech dysarthria​ ได้แม่นยำ

ด้วยความที่MFCCทำให้เราได้รู้ตำแหน่งการออกเสียงจากเสียงพูด ซึ่งคนที่เป็นโรคSpeech dysarthria มักมีปัญหาด้านการควบคุมกล้ามเนื้อบริเวณปากเวลาพูดอยู่แล้ว ทำให้การควบคุมตำแหน่งการออกเสียง จะแตกต่างจากคนทั่วไป อีกทั้งCNNมีข้อเด่นตรงนี้สามารถตรวจจับลักษณะเด่นของข้อมูลในการนำมาclassificationได้ ทำให้สามารถแยกลักษณะเด่น(ตำแหน่งการออกเสียง)ที่ต่างจากคนทั่วไปได้ง่ายขึ้นไปอีก ทำให้modelมีความแม่นสูง เพราะเราวิเคราะห์ตรงจุดที่เป็นอาการตั้งต้นของโรคนั่นเอง

ที่ผมเลือกทำprojectนี้ เพราะผมยังไม่เคยลองทำMLด้านเสียงมาก่อน แล้วผมไม่มีเวลามากพอที่จะศึกษาneurosci เชิงลึก เพราะอยู่ในช่วงเข้ามหาวิทยาลัย เลยเลือกprojectที่เป็นเชิงฝั่งMLมากกว่าแพทย์ แต่ปรากฎว่า ผมก็ได้เจออุปสรรคมากมาย และก็พยายามฝ่าฟันมันมาได้ ขอบคุณทุกคนที่มีส่วนช่วยให้ผมมาถึงจุดนี้ครับ

สุดท้ายนี้ ขอบคุณมากครับที่อ่านจบ อาจจะยาวสักหน่อย ไว้พบกันไหมโอกาสหน้าครับผม

--

--