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

5 เลเยอร์ของ Pipeline

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

Voice Communication Layer คือรากฐาน ทำหน้าที่จัดการการรับสัญญาณจากไมโครโฟน, การลดเสียงรบกวน (noise suppression), การยกเลิกเสียงสะท้อน (echo cancellation) และการส่งแพ็กเก็ตข้อมูลผ่านอินเทอร์เน็ต ให้คิดซะว่ามันคือสายโทรศัพท์ดิจิทัล หากเลเยอร์นี้ทำแพ็กเก็ตหล่น (drop packets) หรือทำให้เกิดอาการสัญญาณแกว่ง (jitter) ส่วนที่เหลือของ pipeline ก็จะทำงานกับข้อมูลที่ใช้งานไม่ได้ ทีมส่วนใหญ่จึงใช้ WebRTC ในส่วนนี้ เพราะสามารถจัดการการเชื่อมต่อแบบ peer-to-peer และมีระบบป้องกันด้านอะคูสติกในตัว

ต่อมาคือ Speech-to-Text (STT) คุณต้องเปลี่ยนเสียงที่ได้รับให้เป็นตัวอักษรให้เร็วที่สุดเท่าที่จะเป็นไปได้ เอนจิน STT แบบสตรีมมิ่ง (Streaming STT) จะไม่รอให้เกิดความเงียบ แต่จะส่งข้อความบางส่วน (partial transcripts) ออกมาทันทีที่พยางค์ถูกส่งมา พฤติกรรมนี้เป็นสิ่งสำคัญมาก หากโมดูล STT ของคุณต้องรอจนกว่าจะได้ยินเสียงหยุดพัก คุณก็ได้เสียเวลาอันมีค่าไปหลายมิลลิวินาทีแล้ว การทำ streaming ในปัจจุบันจะประมวลผลเสียงที่เข้ามาอย่างต่อเนื่องและปรับปรุงการคาดเดาเมื่อมีบริบทมากขึ้นเข้ามา

Machine Translation (MT) อยู่ตรงกลาง ทำหน้าที่นำข้อความดิบมาเขียนใหม่ในภาษาเป้าหมาย ระบบในยุคแรกทำได้เพียงแค่การสลับวลี แต่โมเดลแบบ transformer ในปัจจุบันสามารถจัดการไวยากรณ์และความสัมพันธ์ของคำในระยะไกล (long-range dependencies) ได้ดีกว่ามาก อย่างไรก็ตาม ยังคงต้องมีการรวมระบบ (integration) อย่างระมัดระวัง คุณต้องการโมดูล MT ที่รองรับอินพุตแบบสตรีมมิ่ง เพื่อให้สามารถเริ่มแปลเศษเสี้ยวของประโยคได้ก่อนที่ผู้พูดจะพูดจบความคิด

จากนั้นคือ Text-to-Speech (TTS) นี่คือส่วนที่ระบบของคุณจะมีเสียงเป็นของตัวเอง ระบบ TTS แบบ concatenative รุ่นเก่าจะฟังดูเหมือนเสียง GPS ประกาศทางออกทางด่วน แต่โมเดล Neural TTS ได้เปลี่ยนเกมด้วยการทำนาย spectrograms หรือคลื่นเสียงดิบ (raw waveforms) โดยตรง ทำให้ได้เสียงที่มีจังหวะสูงต่ำและมีการหายใจ นอกจากนี้ยังสามารถรักษาอารมณ์ของเสียงไว้ได้ ซึ่งเป็นเรื่องสำคัญ เพราะคำขอโทษที่ราบเรียบด้วยน้ำเสียงหุ่นยนต์อาจฟังดูเหมือนประชดประชันโดยไม่ตั้งใจ

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

ปัญหาเรื่องความหน่วง (Latency)

Latency คือศัตรูตัวฉกาจ การสนทนาของมนุษย์ยอมรับช่องว่างได้เพียงช่วงสั้นๆ เท่านั้น หากระบบต้องรอให้ผู้ใช้พูดจบทั้งประโยคก่อนจะเริ่มแปล การโต้ตอบจะรู้สึกช้าและติดขัด ผู้คนจะเริ่มพูดแทรกกัน หรือที่แย่กว่านั้นคือการสนทนาจะกลายเป็นจังหวะที่ตะกุกตะกักเหมือนการใช้เครื่องวิทยุสื่อสาร (walkie-talkie) เป้าหมายของคุณคือความหน่วงรวม (total latency) ต้องต่ำกว่าหนึ่งวินาทีแบบ end-to-end

เพื่อบรรลุเป้าหมายนั้น คุณต้องประมวลผลเสียงเป็นชิ้นเล็กๆ (chunks) โดยรักษาขนาดของ chunk ให้อยู่ระหว่าง 20 ถึง 100 มิลลิวินาที ขนาด 20 มิลลิวินาทีจะครอบคลุมระยะเวลาของเสียงพยัญชนะหนึ่งตัว ส่วน 100 มิลลิวินาทีจะครอบคลุมประมาณหนึ่งพยางค์ครึ่ง จงป้อน chunk เหล่านี้เข้าสู่ streaming pipeline เพื่อให้ STT, การแปล และ TTS ทำงานบนข้อมูลบางส่วนพร้อมกัน ไม่ควรมีอะไรที่ต้องรอจนจบประโยค

ใช้การประมวลผลเสียงแบบสตรีมมิ่งในทุกขั้นตอน นั่นหมายความว่าเอนจิน STT จะส่งข้อความบางส่วนออกมาอย่างต่อเนื่อง, เอนจิน MT จะแปลเศษเสี้ยวของประโยคทันทีที่ได้รับคำมากพอที่จะสร้างอนุประโยค (clause) ที่สมบูรณ์ และเอนจิน TTS จะเริ่มพูดครึ่งแรกของประโยคในขณะที่ครึ่งหลังยังอยู่ในระหว่างการถอดรหัส

การบรรลุความหน่วงระดับต่ำกว่าวินาที (sub-second latency) ต้องอาศัยวินัยในทุกขั้นตอน: การรับสัญญาณ (capture), การเข้ารหัส (encode), การส่ง (transmit), การเข้าคิว (queue), การประมวลผล (process), การสังเคราะห์ (synthesize) และการเล่นเสียง (playback) จงตัดการบัฟเฟอร์ (buffering) ที่ไม่จำเป็นออกในแต่ละขั้นตอน ตัวอย่างเช่น หลีกเลี่ยงการใช้อัลกอริทึมกำจัดเสียงรบกวนที่ต้องใช้การมองล่วงหน้า (lookahead) นานครึ่งวินาที เว้นแต่จะจำเป็นจริงๆ ใช้โปรโตคอลการบีบอัดที่มีประสิทธิภาพอย่าง Opus แทนที่จะใช้ PCM ดิบ และรันการประมวลผล (inference) บน edge servers ที่อยู่ใกล้กับผู้โทรทั้งสองฝ่าย เพื่อให้ระยะเวลาการเดินทางของข้อมูลในเครือข่าย (network round trips) สั้นที่สุด

จุดที่โมเดล AI ยังคงมีปัญหา

AI นำมาซึ่งอุปสรรคเฉพาะตัวที่เครื่องมือแปลแบบคัดลอกวาง (clipboard translators) ไม่เคยต้องเผชิญ

บริบทเป็นเรื่องที่ยากจริงๆ ในภาษาอังกฤษ คำว่า "duck" สามารถเป็นได้ทั้งสัตว์, คำกริยาที่แปลว่าก้มหัวลง หรือแม้แต่คำเรียกแทนคนที่รักในบางสำเนียง หากเอนจินเห็นคำนี้เพียงโดดๆ ก็อาจจะเดาผิดได้ การขยายสัญญาณแบบสตรีมมิ่ง (Streaming amplification) ทำให้เรื่องนี้ยากขึ้นไปอีก เพราะระบบต้องตัดสินใจเลือกคำก่อนที่ประโยคทั้งประโยคจะช่วยขยายความหมายให้ชัดเจน บางทีมแก้ปัญหานี้ด้วยการสร้างหน้าต่างย้อนกลับ (rollback windows) ขนาดเล็กไว้ในเอนจิน STT เพื่อให้สามารถแก้ไขข้อความถอดเสียงได้หากเสียงที่ตามมาภายหลังทำให้การตีความเปลี่ยนไป

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

การสนทนาเป็นเรื่องที่ยุ่งเหยิง ผู้คนมักพูดแทรกกัน พูดซ้ำ พูด "เอ่อ" และเริ่มประโยคที่พูดไม่จบ ระบบของคุณจำเป็นต้องมี Voice Activity Detection (VAD) เพื่อจัดการกับการหยุดชะงักเหล่านี้อย่างชาญฉลาด VAD ที่ดีจะแยกแยะระหว่างเสียงพูดจริงกับเสียงรบกวนรอบข้างได้ แต่ยังต้องแยกแยะระหว่างการหยุดพักสั้นๆ ระหว่างการพูด กับการสิ้นสุดการพูดจริงๆ ได้ด้วย หาก VAD ตอบสนองไวเกินไป (trigger-happy) มันจะตัดส่วนเริ่มต้นของคำตอบทิ้ง แต่ถ้ามันระมัดระวังเกินไป มันจะส่งความเงียบเข้าไปในเอนจินแปลภาษา ซึ่งเป็นการสิ้นเปลืองทรัพยากรคำนวณและทำให้เกิดช่องว่างที่ดูแปลกประหลาดในบทสนทนา

การขยายระบบและความปลอดภัย

จงออกแบบเพื่อการขยายระบบ (scale) ตั้งแต่การร่างสถาปัตยกรรมครั้งแรก ระบบแบบ Monolith ที่แปลการโทรเพียงครั้งเดียวได้อย่างราบรื่น จะพังทลายลงภายใต้ภาระของการสนทนาพร้อมกันนับพันครั้ง จงใช้ Microservices เพื่อให้คุณสามารถขยายแต่ละขั้นตอนได้อย่างเป็นอิสระ หากคิวของ TTS ของคุณล่าช้าเพราะบางภาษามีความซับซ้อนทางสัทศาสตร์มากกว่าภาษาอื่น คุณก็แค่เพิ่ม TTS workers โดยไม่ต้องไปยุ่งกับคลัสเตอร์ STT หากบริการ MT ของคุณทำงานไม่ไหวกับคู่ภาษาเฉพาะเจาะจง คุณก็สามารถแยกและขยายเฉพาะส่วนประกอบนั้นได้

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

เริ่มต้นสร้างได้เลย

ปัจจุบันนักพัฒนาสามารถเข้าถึงโมเดล STT แบบ open-source, cloud-based MT APIs และ pretrained neural TTS checkpoints ซึ่งเป็นสิ่งที่หาไม่ได้แม้แต่เมื่อไม่กี่ปีก่อน องค์ประกอบต่างๆ มีพร้อมอยู่แล้ว สถาปัตยกรรมก็เป็นที่เข้าใจกันดีแล้ว

เริ่มจากจุดเล็กๆ ลองส่งเสียงจากไมโครโฟนเพียงสองวินาทีผ่าน streaming STT engine