การรู้จำเสียงแบบสตรีมมิงกับการเกลาข้อความท้ายประโยค: สมดุลระหว่างความหน่วงและความแม่นยำ
คำบรรยายสดมีโจทย์สองข้อที่ดึงกันอยู่ ข้อความต้องขึ้นทันทีที่พูด และเมื่อพูดจบประโยคแล้วก็ควรแม่นยำที่สุด โมเดลสตรีมมิงเก่งเรื่องแรก โมเดลออฟไลน์เก่งเรื่องหลัง เราจึงใช้ทั้งสองอย่างควบคู่กัน คือใช้การรู้จำเสียงแบบสตรีมมิงแสดงข้อความระหว่างที่พูด พอจบประโยคก็ส่งเสียงของประโยคนั้นให้โมเดลออฟไลน์เกลาข้อความใหม่ แล้วนำข้อความที่เกลาแล้วมาแทนที่ข้อความเดิม บทความนี้อธิบายว่าผลลัพธ์สองชุดผสานกันอย่างไร หน้าจอเปลี่ยนผ่านอย่างไร รวมถึงกรณีที่อาจเกิดปัญหาและกลไกสำรองเมื่อเกิดข้อผิดพลาด (Fallback)
1. ทำไมความหน่วงกับความแม่นยำจึงดึงกัน
โมเดลสตรีมมิงต้องให้ข้อความก่อนที่ประโยคจะจบ จึงอาศัยได้เฉพาะสิ่งที่ได้ยินมาแล้ว บวกกับบริบทข้างหน้าที่สั้นมาก แต่คำจำนวนมากต้องรอคำที่ตามมาถึงจะชัด: คำพ้องเสียงต้องดูคำถัดไป ตัวเลขต้องดูหน่วย และภาษาไทยไม่เว้นวรรคระหว่างคำ แม้แต่การตัดว่าคำจบตรงไหนก็ต้องดูสิ่งที่ตามมา โมเดลออฟไลน์อ่านทั้งประโยคในคราวเดียว ความกำกวมเหล่านี้ส่วนใหญ่จึงหายไปเมื่อมีบริบทมากขึ้น
ดังนั้น “เร็วกว่า” กับ “แม่นกว่า” จึงเป็นทางเลือกเดียวกัน คือจะรอนานแค่ไหนก่อนตัดสินใจ รอน้อย ข้อความขึ้นเร็วแต่มีหลักฐานให้ตัดสินน้อย รอนาน หลักฐานมากขึ้นแต่ผู้ใช้ก็ต้องจ้องหน้าจอว่างนานขึ้นด้วย การรู้จำเสียงแบบสตรีมมิงเลือกที่จะไม่รอ คือให้ผลชั่วคราวออกมาก่อน แล้วยอมให้แก้ได้ภายหลัง
ความหน่วงต้องแยกดูเป็นสองส่วนด้วย ส่วนแรกคือความหน่วงของตัวอักษรแรก นับจากเริ่มพูดจนถึงตัวอักษรแรกปรากฏบนหน้าจอ ส่วนที่สองคือความหน่วงกว่าจะนิ่ง นับจากจบประโยคจนถึงเวลาที่ประโยคนั้นกลายเป็นข้อความที่จะไม่เปลี่ยนอีก การเกลาข้อความกระทบเฉพาะส่วนที่สอง และไม่ทำให้ตัวอักษรแรกช้าลง
2. ข้อความสามสถานะ: partial, final และข้อความที่เกลาแล้ว
- partial: ทุกอย่างที่ได้ยินมาแล้วในประโยคปัจจุบัน partial ใหม่แต่ละอันจะแทนที่อันก่อนหน้าทั้งก้อน ไม่ได้ต่อท้าย และอาจว่างเปล่าก็ได้ ตัวอักษรที่แสดงอยู่แล้วเปลี่ยนได้
- final: เมื่อผู้พูดหยุดประมาณสองวินาที เซิร์ฟเวอร์จะถือว่าประโยคนั้นจบ การเชื่อมต่อยังเปิดอยู่เพื่อรอประโยคถัดไป
- ข้อความที่เกลาแล้ว: เบราว์เซอร์เก็บเสียงที่เพิ่งส่งไปไว้ในเครื่อง เมื่อ final มาถึง จะตัดเสียงเฉพาะประโยคนั้นออกมา แปลงเป็นไฟล์ WAV แล้วส่งให้โมเดลออฟไลน์ (ตัวเดียวกับที่ใช้ถอดเสียงไฟล์) ประมวลผลซ้ำเพื่อคืนข้อความพร้อมเครื่องหมายวรรคตอนกลับมา
การตัด “ประโยคนั้น” ออกมาเป็นรายละเอียดของการทำงาน เราไม่ขอเสียงจากเซิร์ฟเวอร์ แต่หาในเครื่องว่าช่วงเงียบตั้งแต่ 1.5 วินาทีขึ้นไปครั้งแรกอยู่ตรงไหน แล้วตัดจากเฟรมแรกที่มีเสียงไปจนถึงจุดนั้น เผื่อไว้เล็กน้อยทั้งสองข้าง เสียงที่เหลือเก็บไว้ให้ประโยคถัดไป
- partial: ผมจะส่งรายงานให้
- final: ผมจะส่งรายงานให้ภายในวันสุก
- เกลาแล้ว: ผมจะส่งรายงานให้ภายในวันศุกร์
ในตัวอย่างนี้ “ศุกร์” กับ “สุก” ออกเสียงเหมือนกัน ตอนที่โมเดลสตรีมมิงยังไม่มีบริบทต่อจากคำนั้น จะเขียนออกมาแบบไหนก็เป็นไปได้ พอได้ทั้งประโยคแล้ว โมเดลออฟไลน์จะเลือกได้ถูกง่ายขึ้น
3. กฎการผสานผลลัพธ์
- partial แทนที่ทั้งบรรทัดปัจจุบัน ไม่นำมาต่อกัน
- final แต่ละอันกลายเป็นประโยคที่มีหมายเลขกำกับ และต่อท้ายประโยคที่มีอยู่
- การเกลาข้อความจะแทนที่ตามหมายเลขประโยค ไม่ใช่ตามตำแหน่ง ตอนที่ผลลัพธ์กลับมา ประโยคถัดไปอาจขึ้นบนหน้าจอแล้ว และอาจมีคำขอเกลาข้อความค้างอยู่หลายอันพร้อมกัน ผลลัพธ์แต่ละอันจึงแก้เฉพาะประโยคของตัวเอง ใครกลับมาก่อนก็ไม่เป็นไร
- ถ้าขั้นตอนเกลาข้อความไม่มีผลลัพธ์ ให้คงข้อความจากสตรีมมิงไว้ ถ้าเสียงสั้นกว่า 0.25 วินาทีจะไม่ส่งคำขอ ถ้าผลที่ได้ว่างเปล่า คำขอล้มเหลว โควตาหมด หรือผ่านไป 12 วินาทีแล้วยังไม่ตอบกลับ ก็คงข้อความจากสตรีมมิงไว้เช่นกัน การเกลาข้อความเป็นส่วนเสริมที่ทำให้แม่นยำขึ้น ไม่ใช่สิ่งที่ระบบต้องพึ่งพาเสมอ
- สำหรับโปรแกรมอ่านหน้าจอ ประโยคที่นิ่งแล้วจะถูกอ่านหนึ่งครั้งในพื้นที่ประกาศแยกต่างหากเมื่อมาถึง การแทนที่ด้วยข้อความที่เกลาแล้วในภายหลังจะไม่ถูกอ่านซ้ำ ผู้ใช้จึงไม่ต้องฟังประโยคเดิมสองรอบ
4. การเปลี่ยนผ่านบนหน้าจอ: จากสีน้ำเงินเป็นสีหลัก
สามสถานะ สามลักษณะ:
- ประโยคที่กำลังพูดเป็นสีน้ำเงิน และมีเคอร์เซอร์กะพริบต่อท้าย
- ประโยคที่เป็น final แล้วแต่ข้อความที่เกลาแล้วยังไม่กลับมา ยังเป็นสีน้ำเงิน
- เมื่อข้อความที่เกลาแล้วกลับมา หรือเมื่อยกเลิกการรอ ข้อความจะถูกแทนที่ และสีจะไล่เป็นสีหลักภายในประมาณ 0.8 วินาที
สีบอกว่าข้อความ “แน่นอนแค่ไหน” ไม่ได้บอกว่าเป็นประโยคชนิดไหน เมื่อผู้อ่านเห็นสีน้ำเงินก็รู้ว่าอาจเปลี่ยน เห็นสีหลักก็รู้ว่าจะไม่เปลี่ยนอีก ถ้าข้อความถูกสลับไปเงียบ ๆ โดยไม่มีสัญญาณใด ๆ ผู้อ่านจะคิดว่าตัวเองอ่านผิด
ที่ขยับมีแค่สี ไม่ใช่เลย์เอาต์ พื้นที่คำบรรยายแสดงเพียงไม่กี่บรรทัดล่าสุด ประโยคเก่าจึงเลื่อนพ้นสายตาไปเอง ส่วนที่ถูกแก้จึงเป็นประโยคใหม่ล่าสุดหนึ่งหรือสองประโยคเสมอ ซึ่งเป็นจุดที่ผู้อ่านกำลังมองอยู่แล้ว เมื่อระบบตั้งค่าให้ลดการเคลื่อนไหว เคอร์เซอร์จะหยุดกะพริบ
5. จุดที่อาจผิดพลาด
- ฝั่งเบราว์เซอร์กับเซิร์ฟเวอร์ตัดขอบเขตประโยคไม่ตรงกัน เซิร์ฟเวอร์ตัดสินว่าประโยคจบจากการตรวจจับความเงียบของตัวเอง ส่วนฝั่งเบราว์เซอร์ตัดเสียงที่ความเงียบ 1.5 วินาที ถ้ากลางประโยคมีช่วงหยุดที่ยาวกว่าปกติ หรือเซิร์ฟเวอร์ตัดกลางคำพูดที่ต่อเนื่อง เสียงที่ส่งไปเกลาข้อความอาจเกินหรือขาดไปเล็กน้อย วิธีที่รัดกุมกว่าคือจัดแนวด้วยเวลาเริ่มของประโยคที่เซิร์ฟเวอร์ส่งกลับมา แต่ต้องยืนยันก่อนว่านาฬิกาของสองฝั่งยังตรงกันหลังเชื่อมต่อใหม่ ตอนนี้เราจึงตัดตามช่วงหยุด
- พูดต่อเนื่องยาวมาก ในเครื่องเก็บเสียงไว้เพียง 30 วินาทีล่าสุด ประโยคที่ยาวกว่านั้นจะไม่ส่งช่วงต้นไปเกลาข้อความ ข้อความที่เกลาแล้วจึงอาจขาดต้นประโยค
- เสียงเบามาก เฟรมที่ต่ำกว่าเกณฑ์เสียงรบกวนไม่ถูกนับว่ามีเสียง ทั้งประโยคอาจถูกมองเป็นความเงียบ จึงไม่มีเสียงให้ส่งไปเกลา และคงข้อความจากสตรีมมิงไว้
- การเชื่อมต่อขาด เมื่อเซิร์ฟเวอร์ปิดการเชื่อมต่อตามปกติ หน้าเว็บจะเชื่อมต่อใหม่ให้เอง ติดต่อกันได้สูงสุดสามครั้ง แต่ถ้าการเชื่อมต่อหลุดอย่างผิดปกติ หน้าเว็บจะไม่เชื่อมต่อใหม่ และแจ้งว่าเครือข่ายมีปัญหาทันที
- ข้อจำกัดเวลาของการทดลองใช้ เมื่อถึงเวลาที่กำหนด เซิร์ฟเวอร์จะแจ้งด้วยรหัสปิดการเชื่อมต่อโดยเฉพาะ และหน้าเว็บจะแสดงคำอธิบายที่เจาะจง ไม่ใช่แค่ “เกิดข้อผิดพลาด”
6. วัดอย่างไร
ความหน่วงของตัวอักษรแรกนับดังนี้:
ความหน่วงตัวอักษรแรก
= เวลาที่ partial ที่ไม่ว่างอันแรกมาถึง
− เวลาเริ่มของเฟรมแรกที่มีเสียง
การจับเวลาทำในเบราว์เซอร์ จึงรวมสามส่วน คือบัฟเฟอร์ตอนบันทึกเสียง เครือข่าย และการประมวลผลของเซิร์ฟเวอร์ การบันทึกใช้เฟรมละ 2048 แซมเพิล (Sample) ความยาวของแต่ละเฟรมจึงขึ้นกับ Sample Rate ของเบราว์เซอร์ คือ 128 มิลลิวินาทีที่ 16 kHz และประมาณ 43 มิลลิวินาทีที่ 48 kHz เวลาเกลาข้อความก็เป็นเวลาไป-กลับฝั่งเบราว์เซอร์ คือเข้ารหัส WAV อัปโหลด รู้จำเสียง และส่งผลกลับมา เวลาประมวลผลที่เซิร์ฟเวอร์รายงานเองจะสั้นกว่า
ถ้าจะวัดว่าการเกลาข้อความช่วยลดความผิดพลาดได้เท่าไร ต้องให้คะแนนผลลัพธ์สองชุดแยกกัน คือ final ตามที่นิ่งตอนแรก กับข้อความหลังเกลาแล้ว แต่ละแบบคำนวณ CER บนชุดทดสอบเดียวกัน ส่วนต่างระหว่างสองค่าคือความแม่นยำที่เพิ่มขึ้นจากการเกลาข้อความ ถ้าดูเพียงความแม่นยำของคำบรรยายสุดท้ายจะมองไม่เห็นข้อนี้ ตัวเลข ชุดทดสอบ และฮาร์ดแวร์อยู่ในหน้าผลทดสอบสาธารณะ