Paxa Labs
บล็อก

Paxa STT Lite Realtime ถอดเสียงภาษาไทยทีละรอบพูด ตั้งแต่ยังพูดไม่จบ

Paxa STT Lite Realtime ถอดเสียงภาษาไทยผ่าน WebSocket เดียวที่เปิดค้างไว้ หาจุดจบของแต่ละรอบพูดเอง และคิดค่าบริการตามเสียงที่รับเข้ามา

· Paxa Labs · อ่าน 12 นาที

วอยซ์เอเจนต์ภาษาไทยตอบไม่ได้จนกว่าจะรู้ว่าผู้โทรพูดจบแล้ว และภาษาไทยให้เบาะแสน้อยมาก การเขียนไม่มีเครื่องหมายจบประโยค ช่องว่างตกอยู่ระหว่างวลี และจังหวะที่ผู้พูดหยุดก็ตกกลางประโยคพอ ๆ กับตกตรงจุดจบ ก่อนวันที่ 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 วินาที ขอบเขตรอบพูด บทถอด และยอดที่ตัด คือสิ่งที่ซ็อกเก็ตรายงานกลับมา นำมาแสดงโดยไม่แก้ไข

รอบพูดวินาทีเครดิตบทถอด
10 ถึง 2.70.57สวัสดีค่ะขอบคุณที่ติดต่อบริษัทของเรา
22.7 ถึง 81.1กด 1 เพื่อติดต่อฝ่ายขายกด 2 ฝ่ายบริการลูกค้าหรือกด 0 เพื่อติดต่อเจ้าหน้าที่ค่ะ
39.11 ถึง 18.052.1สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน 1,250 บาทครบกำหนดวันที่ 15 สิงหาคมนี้ชำระผ่านแอปได้ตลอด 24 ชั่วโมงค่ะ
419.16 ถึง 22.91.01ขณะนี้อยู่นอกเวลาทำการเราเปิดให้บริการวันจันทร์ถึงศุกร์
522.9 ถึง 23.710.16เวลา
623.92 ถึง 26.440.579 โมงเช้าถึง 6 โมงเย็น
726.44 ถึง 28.550.44ฝากข้อความหลังเสียงสัญญาณได้เลยค่ะ

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

รอบพูดทุกรอบรวมกันคิดไป 5.95 เครดิต การเชื่อมต่อยังฟังต่ออีก 1.4 วินาทีหลังรอบสุดท้ายปิดลง ซึ่งบวกเพิ่มอีก 0.29 ยอดรวมที่ซ็อกเก็ตรายงานคือ 6.24 เครดิต

อะไรวิ่งอยู่บนซ็อกเก็ต#

มีสามเฟรมที่ส่งขึ้นไป และเจ็ดอีเวนต์ที่ส่งกลับลงมา เสียงเป็นไบนารี ส่วนที่เหลือเป็น JSON ทั้งหมดอยู่บนการเชื่อมต่อเดียว

รอบพูดที่ 1 บนสาย
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" เพิ่มอาร์เรย์ช่วงเวลาให้บทถอดฉบับจบทุกชุด หนึ่งรายการต่อหนึ่งคำบนนาฬิกาของการเชื่อมต่อ คำภาษาไทยถูกตัดคำให้แล้ว
styleverbatim เขียนคำเอ่อคำอ้าและการพูดผิดแล้วพูดใหม่ตามที่พูดจริง ส่วน clean ตัดออกและอ่านลื่นกว่า ค่าเริ่มต้นคือ verbatim ซึ่งตามเสียงจริงได้ใกล้ที่สุด
conventionspoken เขียนตัวเลขตามที่ผู้โทรพูด ส่วน written เขียนเป็นตัวเลขพร้อมหน่วยและไม้ยมก ซึ่งเป็นรูปที่ช่องกรอกการจองหรือการชำระเงินอ่านได้
vocabularyคำศัพท์ที่บทสนทนาน่าจะมี ได้สูงสุด 50 คำ คำละไม่เกิน 50 ตัวอักษร สะกดแบบที่ต้องการให้ปรากฏ

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

เสียงที่ซ็อกเก็ตรับ#

การเข้ารหัสอัตราสุ่มมาจากไหน
pcm_s16le16 หรือ 48 kHzPCM 16 บิตแบบมีเครื่องหมาย เรียงไบต์ท้ายก่อน โมโน มาจากไมโครโฟนในเบราว์เซอร์ผ่าน audio worklet หรือจากอุปกรณ์บันทึกที่อัตราสุ่มของตัวเอง
mulaw8 kHzG.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 LitePaxa STT Lite Realtime
ช่องทางPOST /v1/sttWS /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();
  }
};
Server events
{"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 สำหรับชื่อที่ผู้โทรพูดบ่อย ชื่อสินค้า ชื่อสถานที่ไทย และชื่อพนักงานคือสิ่งที่ฟิลด์นี้มีไว้รองรับ
  • รอให้ผู้โทรเงียบสักครู่ก่อนตอบ ภาษาไทยหยุดตรงรอยต่อของวลี และรอบพูดปิดกลางประโยคได้

ขั้นต่อไป#

ตัวสัญญาฉบับเต็มอยู่ในเอกสาร

อ่านต่อ

โพสต์อื่นในบล็อก