SlideShare una empresa de Scribd logo
1 de 49
SkyWayで作るボイスチャット
今日話す内容
1.SkyWayとは
2.ボイスチャットのしくみ
3.デモについて解説
4.おまけ
1.SkyWayとは
SkyWayとは
NTT Communicationsが提供している
PeerJS互換のプラットフォーム
WebRTCを使うときに必要となる
Peer ServerやSTUN/TURN Serverを
無料で提供してくれるので、誰でも簡単に
P2Pボイスチャットが作れちゃう!
用語解説
WebRTCとは
Web上でP2Pでリアルタイムに動画や音声の
交換を行うためのAPI
ブラウザでP2P方式の何かを作る場合に
避けては通れない技術
Peer Serverとは
PeerJSで使用するユーザーID変換などを
全部やってくれるシグナリングサーバ
STUN Serverとは
クライアントのIPアドレスやポート番号、
NATが間に入っているかどうかを判別して、
NATの種類やNATによって割り当てられた
ローカルポート番号などを取得してくれる
TURN Serverとは
STUN ServerがNATやファイアーウォールに
よりP2Pでの接続が無理と判断した場合に、
クライアントとクライアントとの間に入って
通信を中継してくれる
なぜ今頃SkyWayなのか
• 使えるブラウザが増えてきた
AndroidブラウザやChrome Firefox Operaなどで
使えるようになってきた!
• 情報が貯まってきた
当時はまだ新しい技術だったWebRTCもある程度
認知されてきた!
(検索すればほしい情報が見つかる!)
2.ボイスチャットのしくみ
ボイスチャットの方式
• クライアント・サーバ方式
サーバを立ててそこにアクセスする方式
(TeamSpeak3やVentriloなんかがこれ)
• P2P方式 ←今回はこれ
サーバを持たずにクライアント間で通信する方式
(Skypeがこれ)
クライアント・サーバ方式
1台のサーバに複数人で接続する方式
ユーザーはサーバに音声データを送信、
サーバは受け取った音声データを処理して
他のユーザーに送信する
サーバ
ユーザーA ユーザーB
音声データ 音声データ
P2P方式(Skypeの場合)
マスタ
ノード
ユーザーA ユーザーB
音声データ
Skype
サーバ
ユーザー情報ユーザー情報
ユーザー情報
サーバを経由せずユーザー間で音声データを
送受信し合う方式
サーバはユーザーの接続情報を管理し、
マスタノードによって通話する相手の情報
(IPやポート番号)など交換させている
P2P方式(Skypeの場合)
マスタ
ノード
ユーザーA ユーザーB
Skype
サーバ
ユーザー情報
ユーザー情報
ユーザー情報
リレー
ノード
もしもNATを越えられなくてP2P接続が
出来なかった場合は、リレーノードを
経由してクライアント・サーバ型のよ
うに通信する
3.デモについて解説
構成
• Webサーバ
PHPかなにかで適当にページを出すだけ
• ルームサーバ
MilkCocoaを使うと言っていたのですが、node.jsとsocket.ioで
(サービスとして作る時に自由度が低いのと価格が高いので)
• フロントまわり
TypeScriptでごりごり書いた感じ
使用したライブラリ
(RouterJS、RequireJS、jQuery、socket.io-client、PeerJS)
デモの流れ
ユーザーA
Redis
(マスタ)
Node.js
(ルーム)
Node.js
(ルーム) 既にユーザーAが入室している部屋に
ユーザーBが入ったとします。
ユーザーB
デモの流れ
ユーザーA ユーザーB
Redis
(マスタ)
Node.js
(ルーム)
Node.js
(ルーム)
入室するタイミングでSkyWayの
PeerServerにPeerIDをリクエストします
SkyWay
PeerID
デモの流れ
ユーザーA ユーザーB
入退室情報
Redis
(マスタ)
Node.js
(ルーム)
入退室情報
Node.js
(ルーム)
SkyWay
PeerID
SkyWayから受け取ったPeerIDを入室時に
Node.jsのルームサーバに送信します
Redisを通して複数のルームサーバ間で情
報を同期します
デモの流れ
ユーザーA ユーザーB
入退室情報
Redis
(マスタ)
Node.js
(ルーム)
入退室情報
Node.js
(ルーム)
SkyWay
PeerID
音声データ
ルームサーバを経由してPeerIDを交換す
ることでユーザー間のP2P接続をできるよ
うにします
デモの流れ
ユーザーA ユーザーB
入退室情報
Redis
(マスタ)
Node.js
(ルーム)
入退室情報
Node.js
(ルーム)
SkyWay
音声データ
ユーザーC
PeerID
入退室情報
ここで同じルームにユーザCが入室したと
します
デモの流れ
ユーザーA ユーザーB
入退室情報
Redis
(マスタ)
Node.js
(ルーム)
入退室情報
Node.js
(ルーム)
SkyWay
音声データ
ユーザーC
PeerID
入退室情報
PeerIDの取得・交換までは正常にできた
のですが、ファイアウォールの設定によ
りP2Pでの接続に失敗してしまいます
音声データ
デモの流れ
ユーザーA ユーザーB
入退室情報
Redis
(マスタ)
Node.js
(ルーム)
入退室情報
Node.js
(ルーム)
SkyWay
音声データ
ユーザーC
PeerID
入退室情報
そんな場合はTURN Serverを経由させることで
NATやファイアーウォールを越えさせます!
(これもSkyWayで提供されている機能です)
TURN
(SkyWay)
音声データ 音声データ
PeerJSでの通信方法
API KEYをSkyWayの公式サイトから取得後、
getUserMediaから取得できるMediaStreamを
相手のPeerIDに送ります
PeerJSでの通信方法
受け取った相手はPeerJSのcallイベントのcallbackに
自分のMediaStreamを送り返す処理を入れます
PeerJSでの通信方法
今回はルームに参加しているユーザーとそれぞれ
同じようにStreamを送り合うことでグループ通話を
実現しています
ユーザーA
ユーザーB
ユーザーC
音声データ 音声データ
音声データ
できたのがこれ
LOLTeeemo
ゲームでマッチングした瞬間に、
ボタン1つでボイスチャットルームを
誰でも簡単につくれるサービス!
LOLの日本サーバの公開に向けて鋭意開発中
おまけ
Node.jsについて
ユーザーA
Redis
(マスタ)
Node.js
(ルーム)
Node.js
(ルーム)
ユーザーB
デモではRedisをマスタにすることで複数台の
Node.jsサーバに情報を同期させていたのですが、
実はPHPから直接ルームに対してメッセージや
通知を送ることが可能です
ユーザーA
Redis
(マスタ)
Node.js
(ルーム)
Node.js
(ルーム)
ユーザーB
PHP
テキストデータとか
受け取った
データ
DB保存
今回はチャットサービスを想定します
チャットの場合ユーザーBはWebサーバに対して
テキストデータをPOSTします
ユーザーA
Redis
(マスタ)
Node.js
(ルーム)
Node.js
(ルーム)
ユーザーB
PHP
テキストデータとか
受け取った
データ
DB保存
サーバは受け取ったテキストデータをデータベース
などに保存したり、禁止文字チェックなどの処理を
して、その後にチャットが投稿されたルームに対し
てメッセージデータを送信します
ユーザーA
Redis
(マスタ)
Node.js
(ルーム)
Node.js
(ルーム)
ユーザーB
PHP
テキストデータとか
受け取った
データ
DB保存
Node.jsはRedisを常に監視しているのでデータ
が来た瞬間にユーザーに対してチャットメッ
セージを送信します
Node.jsの用意
• Node.jsのインストール
yum install nodejs
yum install npm
• 次にNode.jsがインストールされている環境
に必要なパッケージを入れます
npm install socket.io
npm install socket.io-redis
npm install forever
Redisの用意
• Redisのインストール
・とりあえずRemiからインストール
yum --enablerepo=remi install redis
・デフォルトポートで起動
/etc/init.d/redis start
socket.io-php-emitterの用意
• phpredisのインストール
yum --enablerepo=remi install php-pecl-redis
PHPからRedisを扱う時に必要なライブラリなので入れてく
ださい。
• socket.io-php-emitter
git clone https://github.com/rase-/socket.io-php-
emitter.git
パスの通ったディレクトリにGitHubからクローンして
composer installを実行してください。
socket.io-redisの使い方
Server側のNode.jsに追記
PHPからRedisにpublish
書き込み時にsocket.io-php-emitterを使い書き込み先
のチャットルームとチャットルームに入室しているユー
ザーそれぞれに通知を出します
ノイズキャンセラー
ノイズキャンセラーとは
WebRTCで送信しているMediaStreamの音声は周囲
の音を拾ってしまう上に音割れが酷いので、グルー
プ通話のような複数人で話すサービスには向いてい
ません・・・
そこでWebAudioAPIを使って特定の音量以外の音と
人間の出せない高音の音域を消す事で周囲のノイズ
や音割れの雑音を消すことができます!
WebAudioAPIのしくみ
WebAudioAPIは受け取ったAudioStreamに対して
エフェクトフィルターを直列につなぐことでギターの
エフェクターのように音を加工できます!
デモでの使用例
入力
音声データ
getUserMediaで取得した音声データ
音量
フィルター
ノイズ
キャンセラー
ボイス
チェンジャー
出力
デモでの使用例
入力
音声データ
ミュートや音量変更の機能用に音量調整
用のフィルターをかける
(送信側の設定)
音量
フィルター
ノイズ
キャンセラー
ボイス
チェンジャー
出力
デモでの使用例
入力
音声データ
特定の音量以下の音と人間が出せない音域
の音を消すフィルター
音量
フィルター
ノイズ
キャンセラー
ボイス
チェンジャー
出力
デモでの使用例
入力
音声データ
ユーザーの声に細工をするフィルター
(デモでは準備はしてるけど未実装)
音量
フィルター
ノイズ
キャンセラー
ボイス
チェンジャー
出力
デモでの使用例
入力
音声データ
3つのフィルターを通ったあとWebRTC
で音声データを送信
音量
フィルター
ノイズ
キャンセラー
ボイス
チェンジャー
出力
WebAudioAPIの記述
Chrome以外は不安定なので処理をさせないようにしていますが、
これだけで音量フィルターとノイズキャンセラーを実装しています
最後に
ちょっと前までブラウザでSkype並のボイス
チャットを作るなんて夢の技術でしたが、
WebRTCとWebAudioAPIにより誰でも
手が届く技術になりました!
一見意味の無さそうな技術でも応用すれば何
か新しいものが作れるかもしれないので、
新しい技術は積極的に勉強しましょう!

Más contenido relacionado

La actualidad más candente

WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
Yoshiaki Sugimoto
 
ライブストリーミングの基礎知識
ライブストリーミングの基礎知識ライブストリーミングの基礎知識
ライブストリーミングの基礎知識
kumaryu
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
Takahito Tejima
 

La actualidad más candente (20)

WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみたWebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
 
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
 
Inside WebM
Inside WebMInside WebM
Inside WebM
 
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
CEDEC 2016 Metal と Vulkan を用いた水彩画レンダリング技法の紹介
 
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
 
[AKIBA.AWS] AWS Elemental MediaConvertから学ぶコーデック入門
[AKIBA.AWS] AWS Elemental MediaConvertから学ぶコーデック入門[AKIBA.AWS] AWS Elemental MediaConvertから学ぶコーデック入門
[AKIBA.AWS] AWS Elemental MediaConvertから学ぶコーデック入門
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
ライブストリーミングの基礎知識
ライブストリーミングの基礎知識ライブストリーミングの基礎知識
ライブストリーミングの基礎知識
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
Dockerを利用したローカル環境から本番環境までの構築設計
Dockerを利用したローカル環境から本番環境までの構築設計Dockerを利用したローカル環境から本番環境までの構築設計
Dockerを利用したローカル環境から本番環境までの構築設計
 
HoloLensで音声認識をする方法を色々試してみた
HoloLensで音声認識をする方法を色々試してみたHoloLensで音声認識をする方法を色々試してみた
HoloLensで音声認識をする方法を色々試してみた
 
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築するピクサー USD 入門 新たなコンテンツパイプラインを構築する
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
 
WebRTC研修
WebRTC研修WebRTC研修
WebRTC研修
 
IoT用途で簡単に使えるWebRTC Engineを作った話
IoT用途で簡単に使えるWebRTC Engineを作った話IoT用途で簡単に使えるWebRTC Engineを作った話
IoT用途で簡単に使えるWebRTC Engineを作った話
 
WebRTC入門+最新動向
WebRTC入門+最新動向WebRTC入門+最新動向
WebRTC入門+最新動向
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
AbemaTV が対峙する技術的課題と開発の現場
AbemaTV が対峙する技術的課題と開発の現場AbemaTV が対峙する技術的課題と開発の現場
AbemaTV が対峙する技術的課題と開発の現場
 

Similar a SkyWayで作るボイスチャット

SkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したこと
SkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したことSkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したこと
SkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したこと
Yusuke Naka
 
レポート
レポートレポート
レポート
xin song
 
レポート
レポートレポート
レポート
xin song
 
Sob amierukaのご提案
Sob amierukaのご提案Sob amierukaのご提案
Sob amierukaのご提案
Kazushi Inui
 

Similar a SkyWayで作るボイスチャット (20)

WebRTCとPeer.jsを使った実装
WebRTCとPeer.jsを使った実装WebRTCとPeer.jsを使った実装
WebRTCとPeer.jsを使った実装
 
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
 
WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!
 
ビデオ通話・P2Pがコモディティ化する世界 WebRTCによるこれからを探る
ビデオ通話・P2Pがコモディティ化する世界 WebRTCによるこれからを探るビデオ通話・P2Pがコモディティ化する世界 WebRTCによるこれからを探る
ビデオ通話・P2Pがコモディティ化する世界 WebRTCによるこれからを探る
 
WebRTC再び
WebRTC再びWebRTC再び
WebRTC再び
 
WebRTC概説(P2P)
WebRTC概説(P2P)WebRTC概説(P2P)
WebRTC概説(P2P)
 
Magic Leap で WebRTC 触ってみた
Magic Leap で WebRTC 触ってみたMagic Leap で WebRTC 触ってみた
Magic Leap で WebRTC 触ってみた
 
SkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したこと
SkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したことSkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したこと
SkyWayとWebRTC開発者コミュニティ4年間の軌跡とCMC_Meetupで学んだこと、実践したこと
 
WebRTCについて
WebRTCについてWebRTCについて
WebRTCについて
 
Vuzix Developer Conference
Vuzix Developer ConferenceVuzix Developer Conference
Vuzix Developer Conference
 
レポート
レポートレポート
レポート
 
レポート
レポートレポート
レポート
 
Interop Tokyo 2021 - ShowNet を陰で支えた Azure Virtual WAN
Interop Tokyo 2021 - ShowNet を陰で支えた Azure Virtual WANInterop Tokyo 2021 - ShowNet を陰で支えた Azure Virtual WAN
Interop Tokyo 2021 - ShowNet を陰で支えた Azure Virtual WAN
 
WebRTCについてざっと
WebRTCについてざっとWebRTCについてざっと
WebRTCについてざっと
 
5jCup WebRTC賞
5jCup WebRTC賞5jCup WebRTC賞
5jCup WebRTC賞
 
CONBU LL Diver/YAPC::Asia 2014 Network
CONBU LL Diver/YAPC::Asia 2014 NetworkCONBU LL Diver/YAPC::Asia 2014 Network
CONBU LL Diver/YAPC::Asia 2014 Network
 
Web rtcの使い方
Web rtcの使い方Web rtcの使い方
Web rtcの使い方
 
2013 WebRTC node
2013 WebRTC node2013 WebRTC node
2013 WebRTC node
 
スマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCスマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTC
 
Sob amierukaのご提案
Sob amierukaのご提案Sob amierukaのご提案
Sob amierukaのご提案
 

Último

Último (11)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

SkyWayで作るボイスチャット