การโทรและเสียง
การโทรและช่องเสียงส่งเสียง วิดีโอ และการแชร์หน้าจอตรงไปยังเซิร์ฟเวอร์บนพอร์ตของมันเอง หน้านี้ครอบคลุมด้านเครือข่าย การตั้งค่าที่ต้องตรวจสอบหลังติดตั้ง และการถอดเสียงด้วยโมเดล speech-to-text ที่คุณรันเอง
การทำงานของระบบการโทร
การโทรให้บริการโดยแอป Calls (id com.mattermost.calls) ซึ่งติดตั้งและเปิดใช้งานไว้โดยค่าเริ่มต้น ช่องเสียง (แอป Voice Channels, ภาพ antimatter-next) เป็นห้องโทรถาวรที่สร้างบนพื้นฐานของ Calls: ต้องเปิดใช้งาน Calls และใช้การตั้งค่า พอร์ต และเซิร์ฟเวอร์เดียวกัน
แอป Calls รันเซิร์ฟเวอร์สื่อภายใน Antimatter แอปเว็บ แอปเดสก์ท็อป และแอปมือถือเชื่อมต่อกับมันด้วย WebRTC:
- สัญญาณ (signalling) จะผ่านการเชื่อมต่อเว็บปกติ (พร็อกซี HTTPS ของคุณ)
- ส่วนสื่อ (เสียง วิดีโอ การแชร์หน้าจอ) จะไม่ผ่าน: มันจะส่งตรงไปยังเซิร์ฟเวอร์บนพอร์ตการโทร 8443 UDP และ TCP โดยค่าเริ่มต้น
การตั้งค่าอยู่ใน คอนโซลระบบ › ปลั๊กอิน › การโทร แต่ละรายการสามารถตั้งค่าได้ด้วยตัวแปรสภาพแวดล้อม AM_CALLS_ บนบริการ antimatter ซึ่งจะมีผลเหนือกว่าการตั้งค่าในคอนโซลระบบและล็อกค่าไว้ที่นั่น ชื่อ MM_CALLS_ แบบเดิมก็ใช้ได้เช่นกัน
ตรวจสอบสิ่งเหล่านี้หลังติดตั้ง
- เปิดพอร์ตการโทร อนุญาต 8443/udp และ 8443/tcp ในไฟร์วอลล์ของเซิร์ฟเวอร์และของผู้ให้บริการคลาวด์ของคุณ
- ตรวจสอบโหมดทดสอบ โหมดทดสอบ (
DefaultEnabled) จะปิดอยู่โดยค่าเริ่มต้น เพื่อให้ทุกคนสามารถเริ่มการโทรได้ เปิด เปิด ใน คอนโซลระบบ › ปลั๊กอิน › การโทร เพื่ออนุญาตให้เฉพาะผู้ดูแลระบบเท่านั้นที่เริ่มการโทรในช่องได้ ขณะคุณตรวจสอบว่าการท่อดำเนินการได้ปกติ จากนั้นจึงปิดอีกครั้ง ตัวแปรคือAM_CALLS_DEFAULT_ENABLED:trueหมายความว่าโหมดทดสอบปิดอยู่ เซิร์ฟเวอร์ที่ย้ายมาจาก Mattermost จะยังคงเลือกค่าที่บันทึกไว้ในคอนฟิกูเรชัน - ตัดสินใจเกี่ยวกับวิดีโอ เปิดใช้งานวิดีโอ (
EnableVideo,AM_CALLS_ENABLE_VIDEO) จะเปิดอยู่โดยค่าเริ่มต้น: ผู้คนสามารถเปิดกล้องได้ทุกที่ที่การท่อดำเนินการได้ ทั้งในข้อความส่วนตัว ข้อความกลุ่ม และในช่อง ในช่องเสียง แอปช่องเสียงจะตัดสินใจผ่าน อนุญาตวิดีโอในช่องเสียง ปิดใช้งานนี้แล้วไม่มีใครสามารถเปิดกล้องได้ แม้แต่ในช่องเสียง - อยู่หลัง NAT, ตั้งค่าที่อยู่สาธารณะ (หัวข้อถัดไป)
ที่ที่การท่อดำเนินการได้
ชุมชนทุกชุมชนมีประเภท ที่ทำงาน หรือ ชุมชน (ดู ประเภทของชุมชนใหม่) ช่องที่ผู้ดูแลระบบไม่ได้เปิดหรือปิดการโทรไว้ จะปฏิบัติตามประเภทของชุมชน:
- ใน ที่ทำงาน ช่องจะปฏิบัติตามค่าเริ่มต้นของเซิร์ฟเวอร์: การท่อดำเนินการได้สำหรับทุกคน ขณะที่โหมดทดสอบปิดอยู่
- ใน ชุมชน การโทรในช่องจะปิดอยู่: ผู้คนจะพูดคุยในช่องเสียงแทน ผู้ดูแลระบบของช่องและชุมชนยังคงสามารถเปิดการโทรในช่องได้
การตั้งค่าของช่องเองจะชนะเสมอ ข้อความส่วนตัวและข้อความกลุ่มไม่ได้อยู่ในชุมชน: การโทรในที่เหล่านั้นจะเปิดสำหรับทุกคน ขณะที่โหมดทดสอบปิดอยู่ การเปลี่ยนแปลงประเภทของชุมชนจะส่งผลต่อการโทรภายใน 30 วินาที
พอร์ต, NAT และ STUN
| การตั้งค่า | ตัวแปร | ค่าเริ่มต้น |
|---|---|---|
| RTC Server Port (UDP) | AM_CALLS_UDP_SERVER_PORT | 8443 |
| RTC Server Port (TCP) | AM_CALLS_TCP_SERVER_PORT | 8443 |
| RTC Server Address (UDP), (TCP) | AM_CALLS_UDP_SERVER_ADDRESS, AM_CALLS_TCP_SERVER_ADDRESS | ว่าง: ทุกที่อยู่ |
| ICE Host Override | AM_CALLS_ICE_HOST_OVERRIDE | ว่าง: ค้นพบผ่าน STUN |
| ICE Host Port Override | AM_CALLS_ICE_HOST_PORT_OVERRIDE | ว่าง: พอร์ตของเซิร์ฟเวอร์ |
| การตั้งค่า ICE Servers | AM_CALLS_ICE_SERVERS_CONFIGS | [{"urls":["stun:stun.cloudflare.com:3478"]}] |
| (ทดลอง) เปิดใช้งานการรองรับ IPv6 | (คอนโซลระบบ) | ปิด |
พอร์ตต้องอยู่ระหว่าง 80 ถึง 49151. ในไฟล์ compose ของไซต์ ให้เปลี่ยน CALLS_PORT ใน .env: ตัวแปรนี้จะตั้งค่าทั้งสองตัวแปรและเผยแพร่พอร์ต โดยใช้หมายเลขเดียวกันทั้งบนโฮสต์และในคอนเทนเนอร์ ฝั่งไคลเอนต์จะลองใช้ UDP ก่อน และเปลี่ยนไปใช้ TCP บนพอร์ตเดียวกันหากไม่สำเร็จ
ที่อยู่ปลายทางที่ไคลเอนต์จะส่งมีเดียไป
เซิร์ฟเวอร์จะแจ้งให้แต่ละไคลเอนต์ทราบถึงที่อยู่ที่ต้องส่งมีเดียไป (เรียกว่า "host candidate") โดยค่าเริ่มต้น เซิร์ฟเวอร์จะค้นหาที่อยู่สาธารณะของตัวเองโดยส่งคำขอไปยังเซิร์ฟเวอร์ STUN ซึ่งเป็นบริการสาธารณะที่ตอบกลับด้วยที่อยู่และพอร์ตที่คำขอมาจาก ค่าเริ่มต้นคือเซิร์ฟเวอร์ STUN สาธารณะของ Cloudflare stun:stun.cloudflare.com:3478 เซิร์ฟเวอร์ไม่ใช่ผู้ใช้เพียงคนเดียว: ไคลเอนต์ทุกตัวที่เข้าร่วมการโทรก็จะส่งคำขอไปยังเซิร์ฟเวอร์ STUN นี้เพื่อค้นหาที่อยู่สาธารณะของตัวเองด้วย เซิร์ฟเวอร์ STUN จะเห็นเฉพาะที่อยู่ IP และพอร์ตเท่านั้น จะไม่มีการเห็นเสียง วิดีโอ หรือข้อความจากการโทร
เซิร์ฟเวอร์ที่ยังคงมีเซิร์ฟเวอร์ STUN ของ Mattermost (stun.global.calls.mattermost.com) บันทึกไว้ใน การตั้งค่า ICE Servers เช่น หลังจากย้ายมาจาก Mattermost จะใช้ของ Cloudflare แทน การตั้งค่าที่บันทึกไว้เดิมจะไม่ถูกเปลี่ยนแปลง
ตั้งค่าที่อยู่ด้วยตนเองเมื่อ:
- เซิร์ฟเวอร์อยู่หลัง NAT หรือมีที่อยู่สาธารณะหลายตัว: ตั้งค่า ICE Host Override เป็นที่อยู่ IP สาธารณะ (หรือชื่อโดเมนที่ชี้ไปยังที่อยู่ IP นั้น);
- NAT แมปพอร์ตสาธารณะที่แตกต่างจาก 8443: ให้ตั้งค่า ICE Host Port Override เป็นพอร์ตสาธารณะนั้นด้วย;
- เซิร์ฟเวอร์ไม่สามารถเข้าถึงอินเทอร์เน็ตได้ หรือคุณไม่ต้องการให้เซิร์ฟเวอร์และไคลเอนต์ติดต่อกับเซิร์ฟเวอร์ STUN ภายนอก: ตั้งค่า ICE Host Override และล้างรายการ STUN ด้วย
AM_CALLS_ICE_SERVERS_CONFIGS=[]เมื่อตั้งค่า ICE Host Override แล้ว เซิร์ฟเวอร์จะหยุดส่งคำขอไปยังเซิร์ฟเวอร์ STUN เพื่อค้นหาที่อยู่ของตัวเอง; การล้างรายการจะหยุดไม่ให้ไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ STUN
services:
antimatter:
environment:
AM_CALLS_ICE_HOST_OVERRIDE: 203.0.113.10
AM_CALLS_ICE_SERVERS_CONFIGS: "[]"
หากต้องการใช้ STUN โดยไม่พึ่งพาบุคคลที่สาม ให้ติดตั้งเซิร์ฟเวอร์ STUN ของคุณเอง (เซิร์ฟเวอร์ TURN เช่น coturn ก็ตอบคำขอ STUN ได้ด้วย) และเพิ่มรายการไว้ใน การตั้งค่า ICE Servers แทน ดังตัวอย่าง TURN ด้านล่าง
บนเครือข่ายภายใน (LAN) ให้ใช้ที่อยู่ LAN ของเซิร์ฟเวอร์ เริ่มเซิร์ฟเวอร์ใหม่หลังการเปลี่ยนพอร์ต ที่อยู่ หรือการตั้งค่า ICE หรือปิดและเปิดแอป Calls ใหม่: เซิร์ฟเวอร์มีเดียจะถูกตั้งค่าเมื่อแอปเริ่มทำงาน
TURN สำหรับไฟร์วอลล์ที่เข้มงวด
เครือข่ายบางเครือข่ายจะบล็อกทั้ง UDP และการเชื่อมต่อขาออกไปยังพอร์ต TCP ที่ไม่ปกติ ผู้ใช้บนเครือข่ายเหล่านี้ต้องการเซิร์ฟเวอร์ TURN ซึ่งจะทำหน้าที่เป็นสื่อกลางส่งข้อมูลสื่อผ่านพอร์ตที่พวกเขาสามารถเข้าถึงได้ (มักจะเป็นพอร์ต 443) Antimatter ไม่ได้รวมเซิร์ฟเวอร์ TURN ไว้ด้วย คุณต้องดำเนินการเซิร์ฟเวอร์ TURN เช่น coturn และเพิ่มลงใน ICE Servers Configurations ซึ่งเป็นรายการ JSON:
[
{"urls": ["stun:turn.example.com:3478"]},
{"urls": ["turn:turn.example.com:3478?transport=udp", "turns:turn.example.com:443?transport=tcp"]}
]
- เมื่อกำหนด shared secret (ใช้
use-auth-secretของ coturn) ให้ใส่ secret เดียวกันนั้นใน TURN Static Auth Secret (AM_CALLS_TURN_STATIC_AUTH_SECRET): เซิร์ฟเวอร์จะสร้าง credential สั้น ๆ ให้แต่ละ client ซึ่งจะมีอายุตาม TURN Credentials Expiration (minutes) (ค่าเริ่มต้นคือ 240 นาที) - เมื่อใช้ข้อมูลรับรองแบบคงที่ ให้เพิ่ม
"username"และ"credential"ในรายการ TURN แทน - Server Side TURN (ปิดไว้โดยค่าเริ่มต้น) ยังใช้เซิร์ฟเวอร์ TURN สำหรับเชื่อมต่อที่เซิร์ฟเวอร์เป็นผู้เริ่ม
การตั้งค่าการโทรอื่นๆ
| การตั้งค่า | ตัวแปร | ค่าเริ่มต้น | สิ่งที่ทำ |
|---|---|---|---|
| จำนวนผู้เข้าร่วมการโทรสูงสุด | AM_CALLS_MAX_CALL_PARTICIPANTS | 0 (ไม่จำกัด) | จำนวนคนสูงสุดที่สามารถอยู่ในสายการโทรเดียวกันได้ |
| อนุญาตให้แชร์หน้าจอ | (คอนโซลระบบ) | เปิด | อนุญาตให้ผู้เข้าร่วมแชร์หน้าจอของตนเอง |
| เปิดใช้งานเสียงเรียกเข้าสำหรับการโทร | AM_CALLS_ENABLE_RINGING | เปิด | จะส่งเสียงเรียกเข้าไปยังผู้เข้าร่วมในข้อความส่วนตัวหรือข้อความกลุ่มเมื่อมีการเริ่มการโทรในนั้น |
| เปิดใช้งาน simulcast สำหรับการแชร์หน้าจอ (ทดลองใช้) | (คอนโซลระบบ) | ปิด | ส่งการแชร์หน้าจอในหลายระดับคุณภาพ |
| เปิดใช้งาน AV1 codec สำหรับการแชร์หน้าจอ (ทดลองใช้) | (คอนโซลระบบ) | ปิด | จะถูกละเลยเมื่อ simulcast เปิดอยู่ |
แอป Voice Channels มีสองการตั้งค่า ใน คอนโซลระบบ › ปลั๊กอิน › Voice Channels: เข้าร่วมเมื่อเปิดช่องเสียง (เปิดอยู่โดยค่าเริ่มต้น) และ อนุญาตวิดีโอในช่องเสียง (เปิดอยู่โดยค่าเริ่มต้น แต่ดูวิดีโอข้างบน) ผู้ดูแลชุมชนจะเปลี่ยนช่องให้เป็นช่องเสียงในการตั้งค่าของช่องนั้น
AM_CALLS_DISABLE=true ช่องเสียงจะหยุดทำงานไปด้วยเซิร์ฟเวอร์ขนาดใหญ่: rtcd ภายนอก
โดยค่าเริ่มต้น เซิร์ฟเวอร์ Antimatter หนึ่งเครื่องจะรับสื่อการโทรทั้งหมด สำหรับกรณีที่มีการโทรพร้อมกันหลายสาย หรือเพื่อแยกสื่อออกจากเซิร์ฟเวอร์แชท แอป Calls สามารถส่งสื่อไปยัง rtcd ซึ่งเป็นเซิร์ฟเวอร์สื่อแยกต่างหาก (โอเพนซอร์สของ Mattermost rtcd เวอร์ชัน 0.17 หรือใหม่กว่า) ตั้งค่า RTCD service URL (AM_CALLS_RTCD_SERVICE_URL) ตัวอย่างเช่น https://rtcd.example.com: การโทรทั้งหมดจะผ่าน rtcd และไคลเอนต์จะส่งสื่อไปยังพอร์ตของ rtcd แทนที่จะเป็นพอร์ตของ Antimatter สามารถระบุข้อมูลรับรองได้ผ่าน AM_CALLS_RTCD_CLIENT_ID และ AM_CALLS_RTCD_AUTH_KEY; หากไม่ระบุ แอปจะลงทะเบียนตัวเองกับ rtcd โดยไม่จำเป็นต้องมีใบอนุญาต แอป Calls จะแสดงคำเตือนแก่ผู้ดูแลระบบ แนะนำให้ใช้ rtcd เมื่อเซิร์ฟเวอร์มักมีผู้เข้าร่วมการโทรพร้อมกันมากกว่า 50 คน
การถอดเสียงและคำบรรยายสด
Antimatter สามารถถอดเสียงจากการโทรได้โดยใช้โมเดลแปลงเสียงเป็นข้อความที่คุณรันด้วยตัวเอง และแสดงคำบรรยายสดขณะผู้คนกำลังพูด Antimatter ใช้เซิร์ฟเวอร์ใดก็ได้ที่ให้บริการปลายทาง /v1/audio/transcriptions ที่เข้ากันได้กับ OpenAI เช่น เซิร์ฟเวอร์ Whisper ในเครือข่ายของคุณ ไม่จำเป็นต้องมีบริการเพิ่มเติมจาก Antimatter
หลักการทำงาน
- ผู้เป็นโฮสต์ของการโทรจะเริ่มการถอดเสียงด้วย ถอดเสียงการโทร ในแผงควบคุมการโทร ป้าย กำลังถอดเสียง จะแจ้งให้ทุกคนทราบ
- แอปของผู้เข้าร่วมแต่ละคนจะรับฟังไมโครโฟนของตัวเอง ตัดเสียงพูดออกเป็นชิ้นสั้นๆ (สูงสุด 12 วินาที และจะไม่ทำขณะปิดเสียง) และส่งไปยัง Antimatter ซึ่งจะส่งต่อไปยังเซิร์ฟเวอร์แปลงเสียงเป็นข้อความของคุณ
- เมื่อเปิดคำบรรยายสดไว้ ข้อความของแต่ละชิ้นจะแสดงให้ผู้เข้าร่วมเห็นเป็นคำบรรยายทันที
- เมื่อการถอดเสียงหยุดหรือการโทรสิ้นสุดลง บอทของ Calls จะโพสต์บันทึกการถอดเสียงเป็นไฟล์ข้อความและไฟล์คำบรรยาย WebVTT ในเธรดของการโทร (ในช่องเสียง จะโพสต์ในช่อง)
- เมื่อเปิด Summarize transcriptions ไว้ เอเจนต์เริ่มต้นของแอป Agents จะโพสต์สรุปในเธรดด้วย (ดู AI)

การตั้งค่า
ตั้งค่าเหล่านี้ในบริการ antimatter:
services:
antimatter:
environment:
AM_CALLS_ENABLE_TRANSCRIPTIONS: "true"
AM_CALLS_TRANSCRIBE_API: openai
AM_CALLS_TRANSCRIBE_API_OPEN_AIURL: http://stt.internal:8000/v1
AM_CALLS_TRANSCRIBE_API_OPEN_AI_MODEL: whisper-1
AM_CALLS_TRANSCRIBE_API_OPEN_AI_KEY: ""
AM_CALLS_ENABLE_LIVE_CAPTIONS: "true"
AM_CALLS_LIVE_CAPTIONS_LANGUAGE: en
| การตั้งค่า | ตัวแปร | สิ่งที่ต้องกรอก |
|---|---|---|
| เปิดใช้งานการถอดเสียงจากการโทร (Beta) | AM_CALLS_ENABLE_TRANSCRIPTIONS | true |
| Call transcriber API | AM_CALLS_TRANSCRIBE_API | openai (แสดงเป็น "OpenAI-compatible API (no job service)") |
| Speech-to-text API URL | AM_CALLS_TRANSCRIBE_API_OPEN_AIURL | URL พื้นฐานของ API จนถึง /v1 |
| Speech-to-text model | AM_CALLS_TRANSCRIBE_API_OPEN_AI_MODEL | ชื่อโมเดลตามที่ API รู้จัก ตัวอย่างเช่น whisper-1 จำเป็นต้องระบุ |
| Speech-to-text API key | AM_CALLS_TRANSCRIBE_API_OPEN_AI_KEY | ส่งเป็น bearer token ทิ้งว่างไว้หาก API ไม่ต้องการ |
| เปิดใช้งานคำบรรยายสด (Beta) | AM_CALLS_ENABLE_LIVE_CAPTIONS | ค่า true สำหรับคำบรรยายระหว่างโทร |
| ภาษาของคำบรรยายสด | AM_CALLS_LIVE_CAPTIONS_LANGUAGE | ภาษาที่พูด เป็นรหัสสองตัวอักษร (ค่าเริ่มต้นคือ en) ซึ่งจะถูกส่งไปยัง API speech-to-text เพื่อถอดเสียงด้วย ดังนั้นจึงควรตั้งค่านี้แม้ไม่ได้เปิดคำบรรยายก็ตาม |
| สรุปการถอดเสียง | AM_CALLS_SUMMARIZE_TRANSCRIPTIONS | ค่า true สำหรับสรุปด้วย AI หลังการโทรเสร็จสิ้น |
openai เพราะการเริ่มบันทึกจะพยายามเริ่มงานถอดเสียงของ job-service และล้มเหลวเสียงของทุกคนที่พูดขณะเปิดการถอดเสียงจะถูกส่งไปยังเซิร์ฟเวอร์ speech-to-text ที่คุณตั้งค่าไว้ และบทถอดเสียงจะถูกโพสต์ในที่ที่ทุกคนในช่องสามารถอ่านได้ แจ้งให้ผู้ใช้ทราบ และหากการโทรเป็นความลับ ให้เก็บเซิร์ฟเวอร์นั้นไว้บนเครือข่ายของคุณเอง
การบันทึก
การบันทึกการโทร (และการถอดเสียงด้วย whisper.cpp หรือ Azure transcribers ที่ติดตั้งมาให้) จะทำงานในคอนเทนเนอร์แยกกัน ซึ่งถูกเริ่มโดย job service ชื่อ calls-offloader ซึ่งเป็น open-source ของ Mattermost และคุณต้องติดตั้งเองไว้ข้างเคียงกับ Antimatter การตั้งค่ามีดังนี้: เปิดใช้งานการบันทึกการโทร (AM_CALLS_ENABLE_RECORDINGS, ปิดไว้โดยค่าเริ่มต้น), URL ของ job service (AM_CALLS_JOB_SERVICE_URL), ระยะเวลาสูงสุดของการบันทึกการโทร (60 นาทีโดยค่าเริ่มต้น, ช่วง 15 ถึง 180 นาที) และ คุณภาพการบันทึกการโทร (ต่ำ, ปานกลาง หรือ สูง; ปานกลางโดยค่าเริ่มต้น) ไม่จำเป็นต้องมี license เมื่อเปิดใช้งานการบันทึกแล้ว ผู้เป็น host ของการโทรจะเริ่มและหยุดการบันทึกด้วย บันทึกการโทร ในแผงควบคุมการโทร; ทุกคนในการโทรจะเห็นว่ามีการบันทึกอยู่ และเมื่อหยุดบันทึก การบันทึกนั้นจะถูกโพสต์ในเธรดของการโทรนั้น การโทรในช่องเสียงไม่มีเธรด จึงไม่สามารถบันทึกได้ หากต้องการเฉพาะการถอดเสียงและคำบรรยาย การตั้งค่า speech-to-text ด้านบนจะง่ายกว่า: ไม่ต้องใช้ job service