この記事の最終更新日: 2026年5月27日

ブラウザ上で音声通話やビデオ通話を実装したいとき、よく登場する技術が WebRTC です。
WebRTCを使えば、ブラウザ同士でリアルタイムに音声・映像をやり取りできます。しかし、実際に通話機能を作ろうとすると、すぐに次のような疑問が出てきます。
「相手をどう呼び出すのか?」
「着信・発信・切断はどう管理するのか?」
「既存の電話システムやPBXと連携できるのか?」
「SIPサーバーとはどうつなぐのか?」
このような課題を解決するために使われるJavaScriptライブラリの一つが SIP.js です。
この記事では、SIP.jsとは何か、WebRTCとの関係、できること・できないこと、基本的な仕組み、導入時に知っておきたいポイントを初心者向けに解説します。
SIP.jsとは?
SIP.js は、ブラウザやWebアプリケーション上で SIPを使った音声通話・ビデオ通話・メッセージング を実装するためのJavaScriptライブラリです。
公式サイトでは、SIP.jsはWebRTCとSIPシグナリングを扱うためのJavaScriptライブラリとして紹介されており、ブラウザ上でリアルタイム通信を扱いやすくすることを目的としています。(sipjs.com)
簡単に言うと、SIP.jsは次のようなライブラリです。
| 項目 | 内容 |
|---|---|
| ライブラリ名 | SIP.js |
| 主な用途 | ブラウザでSIP通話を実装する |
| 関連技術 | SIP、WebRTC、WebSocket |
| 実装できる機能 | 音声通話、ビデオ通話、着信、発信、保留、転送、DTMFなど |
| 主な利用シーン | Web電話、ブラウザ内線、コールセンター画面、CRMのクリック通話など |
SIP.jsのGitHubリポジトリでは、WebRTCによる音声・ビデオセッション、SIP over WebSocket、インスタントメッセージ、プレゼンス、保留、転送、DTMF、画面共有などが主な機能として挙げられています。(GitHub)
そもそもSIPとは?
SIPとは、Session Initiation Protocol の略です。
日本語で言うと、通信セッションを開始・変更・終了するためのプロトコルです。特に、IP電話やVoIPの世界でよく使われます。
たとえば電話では、次のような処理が必要です。
- 相手を呼び出す
- 着信を通知する
- 通話を開始する
- 通話を保留する
- 通話を転送する
- 通話を終了する
SIPは、こうした「通話の制御」を担当します。
一方で、実際の音声や映像データそのものを運ぶ役割は、SIPだけで完結するわけではありません。ブラウザ通話の場合、音声・映像の送受信には主にWebRTCが使われます。
つまり、ざっくり分けると次のようになります。
| 役割 | 担当する技術 |
|---|---|
| 発信・着信・切断などの制御 | SIP |
| 音声・映像のリアルタイム通信 | WebRTC |
| ブラウザとSIPサーバーの接続 | WebSocket |
| これらをJavaScriptで扱いやすくする | SIP.js |
SIP.jsとWebRTCの関係
SIP.jsは、WebRTCそのものを置き換えるライブラリではありません。
WebRTCは、ブラウザで音声・映像・データ通信を行うための仕組みです。ただし、WebRTCだけでは「誰に電話をかけるのか」「着信をどう通知するのか」「通話状態をどう管理するのか」といった部分は自分で設計する必要があります。
そこでSIP.jsを使うと、SIPの仕組みを使って、発信・着信・応答・切断などの通話制御を扱いやすくできます。
SIP.jsの公式ドキュメントでも、SIP.jsはWebRTC APIをJavaScriptから利用し、SIP通信セッションをセットアップしやすくするものとして説明されています。(sipjs.com)
イメージとしては、次のような関係です。
ブラウザ
├─ SIP.js
│ ├─ SIPシグナリングを制御
│ ├─ 発信・着信・切断を管理
│ └─ WebRTCのセッション確立を補助
│
└─ WebRTC
├─ マイク音声
├─ カメラ映像
└─ リアルタイムメディア通信
SIP.jsでできること
SIP.jsを使うと、Webアプリに次のような機能を組み込めます。
1. ブラウザから電話をかける
SIP.jsを使うと、Web画面上のボタンからSIP宛先に発信できます。
たとえば、CRMや管理画面に「電話する」ボタンを置き、クリックすると顧客に発信する、といった実装が可能です。
公式のSimpleUserガイドでも、SIPサーバーへ接続したあと、.call(destination) を呼び出して通話を開始する流れが紹介されています。(sipjs.com)
2. ブラウザで着信を受ける
SIP.jsでは、着信時の処理も実装できます。
たとえば、コールセンターのオペレーター画面で着信ポップアップを表示し、「応答」「拒否」ボタンを出すようなUIを作れます。
SIP.jsのReceive a Callガイドでは、SIP INVITEを受け取ったときに onInvite のようなdelegateを通じて着信処理を行い、accept() で応答、reject() で拒否する例が説明されています。(sipjs.com)
3. 音声通話・ビデオ通話を実装する
SIP.jsは、WebRTCを利用して音声・映像のセッションを扱えます。
音声だけの通話も、カメラを使ったビデオ通話も実装できます。GitHubの説明でも、SIP.jsはWebRTCによるリアルタイムの音声・ビデオセッション作成に対応しているとされています。(GitHub)
4. 通話の保留・転送・DTMFを扱う
SIP.jsは、単純な発信・着信だけでなく、電話システムらしい機能にも対応しています。
たとえば、以下のような機能です。
- 通話保留
- 通話転送
- DTMF送信
- 早期メディア
- インスタントメッセージ
- プレゼンス
- 画面共有
GitHubリポジトリでも、hold、transfer、DTMF、screen sharingなどがサポート対象として挙げられています。(GitHub)
SIP.jsでできないこと・注意点
SIP.jsは便利なライブラリですが、これだけで電話システムが完成するわけではありません。
特に重要なのは、SIP.jsはブラウザ側のライブラリであり、SIPサーバーやPBXそのものではない という点です。
SIPサーバーは別途必要
SIP.jsを使って本格的に通話を行うには、通常、SIPサーバーが必要です。
たとえば、以下のようなサーバーやサービスと組み合わせます。
- Asterisk
- FreeSWITCH
- Kamailio
- OpenSIPS
- OnSIP
- その他のSIP/PBXサービス
SIP.jsのGitHubリポジトリでも、AsteriskやFreeSWITCHなどの標準準拠サーバーとの互換性が説明されています。(GitHub)
WebSocket対応が必要
ブラウザから通常のSIP UDP/TCP通信を直接扱うことはできません。
そのため、ブラウザでSIPを使う場合は、一般的に SIP over WebSocket を利用します。
SIP.jsも、Webアプリケーション内でSIP over WebSocketを利用することを主な機能として説明しています。(GitHub)
つまり、SIP.jsを導入する場合は、接続先のSIPサーバー側もWebSocket接続に対応している必要があります。
NAT・STUN・TURNの考慮が必要
WebRTC通話では、ネットワーク環境によって音声が届かない、片方向だけ聞こえる、接続できないといった問題が起きることがあります。
特に、社内ネットワーク、モバイル回線、VPN、NAT配下などでは注意が必要です。
実運用では、STUN/TURNサーバーの設定や、SIPサーバー側のWebRTC対応、TLS証明書、Firewall設定なども含めて設計する必要があります。
SIP.jsの基本的な仕組み
SIP.jsを使ったブラウザ通話の流れは、ざっくり次のようになります。
1. ブラウザでSIP.jsを読み込む
2. SIPサーバーへWebSocketで接続する
3. SIPアカウントでREGISTERする
4. 発信・着信をSIPメッセージで制御する
5. WebRTCで音声・映像の通信経路を確立する
6. 通話中の状態をJavaScriptで管理する
7. BYEやrejectなどで通話を終了する
SIP.jsのAPIドキュメントでは、UserAgentの作成、着信処理、接続、登録、発信、転送などの流れが基本的な手順として紹介されています。(GitHub)
SIP.jsの主要な概念
SIP.jsを理解するうえで、まず押さえたい概念は次のとおりです。
UserAgent
UserAgent は、SIP.jsにおける中心的な存在です。
SIPのユーザーエージェントとして、SIPサーバーへの接続、登録、発信、着信処理などを扱います。
Webアプリ側では、このUserAgentを作成して、SIP通信の起点にします。
Registerer
Registerer は、SIPサーバーに対して登録処理を行うためのものです。
電話でいうと、「このユーザーは現在オンラインで、この宛先で着信できます」とSIPサーバーへ知らせる役割です。
公式のUser Agentガイドでも、着信やメッセージを受け取るためにはUserAgentを作成したあとRegistererを作り、登録する流れが説明されています。(sipjs.com)
Inviter
Inviter は、こちらから相手に発信するときに使われます。
SIPの世界では、通話開始のリクエストとして INVITE が使われます。Inviterは、その発信側のセッションを扱うためのクラスです。
Invitation
Invitation は、相手から着信が来たときのセッションを表します。
着信を受けたら、アプリ側で accept() するか、reject() するかを制御できます。
Session
Session は、通話セッションそのものを表します。
通話中、接続中、切断中など、状態の変化を監視しながら、画面表示やメディア処理を制御します。
SIP.jsのAttach Mediaガイドでは、セッションが Established になったタイミングでリモートメディアを再生するような流れが説明されています。(sipjs.com)
SessionDescriptionHandler
SessionDescriptionHandler は、WebRTCのメディア処理に関わる部分です。
SIP.jsのドキュメントでは、SessionDescriptionHandlerはAPIが必要とするインターフェースの実装であり、1つの音声トラックまたは1つのビデオトラックを扱えると説明されています。(GitHub)
簡単な実装イメージ
以下は、SIP.jsでブラウザから音声通話を行う場合のイメージです。
実際にはSIPサーバーのURL、SIPアカウント、認証情報、音声要素などを環境に合わせて設定します。
import { Web } from "sip.js";
const server = "wss://sip.example.com";
const simpleUser = new Web.SimpleUser(server, {
aor: "sip:alice@example.com",
media: {
constraints: {
audio: true,
video: false,
},
remote: {
audio: document.getElementById("remoteAudio") as HTMLAudioElement,
},
},
});
await simpleUser.connect();
await simpleUser.register();
await simpleUser.call("sip:bob@example.com");
この例では、ブラウザからSIPサーバーにWebSocketで接続し、SIPユーザーとして登録し、相手に発信しています。
SIP.jsには、初心者向けに扱いやすい SimpleUser というインターフェースも用意されています。公式ドキュメントでは、SimpleUserはWebページで音声・ビデオ通話を行うための簡略化されたインターフェースとして説明されています。(GitHub)
SIP.jsを使うメリット
既存のSIP/PBX資産と連携しやすい
SIP.jsの大きなメリットは、既存のSIPサーバーやPBXと連携しやすいことです。
すでにAsteriskやFreeSWITCHなどで電話基盤を持っている場合、ブラウザ側のソフトフォンとしてSIP.jsを使う選択肢があります。
ブラウザだけで通話UIを作れる
専用アプリをインストールしなくても、Webブラウザ上で通話画面を作れます。
たとえば、次のようなUIをWebアプリに組み込めます。
- 顧客詳細画面の「発信」ボタン
- オペレーター用の着信ポップアップ
- 通話中ステータス表示
- 保留・転送ボタン
- 通話履歴との連携
Webシステムの画面と電話機能を一体化できるのが大きな利点です。
JavaScript/TypeScriptで実装できる
SIP.jsはJavaScriptライブラリであり、GitHub上でもTypeScriptで書かれていることが説明されています。(GitHub)
そのため、React、Vue、Angularなどのフロントエンドアプリケーションにも組み込みやすいです。
SIP.jsを使うデメリット・難しい点
SIPとWebRTCの両方の知識が必要
SIP.jsは便利ですが、トラブルシューティングにはSIPとWebRTCの両方の知識が必要になります。
たとえば、次のような問題が起きることがあります。
- REGISTERに失敗する
- 発信できるが着信できない
- 通話はつながるが音が出ない
- 片方向だけ音声が聞こえる
- NAT環境で接続できない
- 証明書やWSS接続で失敗する
- SDPやICE candidateの問題が起きる
単にJavaScriptを書けば終わり、というよりは、ネットワーク・SIPサーバー・ブラウザAPIを含めた理解が必要です。
サーバー側のWebRTC対応が必要
SIP.jsを使う場合、SIPサーバー側がWebRTCクライアントとの接続に対応している必要があります。
特に、以下のような設定が重要になります。
- WSS対応
- TLS証明書
- DTLS-SRTP
- ICE/STUN/TURN
- コーデック設定
- NAT越え設定
- SIPヘッダーやContactの扱い
ブラウザ側だけを実装しても、サーバー側の設定が合っていないと通話は安定しません。
UIは自分で作る必要がある
SIP.jsは通話制御のためのライブラリであり、完成済みの電話UIを提供するものではありません。
そのため、以下のようなUIは自分で実装する必要があります。
- 発信ボタン
- 応答ボタン
- 拒否ボタン
- ミュートボタン
- 保留ボタン
- 転送UI
- 通話中タイマー
- エラー表示
- デバイス選択
- 着信音
自由度が高い反面、プロダクトとして使いやすい通話画面を作るには、UI/UX設計も重要になります。
SIP.jsが向いているケース
SIP.jsは、次のようなケースに向いています。
| ケース | 向いている理由 |
|---|---|
| Web電話を作りたい | ブラウザ上でSIP通話を実装できる |
| 既存PBXと連携したい | SIPベースのシステムと相性がよい |
| CRMから発信したい | Web画面にクリック通話を組み込める |
| コールセンター画面を作りたい | 着信・発信・保留・転送UIを作れる |
| 専用アプリを配布したくない | ブラウザだけで利用できる |
| WebRTCとSIPをつなぎたい | SIP over WebSocketとWebRTCを扱える |
特に、すでにSIP基盤がある会社や、ブラウザ上に業務用ソフトフォンを組み込みたい場合に有力な選択肢になります。
SIP.jsが向いていないケース
一方で、次のようなケースでは別の選択肢も検討した方がよいです。
| ケース | 理由 |
|---|---|
| SIPサーバーを運用したくない | サーバー側の構築・保守が必要になる |
| とにかく簡単にビデオ通話だけ作りたい | Twilio、Daily、AgoraなどのSDKの方が簡単な場合がある |
| 電話網連携が不要 | 独自シグナリングのWebRTCで十分な場合がある |
| SIPの知識がまったくない | トラブル対応が難しくなりやすい |
| モバイルアプリ中心 | ブラウザ前提の設計とは別の考慮が必要 |
SIP.jsは強力ですが、SIPやPBXとの連携が前提になる場面でこそ価値を発揮しやすいライブラリです。
SIP.jsとJsSIPの違い
SIP.jsとよく比較されるライブラリに JsSIP があります。
どちらも、JavaScriptでSIP over WebSocketやWebRTCを扱うためのライブラリです。
ざっくり比較すると、次のようなイメージです。
| 項目 | SIP.js | JsSIP |
|---|---|---|
| 用途 | WebRTC + SIP通話の実装 | WebRTC + SIP通話の実装 |
| 主な言語 | TypeScriptベース | JavaScript |
| API設計 | SimpleUserやUserAgentなどを提供 | UA中心のAPI |
| 利用シーン | Webソフトフォン、業務通話、PBX連携 | Webソフトフォン、SIPクライアント |
| どちらを選ぶべきか | チームの経験、既存サーバー、サンプル、保守性で判断 | 同左 |
どちらが絶対に優れているというより、利用するSIPサーバー、既存コード、メンテナンス状況、チームの理解度で選ぶのが現実的です。
SIP.jsを選ぶ場合は、公式ドキュメントやサンプルが自分たちの実装方針に合っているかを確認するとよいでしょう。
実務で導入する前に確認したいこと
SIP.jsを導入する前に、最低限以下の点を確認しておくとよいです。
1. SIPサーバーはWebSocket/WSSに対応しているか
ブラウザから接続するため、SIP over WebSocketが必要になります。
本番運用では、基本的に暗号化されたWSS接続を使うことになります。
2. WebRTC用の設定ができているか
AsteriskやFreeSWITCHなどを使う場合、通常のSIP電話機とは異なり、WebRTC向けの設定が必要になります。
証明書、DTLS、SRTP、ICE、コーデックなどを確認しましょう。
3. STUN/TURNを用意するか
社内ネットワークだけでなく、外部ネットワークやモバイル回線から使う場合は、STUN/TURNサーバーの設計が重要です。
TURNがないと、環境によっては通話が成立しないことがあります。
4. 通話UIの状態管理をどうするか
通話には多くの状態があります。
- 未接続
- 接続中
- 登録済み
- 発信中
- 着信中
- 通話中
- 保留中
- 切断中
- エラー
Reactなどで実装する場合は、これらの状態をコンポーネントや状態管理ライブラリでどう扱うかを設計しておくと、後から破綻しにくくなります。
5. エラー時のUXをどうするか
通話機能は、失敗したときの表示が非常に重要です。
たとえば、次のようなケースです。
- マイク許可が拒否された
- SIPサーバーに接続できない
- 認証に失敗した
- 相手が応答しない
- ネットワークが切れた
- 音声デバイスが見つからない
単にコンソールエラーを出すだけではなく、ユーザーが次に何をすればよいか分かるメッセージを出すことが大切です。
まとめ
SIP.jsは、WebRTCを使ったブラウザ通話をSIPベースで実装できるJavaScriptライブラリです。
特に、既存のSIPサーバーやPBXと連携しながら、Webアプリ上に電話機能を組み込みたい場合に有力な選択肢になります。
ただし、SIP.jsだけで通話システムが完結するわけではありません。実運用では、SIPサーバー、WebSocket、WebRTC、STUN/TURN、証明書、NAT、ブラウザ権限、UI状態管理など、多くの要素を考慮する必要があります。
最後にポイントをまとめます。
- SIP.jsはブラウザでSIP通話を実装するためのJavaScriptライブラリ
- WebRTCで音声・映像を扱い、SIPで発信・着信・切断などを制御する
- SIP over WebSocketにより、ブラウザからSIPサーバーへ接続する
- SimpleUserを使うと、比較的シンプルに発信・着信を実装できる
- 本格運用ではSIPサーバー側のWebRTC対応やNAT対策が重要
- CRM、コールセンター、Webソフトフォン、内線システムなどと相性がよい
Webアプリに「電話機能」を組み込みたい場合、SIP.jsは検討する価値のあるライブラリです。特に、既存の電話基盤とWebアプリをつなぎたいケースでは、非常に実用的な選択肢になるでしょう。

大阪のエンジニアが書いているブログ。



コメント