これは何?
SkyWay IoT SDK 使うと、WebRTC を経由したサーバーサイドレコーディングが割に簡単にできちゃうんで、それの紹介
sendStream() - ブラウザから音声を送る
SiRu-Client の v0.0.9 から、 sendStream()
というメソッドで、ブラウザから IoT SDKが搭載された Linux に手軽に音声を送れるようになりました。使い方は、以下の感じ。 getUserMedia
で音声取得後、 sendStream(uuid, stream)
を呼ぶことでターゲットの IoT SDK デバイスに送信できます。
const client = new SiRuClient( 'testroom', { key: 'YOUR_API_KEY' } );
client.on('meta', profile => {
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then( stream =>
client.sendStream( profile.uuid, stream )
)
.then( call => console.log('start sending local stream') )
.catch( err => console.warn(err) );
});
サンプルサイト https://nttcom.github.io/skyway-siru-client/examples/sendAudio.html もありますので、そちらも参考に。
IoT SDK側でのファイル保存
SkyWay IoT SDK 1 では、受信した音声をデフォルトで localhost:25000/udp
あてに rtp
で流し続けます(フォーマットはデフォルトだと opus
に固定しています)。
なので、これを gstreamer
で拾えばファイル保存できちゃう。以下の例だと opus
で一旦受信した後 wav
に変換して保存しています。
gst-launch-1.0 -v udpsrc port=25000 caps="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)X-GST-OPUS-DRAFT-SPITTKA-00 " ! \
rtpopusdepay ! \
opusdec ! \
wavenc ! \
filesink location=recorded_audio.wav
受け側でそのまま再生する
保存できるんだったら、そのままリモートのスピーカーでも再生できるよね。。。。ってことで、それをやる gstreamer
のスクリプトが以下
gst-launch-1.0 -v udpsrc port=25000 caps="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)X-GST-OPUS-DRAFT-SPITTKA-00 " ! \
rtpopusdepay ! \
opusdec ! \
audioconvert ! \
audioresample ! \
autoaudiosink
それ以外には?
上の二つのパイプラインスクリプトをよく見ると分かるのですが、ようは opusdec
以下のパイプラインの書き方次第で、音声処理を自由に操作できます。この辺になると、正直 IoT SDK というより、gstreamer をいかに使いこなすかという話になりますが、可能性はたくさん。
今回紹介したのは、単純な録音と再生ですが、例えば appsink
2 と組み合わせてあげたりすると生の音声データとして取得できちゃうんで、それに音声認識かましたあと自然言語処理をかまして通話内容の統計解析を行なう・・・なんてなことも可能になります3。きっと
ちなみに今回は 録音 というところにフィーチャーして、受信側の話をしましたが、IoT SDK では、送信ストリームも gstreamer なりを使って rtp で渡す形になるので、ここの柔軟性は送信ストリームにもあてはめられます。例えば、カメラ映像に対して、顔認識とかAI/ML系をかましつつ、WebRTC配信するとか。4
まぁ、この辺については、またおいおい
-
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-appsink.html ↩
-
このレベルになると、 c でのコーディングの話とかになってきますが、 node-gstreamer-superficial みたいに node 版の wrapper なんかもあるんで、以外に気軽にできたりします。 ↩
-
SkyWay IoT SDKは現状βリリースの実験的なものですので、その点はご注意を ↩