ข้ามไปยังเนื้อหาหลัก

การรู้จำเสียงแบบสตรีมมิงกับการเกลาข้อความท้ายประโยค: สมดุลระหว่างความหน่วงและความแม่นยำ

คำบรรยายสดมีโจทย์สองข้อที่ดึงกันอยู่ ข้อความต้องขึ้นทันทีที่พูด และเมื่อพูดจบประโยคแล้วก็ควรแม่นยำที่สุด โมเดลสตรีมมิงเก่งเรื่องแรก โมเดลออฟไลน์เก่งเรื่องหลัง เราจึงใช้ทั้งสองอย่างควบคู่กัน คือใช้การรู้จำเสียงแบบสตรีมมิงแสดงข้อความระหว่างที่พูด พอจบประโยคก็ส่งเสียงของประโยคนั้นให้โมเดลออฟไลน์เกลาข้อความใหม่ แล้วนำข้อความที่เกลาแล้วมาแทนที่ข้อความเดิม บทความนี้อธิบายว่าผลลัพธ์สองชุดผสานกันอย่างไร หน้าจอเปลี่ยนผ่านอย่างไร รวมถึงกรณีที่อาจเกิดปัญหาและกลไกสำรองเมื่อเกิดข้อผิดพลาด (Fallback)

1. ทำไมความหน่วงกับความแม่นยำจึงดึงกัน

โมเดลสตรีมมิงต้องให้ข้อความก่อนที่ประโยคจะจบ จึงอาศัยได้เฉพาะสิ่งที่ได้ยินมาแล้ว บวกกับบริบทข้างหน้าที่สั้นมาก แต่คำจำนวนมากต้องรอคำที่ตามมาถึงจะชัด: คำพ้องเสียงต้องดูคำถัดไป ตัวเลขต้องดูหน่วย และภาษาไทยไม่เว้นวรรคระหว่างคำ แม้แต่การตัดว่าคำจบตรงไหนก็ต้องดูสิ่งที่ตามมา โมเดลออฟไลน์อ่านทั้งประโยคในคราวเดียว ความกำกวมเหล่านี้ส่วนใหญ่จึงหายไปเมื่อมีบริบทมากขึ้น

ดังนั้น “เร็วกว่า” กับ “แม่นกว่า” จึงเป็นทางเลือกเดียวกัน คือจะรอนานแค่ไหนก่อนตัดสินใจ รอน้อย ข้อความขึ้นเร็วแต่มีหลักฐานให้ตัดสินน้อย รอนาน หลักฐานมากขึ้นแต่ผู้ใช้ก็ต้องจ้องหน้าจอว่างนานขึ้นด้วย การรู้จำเสียงแบบสตรีมมิงเลือกที่จะไม่รอ คือให้ผลชั่วคราวออกมาก่อน แล้วยอมให้แก้ได้ภายหลัง

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

2. ข้อความสามสถานะ: partial, final และข้อความที่เกลาแล้ว

  • partial: ทุกอย่างที่ได้ยินมาแล้วในประโยคปัจจุบัน partial ใหม่แต่ละอันจะแทนที่อันก่อนหน้าทั้งก้อน ไม่ได้ต่อท้าย และอาจว่างเปล่าก็ได้ ตัวอักษรที่แสดงอยู่แล้วเปลี่ยนได้
  • final: เมื่อผู้พูดหยุดประมาณสองวินาที เซิร์ฟเวอร์จะถือว่าประโยคนั้นจบ การเชื่อมต่อยังเปิดอยู่เพื่อรอประโยคถัดไป
  • ข้อความที่เกลาแล้ว: เบราว์เซอร์เก็บเสียงที่เพิ่งส่งไปไว้ในเครื่อง เมื่อ final มาถึง จะตัดเสียงเฉพาะประโยคนั้นออกมา แปลงเป็นไฟล์ WAV แล้วส่งให้โมเดลออฟไลน์ (ตัวเดียวกับที่ใช้ถอดเสียงไฟล์) ประมวลผลซ้ำเพื่อคืนข้อความพร้อมเครื่องหมายวรรคตอนกลับมา

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

  • partial: ผมจะส่งรายงานให้
  • final: ผมจะส่งรายงานให้ภายในวันสุก
  • เกลาแล้ว: ผมจะส่งรายงานให้ภายในวันศุกร์
ขั้นตอนต่าง ๆ ของประโยคเดียว ข้อความเป็นเพียงตัวอย่างเพื่ออธิบายกลไก

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

3. กฎการผสานผลลัพธ์

  1. partial แทนที่ทั้งบรรทัดปัจจุบัน ไม่นำมาต่อกัน
  2. final แต่ละอันกลายเป็นประโยคที่มีหมายเลขกำกับ และต่อท้ายประโยคที่มีอยู่
  3. การเกลาข้อความจะแทนที่ตามหมายเลขประโยค ไม่ใช่ตามตำแหน่ง ตอนที่ผลลัพธ์กลับมา ประโยคถัดไปอาจขึ้นบนหน้าจอแล้ว และอาจมีคำขอเกลาข้อความค้างอยู่หลายอันพร้อมกัน ผลลัพธ์แต่ละอันจึงแก้เฉพาะประโยคของตัวเอง ใครกลับมาก่อนก็ไม่เป็นไร
  4. ถ้าขั้นตอนเกลาข้อความไม่มีผลลัพธ์ ให้คงข้อความจากสตรีมมิงไว้ ถ้าเสียงสั้นกว่า 0.25 วินาทีจะไม่ส่งคำขอ ถ้าผลที่ได้ว่างเปล่า คำขอล้มเหลว โควตาหมด หรือผ่านไป 12 วินาทีแล้วยังไม่ตอบกลับ ก็คงข้อความจากสตรีมมิงไว้เช่นกัน การเกลาข้อความเป็นส่วนเสริมที่ทำให้แม่นยำขึ้น ไม่ใช่สิ่งที่ระบบต้องพึ่งพาเสมอ
  5. สำหรับโปรแกรมอ่านหน้าจอ ประโยคที่นิ่งแล้วจะถูกอ่านหนึ่งครั้งในพื้นที่ประกาศแยกต่างหากเมื่อมาถึง การแทนที่ด้วยข้อความที่เกลาแล้วในภายหลังจะไม่ถูกอ่านซ้ำ ผู้ใช้จึงไม่ต้องฟังประโยคเดิมสองรอบ

4. การเปลี่ยนผ่านบนหน้าจอ: จากสีน้ำเงินเป็นสีหลัก

สามสถานะ สามลักษณะ:

  • ประโยคที่กำลังพูดเป็นสีน้ำเงิน และมีเคอร์เซอร์กะพริบต่อท้าย
  • ประโยคที่เป็น final แล้วแต่ข้อความที่เกลาแล้วยังไม่กลับมา ยังเป็นสีน้ำเงิน
  • เมื่อข้อความที่เกลาแล้วกลับมา หรือเมื่อยกเลิกการรอ ข้อความจะถูกแทนที่ และสีจะไล่เป็นสีหลักภายในประมาณ 0.8 วินาที

สีบอกว่าข้อความ “แน่นอนแค่ไหน” ไม่ได้บอกว่าเป็นประโยคชนิดไหน เมื่อผู้อ่านเห็นสีน้ำเงินก็รู้ว่าอาจเปลี่ยน เห็นสีหลักก็รู้ว่าจะไม่เปลี่ยนอีก ถ้าข้อความถูกสลับไปเงียบ ๆ โดยไม่มีสัญญาณใด ๆ ผู้อ่านจะคิดว่าตัวเองอ่านผิด

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

5. จุดที่อาจผิดพลาด

  • ฝั่งเบราว์เซอร์กับเซิร์ฟเวอร์ตัดขอบเขตประโยคไม่ตรงกัน เซิร์ฟเวอร์ตัดสินว่าประโยคจบจากการตรวจจับความเงียบของตัวเอง ส่วนฝั่งเบราว์เซอร์ตัดเสียงที่ความเงียบ 1.5 วินาที ถ้ากลางประโยคมีช่วงหยุดที่ยาวกว่าปกติ หรือเซิร์ฟเวอร์ตัดกลางคำพูดที่ต่อเนื่อง เสียงที่ส่งไปเกลาข้อความอาจเกินหรือขาดไปเล็กน้อย วิธีที่รัดกุมกว่าคือจัดแนวด้วยเวลาเริ่มของประโยคที่เซิร์ฟเวอร์ส่งกลับมา แต่ต้องยืนยันก่อนว่านาฬิกาของสองฝั่งยังตรงกันหลังเชื่อมต่อใหม่ ตอนนี้เราจึงตัดตามช่วงหยุด
  • พูดต่อเนื่องยาวมาก ในเครื่องเก็บเสียงไว้เพียง 30 วินาทีล่าสุด ประโยคที่ยาวกว่านั้นจะไม่ส่งช่วงต้นไปเกลาข้อความ ข้อความที่เกลาแล้วจึงอาจขาดต้นประโยค
  • เสียงเบามาก เฟรมที่ต่ำกว่าเกณฑ์เสียงรบกวนไม่ถูกนับว่ามีเสียง ทั้งประโยคอาจถูกมองเป็นความเงียบ จึงไม่มีเสียงให้ส่งไปเกลา และคงข้อความจากสตรีมมิงไว้
  • การเชื่อมต่อขาด เมื่อเซิร์ฟเวอร์ปิดการเชื่อมต่อตามปกติ หน้าเว็บจะเชื่อมต่อใหม่ให้เอง ติดต่อกันได้สูงสุดสามครั้ง แต่ถ้าการเชื่อมต่อหลุดอย่างผิดปกติ หน้าเว็บจะไม่เชื่อมต่อใหม่ และแจ้งว่าเครือข่ายมีปัญหาทันที
  • ข้อจำกัดเวลาของการทดลองใช้ เมื่อถึงเวลาที่กำหนด เซิร์ฟเวอร์จะแจ้งด้วยรหัสปิดการเชื่อมต่อโดยเฉพาะ และหน้าเว็บจะแสดงคำอธิบายที่เจาะจง ไม่ใช่แค่ “เกิดข้อผิดพลาด”

6. วัดอย่างไร

ความหน่วงของตัวอักษรแรกนับดังนี้:

ความหน่วงตัวอักษรแรก
= เวลาที่ partial ที่ไม่ว่างอันแรกมาถึง
− เวลาเริ่มของเฟรมแรกที่มีเสียง

การจับเวลาทำในเบราว์เซอร์ จึงรวมสามส่วน คือบัฟเฟอร์ตอนบันทึกเสียง เครือข่าย และการประมวลผลของเซิร์ฟเวอร์ การบันทึกใช้เฟรมละ 2048 แซมเพิล (Sample) ความยาวของแต่ละเฟรมจึงขึ้นกับ Sample Rate ของเบราว์เซอร์ คือ 128 มิลลิวินาทีที่ 16 kHz และประมาณ 43 มิลลิวินาทีที่ 48 kHz เวลาเกลาข้อความก็เป็นเวลาไป-กลับฝั่งเบราว์เซอร์ คือเข้ารหัส WAV อัปโหลด รู้จำเสียง และส่งผลกลับมา เวลาประมวลผลที่เซิร์ฟเวอร์รายงานเองจะสั้นกว่า

ถ้าจะวัดว่าการเกลาข้อความช่วยลดความผิดพลาดได้เท่าไร ต้องให้คะแนนผลลัพธ์สองชุดแยกกัน คือ final ตามที่นิ่งตอนแรก กับข้อความหลังเกลาแล้ว แต่ละแบบคำนวณ CER บนชุดทดสอบเดียวกัน ส่วนต่างระหว่างสองค่าคือความแม่นยำที่เพิ่มขึ้นจากการเกลาข้อความ ถ้าดูเพียงความแม่นยำของคำบรรยายสุดท้ายจะมองไม่เห็นข้อนี้ ตัวเลข ชุดทดสอบ และฮาร์ดแวร์อยู่ในหน้าผลทดสอบสาธารณะ

ทีมงาน DataArc