วอยซ์เอเจนต์ภาษาไทยตอบไม่ได้จนกว่าจะรู้ว่าผู้โทรพูดจบแล้ว และภาษาไทยให้เบาะแสน้อยมาก การเขียนไม่มีเครื่องหมายจบประโยค ช่องว่างตกอยู่ระหว่างวลี และจังหวะที่ผู้พูดหยุดก็ตกกลางประโยคพอ ๆ กับตกตรงจุดจบ ก่อนวันที่ 23 กันยายน ทีมที่สร้างงานบน API ของเราต้องถอดเสียงจากไฟล์ที่บันทึกเสร็จแล้ว และเขียนตรรกะตัดสินรอบพูดนั้นเอง
Paxa STT Lite Realtime ถอดเสียงตามที่เสียงเดินทางเข้ามาบน WebSocket เดียว ตัดสินว่าแต่ละรอบพูดจบตรงไหน แล้วส่งบทถอดที่จบแล้วหนึ่งชุดของรอบนั้น รหัสโมเดลคือ paxa-stt-lite-realtime-v1-preview และปลายทางคือ WS /v1/stt/live
มีอะไรใหม่#
- โมเดลเรียลไทม์
paxa-stt-lite-realtime-v1-previewให้บริการผ่านWS /v1/stt/liveการเชื่อมต่อเดียวรับได้ทั้งบทสนทนา - การตรวจจับรอบพูดอยู่ในซ็อกเก็ตเอง
speech_startedเปิดรอบพูดspeech_endedปิดรอบ แล้วtranscriptฉบับจบหนึ่งชุดตามมา - รับเสียงเป็น PCM 16 บิตแบบมีเครื่องหมายที่ 16 หรือ 48 kHz หรือ mu-law จากระบบโทรศัพท์ที่ 8 kHz
- คำใบ้ภาษา เวลาระดับคำ สไตล์ รูปแบบการเขียน และคลังคำศัพท์ของ
POST /v1/sttตั้งค่าครั้งเดียวที่เฟรมstartแล้วคงที่ตลอดการเชื่อมต่อ - คิดค่าบริการตามเสียงที่รับเข้ามา รวมช่วงเงียบ ที่ 12.5 เครดิตต่อนาที ใบเสร็จ
chargedทยอยลงมาระหว่างที่บทสนทนายังดำเนินอยู่ - โหมดสดในเครื่องมือถอดเสียง ที่ส่งเสียงจากไมโครโฟนในเบราว์เซอร์ผ่านรีเลย์ได้โดยไม่ต้องเขียนโค้ด
หนึ่งเซสชันจริง ไม่ผ่านการแก้#
ตารางด้านล่างคือการบันทึกเมื่อวันที่ 2026-09-23 เสียงประกาศคอลเซ็นเตอร์สามชุดที่สร้างด้วย Paxa TTS Flash ถูกเล่นเข้าไปในการเชื่อมต่อเดียว โดยเว้นช่วงระหว่างแต่ละชุด รวมเป็นเสียง 29.95 วินาที ขอบเขตรอบพูด บทถอด และยอดที่ตัด คือสิ่งที่ซ็อกเก็ตรายงานกลับมา นำมาแสดงโดยไม่แก้ไข
| รอบพูด | วินาที | เครดิต | บทถอด |
|---|---|---|---|
| 1 | 0 ถึง 2.7 | 0.57 | สวัสดีค่ะขอบคุณที่ติดต่อบริษัทของเรา |
| 2 | 2.7 ถึง 8 | 1.1 | กด 1 เพื่อติดต่อฝ่ายขายกด 2 ฝ่ายบริการลูกค้าหรือกด 0 เพื่อติดต่อเจ้าหน้าที่ค่ะ |
| 3 | 9.11 ถึง 18.05 | 2.1 | สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน 1,250 บาทครบกำหนดวันที่ 15 สิงหาคมนี้ชำระผ่านแอปได้ตลอด 24 ชั่วโมงค่ะ |
| 4 | 19.16 ถึง 22.9 | 1.01 | ขณะนี้อยู่นอกเวลาทำการเราเปิดให้บริการวันจันทร์ถึงศุกร์ |
| 5 | 22.9 ถึง 23.71 | 0.16 | เวลา |
| 6 | 23.92 ถึง 26.44 | 0.57 | 9 โมงเช้าถึง 6 โมงเย็น |
| 7 | 26.44 ถึง 28.55 | 0.44 | ฝากข้อความหลังเสียงสัญญาณได้เลยค่ะ |
อ่านรอบพูดที่ 4 ถึง 6 ต่อกันจะได้ประโยคเดียวเรื่องเวลาทำการ ผู้พูดหยุดก่อนคำว่าเวลา แล้วหยุดอีกครั้งก่อนตัวเลข ซ็อกเก็ตจึงปิดรอบพูดตรงที่หยุดทั้งสองจุด นี่คือปัญหาขอบเขตของภาษาไทยที่โผล่ขึ้นมาในการบันทึกจริง เอเจนต์ที่รอจนผู้โทรเงียบสักครู่ก่อนตอบ จะได้อ่านครบทั้งสามรอบแล้วตอบครั้งเดียว
รอบพูดทุกรอบรวมกันคิดไป 5.95 เครดิต การเชื่อมต่อยังฟังต่ออีก 1.4 วินาทีหลังรอบสุดท้ายปิดลง ซึ่งบวกเพิ่มอีก 0.29 ยอดรวมที่ซ็อกเก็ตรายงานคือ 6.24 เครดิต
อะไรวิ่งอยู่บนซ็อกเก็ต#
มีสามเฟรมที่ส่งขึ้นไป และเจ็ดอีเวนต์ที่ส่งกลับลงมา เสียงเป็นไบนารี ส่วนที่เหลือเป็น JSON ทั้งหมดอยู่บนการเชื่อมต่อเดียว
client -> {"type":"start","model":"paxa-stt-lite-realtime-v1-preview",
"audio":{"encoding":"pcm_s16le","sample_rate":16000},
"language":"th","convention":"written"}
server <- {"type":"started","connection":"7d9c2b7e","model":"paxa-stt-lite-realtime-v1-preview"}
client -> <binary audio frames>
server <- {"type":"speech_started","turn":1,"time":0.000}
server <- {"type":"transcript","turn":1,"is_final":false,"text":"สวัสดีค่ะ"}
server <- {"type":"speech_ended","turn":1,"time":2.700}
server <- {"type":"charged","seq":1,"seconds":2.700,"credits":0.57}
server <- {"type":"transcript","turn":1,"is_final":true,"text":"สวัสดีค่ะขอบคุณที่ติดต่อบริษัทของเรา"}
client -> {"type":"end"}
server <- {"type":"done","turns":7,"total_credits":6.24}startระบุโมเดลกับการเข้ารหัสเสียง และพาตัวเลือกทั้งหมดของเซสชันไปด้วย เป็นเฟรมแรกและมีได้เฟรมเดียวต่อการเชื่อมต่อplaybackบอกซ็อกเก็ตว่าเสียงของเอเจนต์เองกำลังดังอยู่ในห้องเดียวกับไมโครโฟนendปิดรอบพูดที่ค้างอยู่ ส่งบทถอดของรอบนั้น แล้วขอdone
อีเวนต์ที่ส่งกลับลงมาคืออีกครึ่งหนึ่งของสัญญา
startedยืนยันว่าเซสชันพร้อมแล้ว พร้อมระบุรหัสการเชื่อมต่อ ใช้รหัสนี้อ้างอิงเวลาติดต่อฝ่ายสนับสนุนspeech_startedเปิดรอบพูด พร้อมบอกว่าเสียงเริ่มตรงไหนบนนาฬิกาของเสียงtranscriptที่is_finalเป็น false คือร่างระหว่างทางของรอบพูดนั้น และจะถูกแทนที่ด้วยชุดถัดไปspeech_endedปิดรอบพูดchargedคือใบเสร็จของช่วงคิดเงินหนึ่งช่วง พร้อมจำนวนวินาทีที่ครอบคลุมและยอดสะสมtranscriptที่is_finalเป็น true คือตัวรอบพูด ข้อความชุดนี้คือชุดที่โปรแกรมเอาไปทำงานต่อerrorระบุรอบพูดที่ล้มเหลว หรือรายงานความล้มเหลวร้ายแรงก่อนปิดการเชื่อมต่อdoneสรุปยอดรวมของการเชื่อมต่อ และมาก่อนการปิดตามปกติ
การตรวจจับรอบพูด กับสัญญาณพูดแทรก#
speech_started มาถึงเมื่อซ็อกเก็ตได้ยินมากพอจะมั่นใจแล้ว เวลาที่มันรายงานจึงอยู่ก่อนจังหวะที่อีเวนต์มาถึงฝั่งคุณ ให้ถืออีเวนต์นี้เป็นสัญญาณว่ามีคนพูดแทรก เอเจนต์ที่กำลังพูดค้างอยู่ควรหยุดเสียงตัวเองและยกเลิกคำตอบที่กำลังสร้าง
speech_ended บอกว่ารอบพูดปิดแล้วและบทถอดฉบับจบกำลังตามมา วอยซ์เอเจนต์แสดงสถานะกำลังคิดได้ตั้งแต่จุดนี้ ฉบับจบจะตามมาหลังจากช่วงคิดเงินของรอบนั้นลงบัญชีแล้ว ซึ่งเป็นสิ่งที่กันไม่ให้บทถอดมาถึงก่อนใบเสร็จของมัน
หมายเหตุ
เฟรม playback คือสิ่งที่กันไม่ให้เอเจนต์ถอดเสียงของตัวเอง ส่ง {"type":"playback","speaking":true} เมื่อเสียงของเอเจนต์เริ่มดัง และส่ง false เมื่อหยุด ระหว่างที่ค่าเป็น true การเปิดรอบพูดต้องใช้เสียงพูดที่ต่อเนื่องกว่าเดิมจากผู้โทร และการพูดแทรกจริงยังเปิดรอบพูดได้อยู่
รอบพูดนับจาก 1 ต่อหนึ่งการเชื่อมต่อ และหมายเลขที่สูงกว่าคือรอบที่มาทีหลังเสมอ เอเจนต์ที่ตอบรอบที่ 3 ไปแล้วให้ทิ้งรอบที่ 3 และตอบรอบที่ 4 การเทียบหมายเลขครั้งเดียวนี้คือกติกาเรื่องข้อมูลค้างทั้งหมด
ตัวเลือกยกมาทั้งชุด#
ทุกอย่างที่ POST /v1/stt รับเป็นฟิลด์ของคำขอ ซ็อกเก็ตรับไว้ครั้งเดียวใน start แล้วคงค่านั้นตลอดอายุการเชื่อมต่อ ทั้งหมดนี้ไม่เปลี่ยนค่าบริการ
| ฟิลด์ | ทำอะไร |
|---|---|
language | คำใบ้ภาษาแบบ BCP 47 ถ้าไม่ส่งมา โมเดลจะตรวจจับภาษาจากเสียงเอง และเขียนแต่ละภาษาด้วยระบบเขียนของภาษานั้น |
timestamps | ค่า "word" เพิ่มอาร์เรย์ช่วงเวลาให้บทถอดฉบับจบทุกชุด หนึ่งรายการต่อหนึ่งคำบนนาฬิกาของการเชื่อมต่อ คำภาษาไทยถูกตัดคำให้แล้ว |
style | verbatim เขียนคำเอ่อคำอ้าและการพูดผิดแล้วพูดใหม่ตามที่พูดจริง ส่วน clean ตัดออกและอ่านลื่นกว่า ค่าเริ่มต้นคือ verbatim ซึ่งตามเสียงจริงได้ใกล้ที่สุด |
convention | spoken เขียนตัวเลขตามที่ผู้โทรพูด ส่วน written เขียนเป็นตัวเลขพร้อมหน่วยและไม้ยมก ซึ่งเป็นรูปที่ช่องกรอกการจองหรือการชำระเงินอ่านได้ |
vocabulary | คำศัพท์ที่บทสนทนาน่าจะมี ได้สูงสุด 50 คำ คำละไม่เกิน 50 ตัวอักษร สะกดแบบที่ต้องการให้ปรากฏ |
การนับหมายเลขผู้พูดและไฟล์คำบรรยายยังอยู่ที่ปลายทางแบบไฟล์บันทึก การอ่านทั้งไฟล์รวดเดียวคือสิ่งที่ทำให้นับผู้พูดและตัดช่วงคำบรรยายได้ และการเชื่อมต่อแบบสดไม่มีไฟล์ทั้งไฟล์ให้อ่าน
เสียงที่ซ็อกเก็ตรับ#
| การเข้ารหัส | อัตราสุ่ม | มาจากไหน |
|---|---|---|
pcm_s16le | 16 หรือ 48 kHz | PCM 16 บิตแบบมีเครื่องหมาย เรียงไบต์ท้ายก่อน โมโน มาจากไมโครโฟนในเบราว์เซอร์ผ่าน audio worklet หรือจากอุปกรณ์บันทึกที่อัตราสุ่มของตัวเอง |
mulaw | 8 kHz | G.711 mu-law โมโน ตามที่แพลตฟอร์มโทรศัพท์ส่งต่อมา ไม่ต้องแปลงรหัสที่ฝั่งคุณ |
- เฟรมไบนารีพาไบต์ไปได้ในขนาดใดก็ได้ สูงสุด 64 KiB ต่อเฟรม ขนาด 20 มิลลิวินาทีเป็นขนาดที่พบบ่อยสำหรับไมโครโฟน
- ส่งจังหวะไหนก็ได้ ส่งเร็วกว่าเวลาจริงก็ได้ และนาฬิกาที่อีเวนต์รายงานคือนาฬิกาของเสียงเสมอ
- ไบต์ถูกอ่านตามที่
startประกาศไว้เป๊ะ ๆ อัตราสุ่มที่ประกาศผิดจะถอดออกมาเป็นเสียงรบกวน
ข้อควรระวัง
ห้ามใส่คีย์ API ไว้ในเบราว์เซอร์ การอัปเกรดการเชื่อมต่อยืนยันตัวตนด้วยเฮดเดอร์ Authorization ชุดเดียวกับทุกปลายทาง และ WebSocket ในเบราว์เซอร์ส่งเฮดเดอร์นั้นไม่ได้ ให้ส่งเสียงจากไมโครโฟนผ่านเซิร์ฟเวอร์ของคุณเอง
เซสชันหนึ่งคิดเงินเท่าไร#
การเชื่อมต่อคิดค่าบริการตามเสียงที่รับเข้ามา รวมช่วงเงียบ ที่ 12.5 เครดิตต่อนาที คิดเป็น 750 เครดิตต่อชั่วโมง หรือราว $0.75 ถ้ามองเป็นหน่วยย่อย คือหนึ่งในร้อยของเครดิตทุก 48 มิลลิวินาทีที่วิ่งบนสาย
ระบบตัดเครดิตเป็นช่วง ช่วงหนึ่งปิดเมื่อจบแต่ละรอบพูด เมื่อผ่านไปหนึ่งนาทีโดยไม่มีรอบพูดเลย และเมื่อปิดเซสชัน แต่ละช่วงมาถึงเป็นใบเสร็จ charged ขั้นต่ำ 0.1 เครดิตต่อคำขอคิดครั้งเดียวต่อการเชื่อมต่อ บนใบเสร็จใบแรก
รอบพูดที่โมเดลถอดไม่สำเร็จไม่มีค่าใช้จ่าย เสียงของรอบนั้นถูกกันออกจากยอดสะสม และอีเวนต์ error จะระบุรอบพูดกับจำนวนเครดิตที่คืนให้ การเชื่อมต่อที่ไม่ได้ส่งรอบพูดสำเร็จเลยสักรอบได้เงินคืนเต็มจำนวน
| ปริมาณงาน | เสียงที่รับเข้ามา | เครดิต | ค่าบริการ |
|---|---|---|---|
| สายเดียว 3 นาที | 3 นาที | 37.5 | $0.04 |
| 200 สายต่อวัน | 10 ชั่วโมง | 7,500 | $7.50 |
| แบบนั้นทั้งเดือน 30 วัน | 300 ชั่วโมง | 225,000 | $225 |
การบันทึกยาว 29.95 วินาทีด้านบนคิดไป 6.24 เครดิต เครดิตฟรี 100 เครดิตของบัญชีใหม่ครอบคลุมการเชื่อมต่อแบบสดได้ราว 8 นาที
ในบันทึกคำขอ ทั้งการเชื่อมต่อแสดงเป็นหนึ่งแถว ไม่ว่าจะใช้ไปกี่รอบพูด แถวนั้นพาเสียงที่รับเข้ามา เครดิตที่ตัดไป และรหัสการเชื่อมต่อที่ซ็อกเก็ตประกาศไว้ตอน started
เมื่อมีอะไรล้มเหลว#
อีเวนต์ error ที่มีฟิลด์ turn มาด้วยจะไม่ปิดการเชื่อมต่อ รอบพูดนั้นไม่มีบทถอดส่งออกมา เสียงของมันถูกกันออกจากบิล และรอบถัดไปเดินต่อตามปกติ เอเจนต์จัดการรอบแบบนี้เหมือนกับตอนที่ฟังผู้โทรไม่ชัดแล้วถามซ้ำได้เลย
ความล้มเหลวร้ายแรงจะปิดซ็อกเก็ตพร้อมรหัสปิด สามรหัสนี้ควรเขียนโค้ดรองรับไว้
1001คือการรีสตาร์ตฝั่งเรา ให้เชื่อมต่อใหม่แล้วทำงานต่อ ยอดที่ช่วงซึ่งส่งมอบแล้วตัดไปยังคงอยู่4429แปลว่าบัญชีเปิดการเชื่อมต่อแบบสดค้างไว้มากเกินไปแล้ว ให้ปิดไปหนึ่งเส้นแล้วเชื่อมต่อใหม่4503แปลว่าติดต่อแบ็กเอนด์ไม่ได้ตอนstartยังไม่มีการตัดเครดิต ให้ลองใหม่
รายการรหัสปิดทั้งหมดพร้อมทุกฟิลด์ของเฟรมอยู่ในเอกสารอ้างอิงแบบเรียลไทม์ ส่วนรหัสทุกตัวที่อีเวนต์ error พามาได้อยู่ในเอกสารอ้างอิงข้อผิดพลาด
ขีดจำกัด#
- การเชื่อมต่อหนึ่งเส้นรับเสียงได้ 4 ชั่วโมง แล้วปิดด้วย
doneเหมือนที่เฟรมendทำ - การเชื่อมต่อที่เปิดอยู่ถือหนึ่งช่องคำขอพร้อมกันฝั่งถอดเสียงของแพ็กเกจไว้ตลอดเวลาที่ยังเชื่อมต่อ
- เฟรมไบนารีหนึ่งเฟรมใหญ่ได้ไม่เกิน 64 KiB
- การเชื่อมต่อที่ไม่มีเฟรมเข้าและไม่มีอีเวนต์ออกนาน 300 วินาทีจะถูกปิด
ไฟล์บันทึกหรือเรียลไทม์#
โมเดลสองตัวนี้ตอบคำถามคนละข้อ ไฟล์ที่มีอยู่แล้วควรไปที่ POST /v1/stt ซึ่งอ่านทั้งไฟล์ก่อนตอบ และคิดค่าบริการต่อนาทีถูกกว่าเพราะเหตุนั้น
| Paxa STT Lite | Paxa STT Lite Realtime | |
|---|---|---|
| ช่องทาง | POST /v1/stt | WS /v1/stt/live |
| ข้อมูลเข้า | ไฟล์ยาวไม่เกิน 60 นาที ขนาดไม่เกิน 25 MiB | เสียงไบนารีได้ถึง 4 ชั่วโมง |
| คำตอบ | บทถอดหนึ่งชุดของทั้งไฟล์ | บทถอดฉบับจบหนึ่งชุดต่อรอบพูด |
| อัตรา | 8.33 เครดิตต่อนาที | 12.5 เครดิตต่อนาที |
| หมายเลขผู้พูด | มี นับจาก 0 | มีเฉพาะปลายทางแบบไฟล์ |
| ไฟล์คำบรรยาย | srt และ vtt | มีเฉพาะปลายทางแบบไฟล์ |
| การตัดเครดิต | ครั้งเดียวก่อนถอด | เป็นช่วงระหว่างที่บทสนทนาดำเนินอยู่ |
โมเดลทั้งสองตัวเป็นพรีวิวงานวิจัย เปิดขายในอัตราที่ประกาศระหว่างการประเมิน ผลลัพธ์และตัวเลือกอาจเปลี่ยนแปลงได้ในรุ่นถัดไป ส่วนรหัสโมเดลคงเดิมตลอดเวลาที่ยังให้บริการ
เปิดเซสชัน#
เฟรม start หนึ่งเฟรมระบุโมเดลและการเข้ารหัสเสียง หลังจากนั้นคือเสียงแบบไบนารีที่ส่งขึ้นไปและอีเวนต์ที่ส่งกลับลงมา บนการเชื่อมต่อที่เปิดค้างไว้ตลอดบทสนทนา
import { open } from "node:fs/promises";
// Runs on Bun as-is; on Node, `import WebSocket from "ws"` accepts
// the same constructor options. Browsers cannot send this header, and
// API keys never ship to browsers anyway: relay the audio through your
// server.
const socket = new WebSocket("wss://api.paxalabs.com/v1/stt/live", {
headers: { Authorization: `Bearer ${process.env.PAXA_API_KEY}` },
});
socket.onopen = async () => {
socket.send(JSON.stringify({
type: "start",
model: "paxa-stt-lite-realtime-v1-preview",
audio: { encoding: "pcm_s16le", sample_rate: 16000 },
language: "th",
}));
// 16 kHz signed 16-bit mono is 32,000 bytes a second. A microphone
// delivers frames at this pace on its own; a file has to be paced.
const file = await open("caller.pcm");
const frame = new Uint8Array(640); // 20 ms
for (;;) {
const { bytesRead } = await file.read(frame, 0, frame.length);
if (bytesRead === 0) break;
socket.send(frame.subarray(0, bytesRead));
await new Promise((resolve) => setTimeout(resolve, 20));
}
socket.send(JSON.stringify({ type: "end" }));
};
socket.onmessage = (event) => {
const message = JSON.parse(String(event.data));
switch (message.type) {
case "speech_started":
// The user is talking: stop the agent's audio, cancel its reply.
break;
case "transcript":
if (message.is_final) console.log(`turn ${message.turn}: ${message.text}`);
break;
case "done":
socket.close();
}
};import json
import os
import time
from websockets.sync.client import connect # pip install websockets
with connect(
"wss://api.paxalabs.com/v1/stt/live",
additional_headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"},
) as socket:
socket.send(json.dumps({
"type": "start",
"model": "paxa-stt-lite-realtime-v1-preview",
"audio": {"encoding": "pcm_s16le", "sample_rate": 16000},
"language": "th",
}))
# 16 kHz signed 16-bit mono is 32,000 bytes a second; a file has to
# be paced the way a microphone paces itself.
with open("caller.pcm", "rb") as audio:
while frame := audio.read(640): # 20 ms
socket.send(frame)
time.sleep(0.02)
socket.send(json.dumps({"type": "end"}))
for message in socket:
event = json.loads(message)
if event["type"] == "transcript" and event["is_final"]:
print(event["turn"], event["text"])
elif event["type"] == "done":
break{"type":"started","connection":"7d9c2b7e-4a41-4c8e-9a35-1f26d8c04b7a","model":"paxa-stt-lite-realtime-v1-preview"}
{"type":"speech_started","turn":1,"time":0.3}
{"type":"speech_ended","turn":1,"time":12.252}
{"type":"charged","seq":1,"seconds":12.252,"credits":2.56,"total_credits":2.56}
{"type":"transcript","turn":1,"is_final":true,"text":"สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน พันสองร้อยห้าสิบ บาทครบกำหนดวันที่ สิบห้า สิงหาคมนี้ชำระผ่านแอปได้ตลอด ยี่สิบสี่ ชั่วโมงค่ะ","start":0.3,"end":12.252}
{"type":"done","total_seconds":12.252,"turns":1,"total_credits":2.56}ก่อนจะเขียนโค้ดสักบรรทัด#
เครื่องมือถอดเสียง มีโหมดสด มันขอสิทธิ์ไมโครโฟน ส่งเสียงผ่านเซิร์ฟเวอร์ของเรา แล้วแสดงแต่ละรอบพูดทันทีที่ปิด พร้อมยอดที่คิดไปแล้วข้าง ๆ ลองพูดใส่ดูแล้วสังเกตว่าขอบเขตรอบพูดตกตรงไหนในภาษาไทยของคุณเอง
ก่อนขึ้นใช้งานจริง#
- ทำงานกับฉบับจบเท่านั้น บทถอดระหว่างทางเป็นร่าง และชุดถัดไปจะมาแทนที่
- ส่ง
playbackคร่อมช่วงที่เสียงของเอเจนต์ดังอยู่ ถ้าไม่ส่ง เอเจนต์จะได้ยินเสียงตัวเองแล้วเปิดรอบพูดขึ้นมา - ทิ้งรอบพูดที่ตอบไปแล้ว หมายเลขรอบพูดคือลำดับเดียวที่ผู้เรียกต้องใช้
- ประกาศการเข้ารหัสให้ตรงกับไบต์ที่ส่งจริง อัตราสุ่มที่ผิดจะไปถึงโมเดลเป็นเสียงรบกวน
- เจอ
1001ให้เชื่อมต่อใหม่ การดีพลอยฝั่งเราควรมองไม่เห็นจากฝั่งคนที่อยู่บนสาย - ตั้ง
vocabularyสำหรับชื่อที่ผู้โทรพูดบ่อย ชื่อสินค้า ชื่อสถานที่ไทย และชื่อพนักงานคือสิ่งที่ฟิลด์นี้มีไว้รองรับ - รอให้ผู้โทรเงียบสักครู่ก่อนตอบ ภาษาไทยหยุดตรงรอยต่อของวลี และรอบพูดปิดกลางประโยคได้
ขั้นต่อไป#
- เปิดเครื่องมือถอดเสียง สลับไปโหมดสด แล้วลองพูดประโยคแบบที่ผู้โทรของคุณพูดจริง
- อ่านรอบพูดจบตรงไหน เพื่อดูว่าทำไมภาษาไทยทำให้ขอบเขตนี้ยาก และข้อความระหว่างทางมีไว้ทำอะไร
- อ่านหน้าถอดเสียงสด เพื่อดูว่าปริมาณงานระดับคอลเซ็นเตอร์คิดเป็นเท่าไร
- อ่านหน้าผลิตภัณฑ์ถอดเสียง เพื่อดูเซสชันนี้คู่กับการบันทึกของปลายทางแบบไฟล์
ตัวสัญญาฉบับเต็มอยู่ในเอกสาร