ทำคำบรรยายภาษาไทยจากเวลาระดับคำ
ประโยคภาษาไทยไม่มีช่องว่างให้ตัดคำบรรยาย เวลาระดับคำให้จุดตัดแก่คิวอย่างไร กฎที่ไฟล์คำบรรยายภาษาไทยต้องการ และรูปแบบการเขียนที่ควรขอ
· อ่าน 1 นาที
คำบรรยายคือบทถอดที่ถูกตัดเป็นชิ้นให้พอดีจอในวินาทีที่พูด ในภาษาอังกฤษการตัดเป็นเรื่องง่าย คิวจบที่ช่องว่าง และเครื่องมือที่ไม่รู้จักภาษาเลยยังผลิตบรรทัดที่อ่านได้ ภาษาไทยเขียนทั้งวลีเป็นตัวอักษรต่อกันหนึ่งสาย เครื่องมือที่ตัดตามจำนวนตัวอักษรตัดกลางคำ และผู้ชมอ่านครึ่งคำในบรรทัดหนึ่ง แล้วอีกครึ่งในอีกสองวินาทีถัดมา
บทความนี้แสดงวิธีสร้างคิวภาษาไทยจากเวลาระดับคำที่ Paxa STT Lite ส่งกลับ แต่ละช่วงคือหนึ่งคำไทยเต็มคำพร้อมเวลาเริ่มและจบ ซึ่งคือชุดของตำแหน่งที่ตัดคิวได้พอดี กฎสำหรับเปลี่ยนช่วงเป็นคิวเขียนได้ในหนึ่งหน้า และผลลัพธ์คือไฟล์คำบรรยายที่เครื่องเล่นทุกตัวอ่านได้
ช่วงคืออะไร#
ตั้ง timestamps เป็น "word" แล้วคำตอบจะมีอาร์เรย์ words อยู่ข้างบทถอด แต่ละรายการคือหนึ่งคำพร้อมเวลาเริ่มและจบเป็นวินาที สำหรับภาษาไทย คำถูกตัดให้ก่อนส่งออก ช่วงจึงครอบคลุมทั้งคำเสมอ ช่วงทั้งหมดต่อกลับเป็นบทถอดได้โดยไม่ขาดหาย
AUDIO=$(base64 < meeting.m4a | tr -d '\n')
curl -X POST https://api.paxalabs.com/v1/stt \
--max-time 300 \
-H "Authorization: Bearer $PAXA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"audio\": \"$AUDIO\", \"model\": \"paxa-stt-lite-v1-preview\", \"timestamps\": \"word\"}"{
"text": "สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน พันสองร้อยห้าสิบ บาทครบกำหนดวันที่ สิบห้า สิงหาคมนี้ชำระผ่านแอปได้ตลอด ยี่สิบสี่ ชั่วโมงค่ะ",
"words": [
{
"text": "สวัสดี",
"start": 0.12,
"end": 0.52
},
{
"text": "ค่ะ",
"start": 0.6,
"end": 0.739
},
{
"text": "คุณ",
"start": 1.64,
"end": 1.8
},
{
"text": "สมชาย",
"start": 1.84,
"end": 2.24
},
{
"text": "ยอด",
"start": 2.4,
"end": 2.56
},
{
"text": "ชำระ",
"start": 2.56,
"end": 2.839
},
{
"text": "ของ",
"start": 2.84,
"end": 2.96
},
{
"text": "ท่าน",
"start": 2.96,
"end": 3.14
},
{
"text": "จำนวน",
"start": 3.16,
"end": 3.44
},
{
"text": "พันสองร้อยห้าสิบ",
"start": 3.52,
"end": 4.56
},
{
"text": "บาท",
"start": 4.68,
"end": 4.84
},
{
"text": "ครบ",
"start": 5,
"end": 5.2
},
{
"text": "กำหนด",
"start": 5.24,
"end": 5.48
},
{
"text": "วัน",
"start": 5.52,
"end": 5.639
},
{
"text": "ที่",
"start": 5.64,
"end": 5.719
},
{
"text": "สิบห้า",
"start": 5.84,
"end": 6.08
},
{
"text": "สิงหาคม",
"start": 6.68,
"end": 7.16
},
{
"text": "นี้",
"start": 7.2,
"end": 7.34
},
{
"text": "ชำระ",
"start": 7.8,
"end": 8.08
},
{
"text": "ผ่าน",
"start": 8.12,
"end": 8.28
},
{
"text": "แอป",
"start": 8.28,
"end": 8.44
},
{
"text": "ได้",
"start": 8.48,
"end": 8.62
},
{
"text": "ตลอด",
"start": 8.64,
"end": 8.88
},
{
"text": "ยี่สิบสี่",
"start": 9.04,
"end": 9.439
},
{
"text": "ชั่วโมง",
"start": 9.56,
"end": 9.88
},
{
"text": "ค่ะ",
"start": 9.92,
"end": 10.06
}
],
"usage": {
"seconds": 10.25,
"credits": 1.43
}
}ตัดช่วงเป็นคิว#
ไล่ช่วงตามลำดับและรวบเข้าคิวจนกว่าจะถึงหนึ่งในสามขีดจำกัด คิวจึงจบที่เวลาจบของช่วงสุดท้าย และคิวถัดไปเริ่มที่เวลาเริ่มของช่วงถัดไป
- ความยาว บรรทัดภาษาไทยอ่านสบายที่ราวสามสิบห้าตัวอักษร และหนึ่งคิวมีได้ไม่เกินสองบรรทัด นับตัวอักษรของคำที่รวบไว้ และตัดก่อนคำที่จะดันเกินขีดจำกัด
- ระยะเวลา คิวที่ค้างบนจอนานกว่าราวหกวินาทีอ่านแล้วเหมือนค้าง ตัดเมื่อคำถัดไปจะดันคิวเกินขีดจำกัด แม้บรรทัดยังมีที่
- ช่วงหยุด ช่องว่างระหว่างเวลาจบของช่วงหนึ่ง กับเวลาเริ่มของช่วงถัดไป ที่นานกว่าราวครึ่งวินาที คือลมหายใจหรือจบประโยค ตัดตรงนั้น และคิวจบเมื่อผู้พูดจบ
คิวที่จบที่ช่วงหยุดอ่านดีกว่าคิวที่จบที่จำนวนนับ การยอมให้เกินขีดจำกัดความยาวเล็กน้อยเพื่อไปถึงช่วงหยุดจึงคุ้ม เมื่อคิวมีสองบรรทัด ตัดบรรทัดที่ช่องว่างกว้างที่สุดระหว่างช่วงภายในคิว ซึ่งมักเป็นขอบวลี
words
วันนี้ 0.00 0.38
เรา 0.38 0.55
จะ 0.55 0.70
คุย 0.70 0.98
เรื่อง 0.98 1.30
งบประมาณ 1.30 1.92
ปีหน้า 1.92 2.40
กัน 2.40 2.61
นะครับ 2.61 3.05
cues
1 00:00:00,000 --> 00:00:01,300
วันนี้เราจะคุยเรื่อง
2 00:00:01,300 --> 00:00:03,050
งบประมาณปีหน้ากันนะครับรูปแบบการเขียนที่ควรขอ#
คำบรรยายต้องการแบบพูด ซึ่งเป็นค่าเริ่มต้น ผู้ชมได้ยินสองพันสามร้อยห้าสิบบาทและอ่านคำเดียวกัน ตัวเลขบนจอขณะที่ผู้พูดออกเสียงห้าพยางค์อ่านแล้วขัดกัน และคิวที่สร้างจากแบบเขียนยังเสียขอบช่วงภายในตัวเลข เพราะตัวเลขมาเป็นโทเค็นเดียว
ใช้สไตล์คำต่อคำด้วยเหตุผลเดียวกัน ผู้ชมที่ได้ยินการพูดติดขัดแล้วอ่านประโยคที่เรียบเรียงแล้วจะสังเกตได้ สไตล์เรียบเรียงมีไว้สำหรับบทถอดที่อ่านลำพัง ห่างจากเสียง
เขียนไฟล์#
SRT ใส่หมายเลขให้แต่ละคิว เขียนเวลาเริ่มและจบเป็นชั่วโมง นาที วินาที และมิลลิวินาที โดยมีจุลภาคหน้ามิลลิวินาที แล้วตามด้วยข้อความ WebVTT เหมือนกันแต่ใช้จุดหน้ามิลลิวินาทีและมีบรรทัดหัวไฟล์ ทั้งสองเป็นข้อความธรรมดา และทั้งสองเก็บภาษาไทยเป็น UTF-8 โดยไม่ต้องตั้งค่าเพิ่ม เขียนวินาทีจากช่วงด้วยทศนิยมสามตำแหน่ง แล้วไฟล์ก็เสร็จ
สำหรับแทร็กแปล ส่งข้อความของคิวไปยัง API แปลภาษาทีละคิวต่อหนึ่ง segment พร้อม id ที่สะท้อนกลับ เวลาอยู่กับ id วิดีโอภาษาไทยได้แทร็กอังกฤษที่มีจุดตัดเดียวกัน และสองแทร็กยังตรงกัน
ขั้นต่อไป#
- อ่านคู่มือการถอดเสียง สำหรับเวลาระดับคำข้างช่วงจริงของโมเดลจากไฟล์เดียว
- อ่านหน้าไทม์สแตมป์ สำหรับรูปแบบช่วงที่ใช้ร่วมกับการสังเคราะห์เสียง ซึ่งกฎเดียวกันสร้างคำบรรยายอ่านตาม
- อ่านบทความเรื่องตัวเลข ว่าทำไมคำบรรยายจึงเก็บแบบพูด
- อ่านกรณีใช้งานคำบรรยายวิดีโอ สำหรับไปป์ไลน์คำบรรยายตั้งแต่ต้นจนจบ และค่าใช้จ่ายของวิดีโอหนึ่งซีซัน