วางลิงก์สตรีม ไม่ใช่หน้าเว็บ ไฟล์เสียงจริงของสถานีอยู่ที่ที่อยู่ซึ่งลงท้ายด้วย .mp3, .aac หรือ .m3u8 และเมื่อการถอดเสียงแบบสดได้รับเสียงนั้นแล้ว ก็ไม่ต้องมีใครนั่งฟังอยู่
ห้องข่าวที่เฝ้าติดตามสถานีวิทยุสามแห่ง สตรีมโทรทัศน์สองช่อง และไลฟ์ YouTube อีกหลายรายการ มีปัญหาเรื่องกำลังคนก่อนปัญหาเรื่องการถอดเสียง ต้องมีคนคอยฟัง และต้องมีคนกดบันทึก การถอดเสียงแบบสดที่ใช้สตรีมเป็นแหล่งเสียงจะรับหน้าที่ทั้งสองอย่างนี้แทน เพียงใส่ที่อยู่ของสตรีม เซิร์ฟเวอร์จะเปิดสตรีม ถอดรหัส และถอดเสียงไปพร้อมกับที่ออกอากาศ จึงไม่ต้องมีใครนั่งอยู่หน้าโต๊ะเมื่อการแถลงข่าวเริ่มเร็วกว่ากำหนด ปรากฏว่าส่วนที่ยากจริง ๆ คือการหาที่อยู่นั้นให้เจอ
การถอดเสียงแบบสดสามารถรับเสียงจากสตรีมที่เซิร์ฟเวอร์ดึงมาเองได้ เช่น สถานีวิทยุอินเทอร์เน็ต เพลย์ลิสต์ HLS (.m3u8) แมนิเฟสต์ DASH (.mpd) หรือ YouTube live ใน แดชบอร์ด ทำได้โดยสร้างการถอดเสียงแบบสดใหม่ที่ Transcriptions → New → Live โดยตั้งแหล่งเป็นสตรีมแทนไมโครโฟน ที่อยู่จะถูกกำหนดตอนสร้างการถอดเสียงและไม่เปลี่ยนแปลงอีก ดังนั้นตั้งค่ามอนิเตอร์เพียงครั้งเดียว แล้วเริ่มเมื่อสถานีนั้นควรค่าแก่การบันทึก
ที่อยู่ต้องเป็นตัวสตรีมเอง ไม่ใช่หน้าเว็บที่เล่นสตรีมนั้น หน้าของสถานีเป็น HTML ส่วนเสียงที่เล่นมาจากที่อื่น โดยปกติเป็นเซิร์ฟเวอร์ Icecast หรือ Shoutcast และตัวเล่นในหน้าเว็บจะหาที่อยู่นั้นด้วย JavaScript หลังจากหน้าโหลดเสร็จ ให้มองหาลิงก์ชื่อ "Listen", "Direct stream" หรือ "Other players" บนเว็บไซต์ ลิงก์นั้นจะลงท้ายด้วย .mp3, .aac, .m3u, .m3u8 หรือ .pls ไฟล์ .pls หรือ .m3u ก็ไม่ใช่ไฟล์เสียงเช่นกัน มันเป็นไฟล์ข้อความสั้น ๆ ไม่กี่บรรทัด โดยแต่ละบรรทัดให้ที่อยู่ของสตรีมหนึ่งรายการ มีไว้เพื่อให้โปรแกรมเล่นบนเดสก์ท็อปรับลิงก์เดียวได้ และ VocalStack จะถอดเสียงสตรีมที่ไฟล์นั้นระบุ หากคุณวางหน้าเว็บแทน VocalStack จะร้องขอหน้านั้น เห็นว่าที่ตอบกลับมาเป็น HTML และแจ้งให้ทราบ สถานีแต่ละแห่งซ่อนสตรีมไว้ต่างกันเล็กน้อย ส่วนใหญ่ซ่อนไว้หลังปุ่มที่มีคำว่า "Listen" ซึ่งเป็นสิ่งเดียวบนหน้าที่ไม่ควรค่าแก่การคลิก
มีลิงก์สองประเภทที่ถูกปฏิเสธทันที ลิงก์ไปยังหน้าที่เล่นสื่อ เช่น Spotify, SoundCloud หรือ Twitch จะถูกปฏิเสธก่อนที่จะเชื่อมต่อใด ๆ สตรีมที่มีการป้องกันการคัดลอกก็ไม่รองรับเช่นกัน เพลย์ลิสต์หรือแมนิเฟสต์ที่ต้องใช้ใบอนุญาต DRM จะล้มเหลวพร้อมข้อความที่แจ้งเรื่องนี้ สตรีมบางแห่งยังปฏิเสธคำขอจากนอกประเทศของสถานี ดังนั้นที่อยู่ที่เล่นได้ในสำนักงานอาจเล่นไม่ได้จากเซิร์ฟเวอร์ที่อยู่ต่างประเทศ หากสตรีมเล่นได้ในเบราว์เซอร์แต่ใช้กับ VocalStack ไม่ได้ แสดงว่าสถานีกำลังปฏิเสธโปรแกรมเล่นอื่น ให้ขอที่อยู่จากสถานีที่แอปอื่นได้รับอนุญาตให้ใช้ สถานีส่วนใหญ่มีสตรีม MP3, AAC หรือ HLS ให้ เมื่อได้ที่อยู่ที่ถูกต้องแล้ว คำถามต่อไปคือสตรีมนั้นจะจบเมื่อไร
สตรีมสดไม่มีวันจบ จึงไม่ใช่ไฟล์ ความแตกต่างนี้สำคัญเป็นพิเศษสำหรับ YouTube ไลฟ์ YouTube ที่กำลังออกอากาศควรอยู่ในการถอดเสียงแบบสด และแดชบอร์ดจะติดตามไปจนกว่าจะออกอากาศจบ ไลฟ์ YouTube ที่กำหนดเวลาไว้แต่ยังไม่เริ่มจะแสดงเป็น Not live yet และสามารถบันทึกได้เมื่อออกอากาศแล้ว วิดีโอที่จบแล้วเป็นอีกอย่างหนึ่ง เพราะมีความยาว จึงถอดเสียงเป็นไฟล์ ให้วางลิงก์ลงใน Transcriptions → New
เพลย์ลิสต์เองบอกได้ว่าเป็นแบบใด และนี่คือวิธีที่โปรแกรมเล่นทั่วไปแยกความต่างได้ เพลย์ลิสต์ HLS ที่จบแล้วจะมีแท็ก #EXT-X-ENDLIST หรือ #EXT-X-PLAYLIST-TYPE:VOD ส่วนเพลย์ลิสต์สดจะไม่มีทั้งสองอย่างและจะค่อย ๆ ยาวขึ้น โปรแกรมเล่นจึงดึงใหม่ทุกสองสามวินาทีเพื่อหาเซกเมนต์ใหม่ แมนิเฟสต์ DASH จะประกาศ type="dynamic" ขณะที่กำลังออกอากาศ และ type="static" เมื่อกลายเป็นการบันทึกแล้ว สตรีม MP3 หรือ AAC จากเซิร์ฟเวอร์ Icecast ไม่มีความยาวเลย มันจะไม่หยุดไปเรื่อย ๆ
จากโค้ด GET /v1/transcriptions/probe?url= จะตรวจสอบเรื่องนี้ก่อนจัดเก็บอะไรก็ตาม ค่า kind ในการตอบกลับคือ live สำหรับไลฟ์ YouTube ที่กำลังออกอากาศหรือกำหนดเวลาไว้ สตรีม HTTP ที่ไม่มีวันจบ เพลย์ลิสต์ HLS ที่ไม่มีจุดจบ หรือแมนิเฟสต์ DASH แบบ dynamic ค่าจะเป็น file สำหรับทุกอย่างที่มีจุดจบ และ unknown เมื่อ probe ไม่สามารถบอกได้ เมื่อลิงก์เปิดไม่ได้ในฐานะสื่อ ok จะเป็น false และ problem จะเป็นประโยคที่แสดงให้ผู้ใช้เห็นได้ probe ไม่เก็บข้อมูลใด ๆ และจำกัดไว้ที่ 60 ครั้งต่อนาที
การถอดเสียงไฟล์ทำงานได้เร็วกว่าความเร็วในการเล่นเสียงหลายเท่า ดังนั้นรายการโทรทัศน์หนึ่งชั่วโมงที่จบแล้วจึงไม่ต้องใช้เวลาหนึ่งชั่วโมง การถอดเสียงสตรีมสดทำแบบเรียลไทม์ แต่ "เรียลไทม์" ก็ยังช้ากว่าการออกอากาศอยู่ และควรรู้ว่าช้าไปเท่าไร สตรีม Icecast ไปถึงโปรแกรมเล่นหลังไมโครโฟนไม่กี่วินาที ส่วน HLS และ DASH แบ่งเป็นเซกเมนต์ และโปรแกรมเล่นจะไม่เริ่มจนกว่าจะมีสองหรือสามเซกเมนต์ ซึ่งแต่ละเซกเมนต์ยาวราวหกวินาที ดังนั้นสตรีม HLS มักช้ากว่าการออกอากาศ 10 ถึง 30 วินาที ก่อนที่การถอดเสียงจะเพิ่มความหน่วงของตัวเองเข้าไป บรรทัดที่ดูเหมือนมาถึงช้ามักเป็นความหน่วงของสถานี ไม่ใช่ของตัวถอดเสียง สตรีมหนึ่งสายให้การบันทึกหนึ่งรายการ โต๊ะข่าวหนึ่งโต๊ะอาจรันหลายสาย และทั้งหมดจะไปอยู่ในที่เดียวกัน
การถอดเสียงแบบสดทุกรายการจะไปอยู่ในคลังการถอดเสียงข้างไฟล์ทุกไฟล์ การบันทึกแต่ละรายการจะเก็บคู่กับข้อความถอดเสียง และเมื่อคำพูดเป็นที่สุดแล้ว ชื่อเรื่องและบทสรุปจะถูกเขียนให้ในทุกภาษา ระบบตรวจจับภาษาที่พูดโดยอัตโนมัติ และผู้พูดอาจสลับภาษาได้ทุกเมื่อ หากคุณรู้ภาษาอยู่แล้ว การระบุภาษาจะช่วยให้คุณภาพการถอดเสียงดีขึ้น
คลังค้นหาได้ข้ามภาษา ค้นหาข้อความถอดเสียงทุกรายการ ไม่ว่าจะเป็นภาษาใด และรับผลลัพธ์ในภาษาของคุณเอง นักข่าวที่อ่านได้เฉพาะภาษาอังกฤษสามารถค้นหารายการข่าวเช้าของสถานีวิทยุโรมาเนียเพื่อหาชื่อรัฐมนตรีได้ และอ่านผลลัพธ์เป็นภาษาอังกฤษ โดยแต่ละรายการมาพร้อมการถอดเสียงต้นทางและเวลาที่พูดนั้น ชื่อของรัฐมนตรีจะสะกดต่างกันสามแบบในสามสถานี การค้นหาด้วยภาษาอังกฤษช่วยให้ไม่ต้องอ่านทั้งสามแบบ
การถอดเสียงหนึ่งรายการแปลได้สูงสุด 10 ภาษาในคราวเดียว ดังนั้นการบันทึกเดียวกันสามารถอ่านได้ในทุกภาษาที่โต๊ะข่าวใช้ ผลลัพธ์การค้นหาจะมีประโยชน์ก็ต่อเมื่อคุณสามารถอ้างอิงมันได้
ข้อความถอดเสียงไม่ใช่ก้อนข้อความยาวก้อนเดียว API ที่ GET /v1/recordings/{id}/transcript ส่งคืน sentences, segments พร้อมเวลาของแต่ละคำ และ speakers ทำให้วางคำพูดที่อ้างอิงได้ถึงระดับวินาทีเทียบกับการบันทึก แดชบอร์ดเล่นการบันทึกสดซ้ำตามที่มันมาถึงพร้อมเสียง ทำให้ฟังประโยคได้ก่อนนำไปอ้างอิง
ก่อนจะเชื่อถือการถอดเสียงของเสียงวิทยุ ไม่ว่าจากระบบใด ควรรู้สองเรื่อง ประการแรก การรู้จำเสียงพูดมักผิดพลาดกับชื่อเฉพาะ สถานที่ และตัวเลข ซึ่งเป็นสิ่งที่นักข่าวค้นหาพอดี ชื่อที่ตัวรู้จำไม่เคยเห็นจะถูกถอดเป็นคำธรรมดาที่ใกล้เคียงที่สุด และการค้นหาด้วยการสะกดที่ถูกต้องจะพลาดไป ให้ค้นหาคำเด่นที่พูดในลมหายใจเดียวกันแทน แล้วอ่านรอบ ๆ ผลลัพธ์ ประการที่สอง วิทยุไม่ได้มีแต่เสียงพูด เพลงประกอบ เพลงจิงเกิล และช่วงโฆษณาจะสร้างบรรทัดที่ดูคล้ายประโยคแต่ไม่ใช่ ตรวจสอบเสียงก่อนอ้างอิง
การระบุผู้พูดมีสามค่าตั้งต้น คือ ปิด เปิด หรือ When Needed ซึ่งจะแสดงป้ายชื่อเมื่อได้ยินผู้พูดคนที่สอง คุณตั้งชื่อผู้พูดในการบันทึกได้ (PUT /v1/recordings/{id}/speakers/{idx}) และเมื่อเสียงของผู้พูดถูกลงทะเบียนแล้ว การบันทึกในอนาคตจะจดจำผู้พูดนั้นด้วยชื่อ สำหรับสถานีที่พิธีกรกลับมาทุกเช้า ป้ายกำกับจะไม่เป็น "Speaker 2" อีกต่อไปหลังจากสัปดาห์แรก เมื่อตรวจสอบคำอ้างแล้ว ก็ถึงเวลาส่งออกไปนอกห้องข่าว
รูปแบบแต่ละอย่างในแท็บ Export ของการถอดเสียงมีหน้าที่ในห้องข่าว SRT ส่งให้บรรณาธิการวิดีโอ เพื่อให้คลิปจากสตรีมมีคำบรรยาย และ SRT ที่แปลแล้วก็มีคำบรรยายในภาษาอื่น Excel ส่งให้นักวิจัย หนึ่งแถวต่อหนึ่งประโยคพร้อมเวลา เพื่อกรองและบันทึกหมายเหตุ PDF ส่งให้บรรณาธิการที่อยากอ่านทั้งชั่วโมงระหว่างเดินทาง JSON ส่งให้ผู้ที่กำลังเขียนเครื่องมือของโต๊ะข่าวเอง ผ่าน API การส่งออกคือ GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf โดยมี lang= สำหรับฉบับแปล Download audio ให้การบันทึกเป็นไฟล์ MP3 สำหรับนำไปใช้ในแพ็กเกจข่าวนั้นเอง
การติดตามการถ่ายทอดสดเพื่อรายงานข่าวเป็นเรื่องปกติของวงการข่าว แต่การนำคลิปจากการถ่ายทอดนั้นกลับไปเผยแพร่เป็นอีกเรื่องหนึ่ง ซึ่งอยู่ภายใต้หลักการใช้โดยชอบธรรม (fair dealing หรือ fair use) ของประเทศที่คุณอยู่ และข้อกำหนดของสถานีเอง กฎปกติของโต๊ะข่าวเรื่องการอ้างอิงคู่แข่งจึงใช้กับเสียงของคู่แข่งด้วย ทุกสิ่งที่กล่าวมาข้างต้นทำได้ด้วยไม่กี่คลิกในแดชบอร์ด สำหรับโต๊ะข่าวที่มียี่สิบสถานี ควรเขียนสคริปต์จะดีกว่า
เส้นทางทั้งหมดอยู่ใน API ซึ่งรวมอยู่ในทุกแพ็กเกจและคิดในอัตราเดียวกับแดชบอร์ด การถอดเสียงแบบสดที่มีแหล่งเป็นสตรีมจะถูกสร้างขึ้นในสถานะรอ เริ่มทำงานด้วยการบันทึกครั้งแรก และควบคุมผ่าน HTTP เนื่องจากเซิร์ฟเวอร์เป็นผู้ดึงเสียงเอง การเริ่มการบันทึกจึงไม่ส่งคืนสตรีมให้คุณส่งเสียงไปให้ ฝั่งคุณไม่มีอะไรต้องส่งเสียง
API=$VOCALSTACK_API_ORIGIN # the origin shown in the API reference
AUTH="Authorization: Bearer $VOCALSTACK_API_KEY"
# A live transcription whose source the server pulls itself.
TX=$(jq -n '{name: "Morning show", source: {kind: "stream", url: "https://example.org/live.mp3"},
settings: {speakerLabels: "auto"}}' \
| curl -sSf "$API/v1/transcriptions/live" -H "$AUTH" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" -d @- | jq -r .id)
# Start recording: the server opens the stream now.
REC=$(curl -sSf -X POST "$API/v1/transcriptions/$TX/recordings" -H "$AUTH" \
-H "Content-Type: application/json" -d '{}' | jq -r .recording.id)
# Later: pause, then stop (a live recording must be paused before it is stopped).
curl -sSf -X POST "$API/v1/recordings/$REC/pause" -H "$AUTH"
curl -sSf -X POST "$API/v1/recordings/$REC/stop" -H "$AUTH" -H "Content-Type: application/json" -d '{}'
# Search everything that was said, in English.
curl -sSfG "$API/v1/search" -H "$AUTH" --data-urlencode "q=budget" --data-urlencode "lang=en"
Idempotency-Key ทำให้การสร้างที่ถูกลองซ้ำคืนการถอดเสียงแรกแทนที่จะสร้างอันที่สอง SDK ของ TypeScript และ Python ห่อการเรียกเดียวกันนี้ และดาวน์โหลดได้จาก Developers area ส่วน API reference มีทุกเส้นทางและ frames ของมัน
เอเจนต์ AI ทำงานกับคลังได้โดยไม่ต้องเขียนโค้ดเลย เซิร์ฟเวอร์ MCP ที่ /v1/mcp ให้เอเจนต์ชุดเครื่องมือ โดยมีสี่รายการที่สำคัญที่นี่ search_transcriptions ค้นหาสิ่งที่ถูกพูดในการถอดเสียงทั้งหมดของบัญชี ไม่ว่าจะเป็นภาษาใด และส่งคืนบรรทัดที่ตรงกัน พร้อมการถอดเสียงที่บรรทัดนั้นอยู่และเวลาที่พูด get_summary ส่งคืนบทสรุปของการบันทึก transcribe_url และ wait_for_transcription ถอดเสียงวิดีโอที่จบแล้วหรือลิงก์ของการบันทึก และรอผลลัพธ์ การเริ่มมอนิเตอร์สตรีมสดยังคงทำผ่านแดชบอร์ดหรือ API ข้างต้น การตั้งค่าสำหรับ Claude Code, Cursor หรือไคลเอนต์ Streamable HTTP ใดก็ได้อยู่ภายใต้ Developers → Connect an AI agent และบทความเรื่อง MCPจะพาทำตามทีละขั้น ส่วนค่าใช้จ่ายของสคริปต์นี้คือคำถามสุดท้าย
การถอดเสียงแบบสดคิด $0.60 ต่อชั่วโมงของเสียง เรียกเก็บเป็นรายวินาที ($0.01 ต่อนาที) โดยมีขั้นต่ำ 5 นาทีต่อการถอดเสียงหนึ่งรายการ การถอดเสียงสดมีราคาสูงกว่าไฟล์ เพราะถอดเสียงขณะที่เกิดขึ้น และคิดไปตลอดช่วงที่ทำงาน ไฟล์คิด $0.20 ต่อชั่วโมง ($0.0033 ต่อนาที; ไฟล์ 30 นาทีมีราคา $0.10) อัตรานี้เท่ากันในทุกแพ็กเกจและผ่าน API และการแปล บทสรุป การตั้งชื่อผู้พูด การถ่ายทอดสด และการแชร์ไม่เพิ่มในบิลเลยแม้แต่น้อย
สถานีที่ติดตามวันละแปดชั่วโมง ห้าวันต่อสัปดาห์ คือ 40 ชั่วโมงสด: $24 ต่อสัปดาห์ ไม่ว่าโต๊ะข่าวจะอ่านด้วยกี่ภาษาก็ตาม
ขีดจำกัดที่สำคัญสำหรับการติดตามจะแตกต่างกันตามแพ็กเกจ แต่ละข้อเรียงตาม จ่ายตามการใช้งาน, Premium, Enterprise:
บัญชีใหม่เริ่มด้วยเครดิตสมัครใช้งาน $5 โดยไม่ต้องใช้บัตร ซึ่งมากกว่าแปดชั่วโมงของการติดตามสดเพื่อทดลองใช้ ตารางฉบับเต็มอยู่ในหน้าราคา