30 สิงหาคม 2569 · อ่าน 1 นาที
ทุกอย่างที่โมเดลเสียงภาษาไทยต้องตัดสินก่อนเปล่งเสียงแรก
ข้อความภาษาไทยไม่มีช่องว่างระหว่างคำ และตัวอักษรไม่ได้บอกเสียงตรงตัว นี่คือสี่เรื่องที่ระบบ Text to Speech ต้องตัดสินให้ได้ก่อนจะมีเสียงออกมา
โมเดลเสียงภาษาอังกฤษอาศัยผิวหน้าของข้อความได้ไกลพอสมควร คำมาพร้อมช่องว่างคั่น ตัวอักษรจับคู่กับเสียงโดยมีข้อยกเว้นจำนวนหนึ่งที่จัดการไหว และการเน้นเสียงเป็นสมบัติของตัวคำเอง ประโยคภาษาไทยไม่ได้ให้สิ่งเหล่านี้เลย
ผมกินข้าวที่ร้านอาหารไทย เป็นสายอักขระเดียวที่ไม่มีช่องว่างอยู่ข้างในเลย ก่อนจะมีตัวอย่างเสียงแรกออกมา ระบบต้องตัดสินสี่เรื่องให้ได้ก่อน คือวรรคตอนอยู่ตรงไหน อักษรชุดใดรวมกันเป็นพยางค์เดียว พยางค์นั้นเป็นวรรณยุกต์ใด และตัวเลขหรือคำย่อตรงนั้นอ่านว่าอย่างไร
ผมกินข้าวที่ร้านอาหารไทย 1 วรรคตอนอยู่ตรงไหน 2 อักษรชุดไหนรวมเป็นพยางค์เดียว 3 พยางค์นั้นเป็นวรรณยุกต์ใด 4 ตัวเลขและคำย่ออ่านว่าอย่างไร ไม่มีข้อไหนเขียนอยู่ในสายอักขระ
วรรคตอนอยู่ตรงไหน#
ภาษาไทยเขียนคำติดกันและใช้ช่องว่างทำหน้าที่อย่างอื่น ช่องว่างในภาษาไทยคือการเว้นวรรคเพื่อแบ่งวลีหรืออนุประโยค ซึ่งเป็นงานที่เครื่องหมายจุลภาคทำในภาษาอังกฤษ และปรากฏน้อยกว่าที่ผู้อ่านภาษาอังกฤษคาดไว้มาก ระบบที่หยุดหายใจตามช่องว่างจะอ่านทั้งย่อหน้าจบในสองลมหายใจ
การตัดคำด้วยช่องว่างจึงได้ออกมาเป็นอนุประโยค ได้อย่างแม่นยำและไม่ได้บอกอะไรเกี่ยวกับตัวคำเลย ทั้งที่คำคือหน่วยที่บอกว่าพยางค์หนึ่งจบตรงไหนและพยางค์ถัดไปเริ่มตรงไหน ความขาดหายเดียวกันนี้ไปถึงฝั่งการแปลของ API ด้วย ซึ่งบทความก่อนหน้าไล่ไว้ทีละข้อ
จังหวะการอ่านจึงต้องมาจากตัวประโยคเอง คนฟังรู้ทันทีเมื่อระบบหยุดผิดที่ เพราะการหยุดกลางวลีภาษาไทยฟังเหมือนเสียงสะดุด
อักษรชุดไหนรวมเป็นพยางค์เดียว#
ตัวอักษรไทยไม่ได้จับคู่กับเสียงแบบตรงไปตรงมา กด อ่านว่า กด โดยมีสระที่ไม่ถูกเขียนไว้ที่ใดเลย ปลา กับ ปลัด ขึ้นต้นด้วยอักษรคู่เดียวกัน คำหนึ่งเป็นอักษรควบ อีกคำหนึ่งแยกเป็นสองพยางค์ รัฐศาสตร์ งอกพยางค์เชื่อมขึ้นมาโดยไม่มีอักษรตัวใดบอกไว้ และ จันทร์ ตัดอักษรท้ายทิ้งสองตัวด้วยเครื่องหมายการันต์
ทุกข้อคือโจทย์ที่ต้องมองไปข้างหน้าก่อน -รร อ่านว่า อัน เมื่ออยู่ท้ายคำ และอ่านว่า อัม เมื่อมีตัวสะกดตามมา สรร กับ กรรม จึงแยกทางกันที่อักษรซึ่งอยู่ถัดไป ส่วน จักรยาน กับ จักรี ใช้อักษรสี่ตัวแรกร่วมกันแต่ตัดพยางค์คนละแบบ ตัวคำเป็นผู้ตัดสิน และกว่าจะรู้ว่าเป็นคำใดก็ต้องหาคำนั้นเจอในสายอักขระที่ไม่ได้บอกขอบเขตไว้ก่อน
กรณีเหล่านี้ครบชุด พร้อมคำอ่านที่คนไทยอ่านจริง อยู่ที่หน้าแปลงข้อความเป็นเสียง
พยางค์นั้นเป็นวรรณยุกต์ใด#
ภาษาไทยมีวรรณยุกต์ และเสียงวรรณยุกต์ของพยางค์ไม่ได้เขียนไว้ตรงตัว เสียงที่ได้มาจากหมู่ของพยัญชนะต้นตามอักษรสามหมู่ ความสั้นยาวของสระ คำเป็นหรือคำตาย และรูปวรรณยุกต์ถ้ามี สี่อย่างนี้ผันรวมกันออกมาเป็นเสียงหนึ่งในห้าเสียง
รูปวรรณยุกต์ลำพังตัดสินอะไรไม่ได้เลย รูปเดียวกันวางบนอักษรกลางกับวางบนอักษรต่ำให้เสียงคนละเสียง ตารางที่ลอกรูปวรรณยุกต์ข้ามไปตรง ๆ จึงลงเอยที่เสียงผิด นี่คือทางที่คำอ่านภาษาไทยพลาดบ่อยที่สุด และเป็นทางที่มองจากตัวสะกดไม่เห็น
ผิดไปหนึ่งในสี่อย่าง โมเดลก็ออกเสียงเป็นคำไทยอีกคำที่มีอยู่จริง การอ่านผิดในการสังเคราะห์เสียงภาษาไทยจึงมักไปตกที่คำที่มีความหมายอยู่แล้ว
ตัวเลขและคำย่ออ่านว่าอย่างไร#
ตัวเลขชุดหนึ่งไม่ได้มีคำอ่านเดียว จำนวนที่ลงท้ายด้วยหนึ่งใช้ เอ็ด รหัสไปรษณีย์อ่านเรียงตัว และ ๑๖.๓๐ น. อ่านเป็นเวลานาฬิกา กรุงเทพฯ คืนพยางค์ที่เครื่องหมายย่อซ่อนไว้กลับมาหกพยางค์ ส่วน ก.พ. มีคำอ่านที่ยอมรับกันสองแบบ คืออ่านเต็มคำ และอ่านเรียงชื่ออักษร
เครื่องหมายซ้ำคำก็ทำงานแบบเดียวกัน ๆ ซ้ำหนึ่งคำใน เด็กเล็ก ๆ ซ้ำสองพยางค์ใน ในวันหนึ่ง ๆ และซ้ำทั้งวลีใน แต่ละวัน ๆ ตัวอักษรเหมือนกันทั้งสามที่ ส่วนช่วงที่มันครอบคลุมมาจากความหมาย
คำอ่านทุกแบบเลือกจากบริบททั้งนั้น โมเดลจึงต้องอ่านคำและประโยคให้จบก่อน แล้วจึงเปล่งเสียงออกมา
คำถัดไปเป็นภาษาอะไร#
ข้อความการตลาด สคริปต์บริการลูกค้า และแชตภาษาไทย มีภาษาอังกฤษแทรกอยู่ตลอด ทั้งรหัสพัสดุ ชื่อสินค้า และประโยคอังกฤษเต็มประโยค โผล่ขึ้นระหว่างคำไทยโดยไม่มีเครื่องหมายบอกไว้เลย ระบบที่ส่งภาษาอังกฤษต่อให้ผู้พูดคนที่สองจะเปลี่ยนเสียงกลางประโยค ซึ่งคนฟังได้ยินเป็นคนสองคนอ่านบรรทัดเดียว
Flash ใช้ผู้พูดคนเดียวข้ามทั้งสองภาษาได้ภายในคำขอเดียว
ตัดสินพลาดแต่ละข้อแล้วได้ยินอะไร#
ทั้งสี่ข้อเป็นความผิดพลาดคนละแบบและให้เสียงคนละอย่าง มีเพียงข้อเดียวที่ตรงกับภาพการอ่านผิดที่คนทั่วไปนึกถึง
| สิ่งที่ต้องตัดสิน | ระบบที่อ่านทีละตัวอักษร | คนฟังได้ยิน |
|---|---|---|
| วรรคตอน | หยุดตามช่องว่างและเครื่องหมาย | ย่อหน้าหนึ่งจบในสองลมหายใจ |
| การตัดพยางค์ | อ่าน ปลัด แบบเดียวกับ ปลา | คำที่ไม่มีอยู่ในภาษา |
| วรรณยุกต์ | เอาเสียงจากรูปวรรณยุกต์ | คำไทยอีกคำที่มีอยู่จริง |
| คำอ่านตัวเลข | ให้ตัวเลขทุกชุดมีคำอ่านเดียว | รหัสไปรษณีย์ถูกอ่านเป็นจำนวน |
เรื่องนี้ส่งผลอย่างไรตอนเรียก API#
การตัดสินทั้งสี่เรื่องเกิดขึ้นในโมเดล คำขอจึงยังเป็นแค่ข้อความกับรหัสเสียง ไม่มีสิ่งที่ต้องกำกับเพิ่ม ไม่มีมาร์กอัปหน่วยเสียงให้ส่ง และไม่มีพจนานุกรมคำอ่านให้ดูแลฝั่งผู้เรียก
ต่อให้มีพจนานุกรมคำอ่านก็ปิดช่องว่างได้เพียงบางส่วน พจนานุกรมเก็บคำอ่านของ รัฐศาสตร์ ได้ แต่เก็บเสียงวรรณยุกต์ของพยางค์ที่ยังไม่เคยเห็นหมู่อักษรและตัวสะกดของมันไม่ได้ และเก็บตำแหน่งที่อนุประโยคจะขาดในประโยคที่เพิ่งเขียนเมื่อเช้านี้ก็ไม่ได้ ทั้งสองอย่างเป็นสมบัติของตัวประโยค
เอนด์พอยต์คือ POST /v1/tts รับข้อความได้ถึง 5,000 ตัวอักษรต่อคำขอ สตรีมเสียงออกมาระหว่างที่ยังสังเคราะห์ไม่จบ และคืน timestamps ระดับคำ ประโยค หรือช่วงพูดเมื่อร้องขอ ส่วนเครื่องมืออ่านออกเสียงฟรี อ่านข้อความสั้นได้โดยไม่ต้องสมัคร และคู่มือแปลงข้อความเป็นเสียง อธิบายรูปแบบคำขอไว้ครบ