wavekat
보이스 문서 블로그
← 블로그로 돌아가기

WaveKat Voice가 자체 SIP 엔진 위에서 돌아가는 이유

· Eason Guo
#음성AI #엔지니어링 #오픈소스 #SIP

WaveKat Voice——모든 통화를 녹음하고 받아 적는 Mac·Linux용 소프트폰——가 이제 우리가 처음부터 직접 만든 SIP 엔진 위에서 돌아갑니다. wavekat-sip은 전화 신호와 오디오 전송을 스스로 처리하는 오픈소스 Rust 크레이트로, 그 아래에 제3자 SIP 스택이 전혀 없습니다. 당신이 걸거나 받는 모든 통화, 모든 보류와 호전환이 이제 우리가 처음부터 끝까지 소유한 코드를 거칩니다.

이것은 우리가 늘 되돌아가는 그 목표를 향한 또 한 걸음입니다. 모든 작은 비즈니스에 큰 기업의 목소리를 주는 것 말입니다. 큰 전화 시스템이 믿음직한 이유는, 그것을 운영하는 사람들이 모든 계층을 직접 통제하기 때문입니다. SIP 엔진을 소유한다는 것은 당신의 통화가 실제로 지나가는 그 계층을 우리가 통제한다는 뜻입니다 — 더 안정적으로 만들어야 할 때도, 새 기능을 내보내야 할 때도, 중간을 가로막는 블랙박스가 없습니다.

SIP가 무엇이고, 왜 가장 어려운 부분인가

SIP(세션 개시 프로토콜)는 통화를 설정하기 위해 전화기끼리 나누는 언어입니다 — 당신의 회선을 통신사에 등록하고, 상대편을 울리고, 어떤 오디오 코덱을 쓸지 협상하고, 통화가 끝나면 깔끔하게 끊습니다. 통화가 연결된 뒤 실제 오디오를 실어 나르는 것은 RTP입니다. SIP를 미묘하게라도 잘못 다루면 통화가 끊기고, 한쪽만 소리가 들리고, 회선이 소리 없이 더 이상 전화를 받지 못하게 됩니다. 화려하지 않지만 한 치의 오차도 허용하지 않는, 소프트폰의 다른 모든 것이 그 위에 얹혀 있는 핵심입니다.

얼마 전까지 WaveKat Voice는 통화를 제3자 SIP 라이브러리를 통해 구동했습니다. 덕분에 빠르게 전화를 걸 수 있었고, 초기에는 그것이 옳은 선택이었습니다. 하지만 빌려 온 스택은 통화를 어떻게 모델링할지, 오류를 어떻게 드러낼지, 어떤 기능에 아예 손이 닿을 수 있는지를 대신 결정합니다 — 그래서 호전환이나 HD 오디오 같은 것을 만들기 시작한 순간, 우리는 우리 생각대로가 아니라 그 스택의 형태에 맞춰 우회하며 일하고 있었습니다.

우리가 직접 만든 이유

우리는 WaveKat Voice의 SIP 엔진을 wavekat-sip이라는 이름으로 처음부터 다시 만들었습니다. 이유는 아주 단순하게 세 가지입니다.

이 엔진이 담당하는 것

wavekat-sip은 연결 수준의 일만 맡고 오디오 장치와 통화 조율 계층에는 손대지 않아, 작고 임베드하기 쉬운 상태를 유지합니다.

영역하는 일
등록당신의 회선을 통신사에 등록(다이제스트 인증)하고, 걸려 오는 전화가 언제나 당신에게 닿도록 계속 살려 둡니다.
통화발신 통화를 걸고 수신 통화를 받으며, 당신이 받기 전에 제대로 된 링잉 신호로 발신자에게 알립니다.
통화 중 제어보류와 재개(SIP re-INVITE, RFC 3264), 블라인드·협의 호전환(SIP REFER, RFC 3515), 그리고 전화 메뉴용 DTMF(키패드 톤).
음질광대역 “HD” 음성을 위해 Opus 코덱을 협상하고, 상대편이 지원하지 않으면 자동으로 표준 G.711로 되돌립니다.
안정성RFC 4028 세션 타이머로 긴 통화가 도중에 네트워크에 의해 소리 없이 끊기는 것을 막습니다.

오픈소스입니다 — WaveKat의 나머지처럼

wavekat-sip은 비공개 내부 부품이 아닙니다. 우리의 음성 활동 검출발화 순서 검출 크레이트와 똑같이, Apache-2.0 라이선스로 crates.io에 공개되어 있고 문서는 docs.rs에 있습니다. Rust로 소프트폰, 음성 봇, 통화 녹음 브리지를 만드는 누구든 WaveKat Voice가 돌아가는 바로 그 엔진을 쓸 수 있습니다. 열린 방식으로 만드는 것이 우리의 일하는 방식입니다 — 제품 아래에 깔린 도구들은 해자가 아니라, 당신이 들여다보고 다시 쓰라고 있는 것입니다.

솔직히 말하면 아직 이릅니다. 이 크레이트는 활발히 개발 중이고 API도 버전마다 아직 바뀝니다. 하지만 데모가 아니라 진짜 제품 뒤에서 돌아가는 진짜 엔진입니다.

자주 묻는 질문

wavekat-sip이 무엇인가요?

wavekat-sip은 SIP 신호와 RTP 오디오 전송을 담당하는 WaveKat 자체 오픈소스 Rust 크레이트입니다. WaveKat Voice가 걸거나 받는 모든 통화 뒤에 있는 엔진이며, 그 아래에 제3자 SIP 스택이 전혀 없습니다.

wavekat-sip은 오픈소스인가요? 제 프로젝트에 써도 되나요?

네. wavekat-sip은 Apache-2.0 라이선스로 crates.io에 공개되어 있고, 문서는 docs.rs에 있습니다. Rust로 소프트폰, 음성 봇, 통화 녹음 브리지를 만드는 누구든 WaveKat Voice가 돌아가는 바로 그 엔진을 쓸 수 있습니다.

WaveKat Voice는 HD 오디오를 지원하나요?

네. WaveKat Voice는 광대역 “HD” 음성을 위해 Opus 코덱을 협상하고, 상대편이 Opus를 지원하지 않으면 자동으로 표준 G.711로 되돌립니다.

WaveKat Voice는 아무 SIP 통신사에서나 작동하나요?

네. wavekat-sip은 다이제스트 인증을 쓰는 표준 SIP 등록을 처리하므로, SIP 표준을 따르는 어떤 통신사나 PBX에서도 작동합니다 — 이미 가지고 있는 계정 그대로, 통신사별 설정 없이요.

wavekat-sip은 프로덕션에 쓸 수 있나요?

진짜 제품 뒤에서 돌아가는 진짜 엔진이라 이미 매일 쓰이고 있습니다 — 하지만 아직 이릅니다. 이 크레이트는 활발히 개발 중이고 API도 버전마다 아직 바뀌므로, 지금 이것을 기반으로 만든다면 버전을 고정하세요.

이것이 당신의 통화에 의미하는 것

대부분의 경우 WaveKat Voice의 통화는 별로 달라진 느낌이 없을 것입니다 — 바로 그게 핵심입니다. 마땅히 그래야 하는 대로 연결되고 들립니다. 달라지는 것은 무대 뒤입니다. WaveKat Voice를 진짜 안내 데스크처럼 느끼게 하는 기능들 — 보류, 통화 중 대기, 호전환, HD 오디오 — 이 이제 의존 라이브러리가 아니라 우리 일정에 맞춰 나오고, 무언가를 더 안정적으로 해야 할 때 그것을 돌리는 코드로 곧장 갈 수 있습니다.

WaveKat Voice는 Mac과 Linux에서 공개 베타 기간 동안 무료입니다. 이미 쓰고 있는 전화 통신사를 연결하면, 다음 통화는 우리가 직접 만들어 — 그리고 거저 내놓은 — 엔진 위에서 돌아갑니다.

← 블로그로 돌아가기