音声ストリーミング機能

概要

Sora に WebRTC で送られてきた音声を、接続ごとに HTTP/2 で外部へ出力し、外部から受信した結果をクライアントへプッシュで通知する機能です。

注意

OBS (WHIP) 機能利用時の Opus の設定

OBS の Opus のビットレートがデフォルトの場合は正常に動作しない場合があります。 その場合はビットレートを 128 kbps まで下げて見てください。

IPv6 非対応

現時点で、音声ストリーミングは IPv6 を利用できません。

音声ストリーミングの送信単位

音声ストリーミングを audio_streaming_url へ送信するのは、 コネクション単位であり、セッション単位ではありません。

HTTP/2

  • 音声ストリーミングゲートウェイは HTTP/2 に対応している必要があります
  • h2c と h2 の両方に対応しています
  • http:// から始めると h2c を利用します
  • https:// から始めると h2 を利用します

音声ストリーミングの配信

音声ストリーミング機能はセッション単位で有効になります。

実際に音声ストリーミングで音声が外部に配信されるのは、 rolesendrecv または sendonly、かつ audiotrue になっている場合のみ有効になります。

音声ストリーミングのヘッダー

音声ストリーミング機能において、HTTP/2 経由で送信する音声パケットに Sora 側でヘッダーを追加する機能です。

sora.confaudio_streaming_headertrue に設定するとヘッダーが追加されます。

---
title: "音声ストリーミングヘッダーフォーマット"
---
packet-beta
0-63: "Timestamp"
64-127: "SeqNum"
128-159: "Length"
  • Timestamp は音声パケット送信時の UTC 時間マイクロ秒の整数です
    • RTP のタイムスタンプとは異なります
    • 64 ビット符号なし整数です
  • SequenceNumber は音声パケットのシーケンス番号で、 1 から始まります
    • RTP のシーケンス番号とは異なります
    • 64 ビット符号なし整数です
  • Length はヘッダーを除いた音声パケットの長さです
    • 32 ビット符号なし整数です

言語コードの指定

音声ストリーミングを利用する場合、 言語コードを指定する必要があります。

シグナリング接続時、または認証成功時の払い出しで {"audio_streaming_language_code": "ja-JP"} のように指定してください。 指定するのは 文字列であればなんでもかまいません 。Sora 自体は言語コードには関与しません。あくまでただの文字列として扱います。

セッションウェブフック経由での開始

音声ストリーミングはセッション単位で開始、終了します。

セッション生成時から音声ストリーミングを開始したい場合、 セッションウェブフックの戻り値に {"audio_streaming": true} を指定することで音声ストリーミングが開始します。

そのセッションに参加してきた言語コードが指定されているクライアントはすべて音声ストリーミングが行われます。

セッション破棄時の音声ストリーミング終了

チャネルのセッションが破棄したタイミングで音声ストリーミングは終了します。

API 経由での開始と終了

セッションの途中で音声ストリーミングを開始する場合は StartAudioStreaming API を利用する必要があります。

また、セッションの途中で音声ストリーミングを終了する場合は StopAudioStreaming API を利用する必要があります。

自動開始/停止機能

サブスクライブ中のコネクション数が 1 つ以上に増えたとき、自動的に音声ストリーミングが開始します。 逆に、サブスクライブ中のコネクション数が 0 になったときには、音声ストリーミングが自動的に停止します。

この機能を有効にすることで、サブスクライブが 0 の時は音声ストリーミングを行わなくなり、 転送量などを抑えることができます。

以下の方法でこの機能を有効にできます:

  • セッションウェブフックの session.created 時の払い出しで {"audio_streaming": true, "audio_streaming_auto": true} を指定した場合

リトライ条件

Sora は音声ストリーミングゲートウェイへの接続が失敗した際、リトライを行います。

リトライを行うには audio_streaming_max_retriesaudio_streaming_retry_interval0 以外の値を指定してある必要があります。

リトライを行う

  • 音声ストリーミングゲートウェイへ接続ができなかった場合
  • 音声ストリーミングゲートウェイへ接続時に 5xx 系のステータスコードが返された場合

リトライを行わない

  • 接続時に 4xx 系が送られてきた場合
  • 接続後に "type": "error" が送られてきた場合

audio_streaming 関連の払い出し設定の組み合わせによる動作

音声ストリーミングゲートウェイへの接続

セッションウェブフックの session.created 時に払い出した、 audio_streaming, audio_streaming_auto の組み合わせごとの 配信者接続時 の音声ストリーミングゲートウェイへの接続の有無は下記の通りです。

audio_streaming の指定

audio_streaming_auto の指定

subscribe 数

音声ストリーミングゲートウェイへの接続

true

true [1]

0

無し

true

true [1]

1 以上

有り

true

false

0

有り [2]

true

false

1 以上

有り [2]

true

指定なし

0

有り [2]

true

指定なし

1 以上

有り [2]

false

false

0

無し

false

false

1 以上

無し [3]

false

指定なし

0

無し [3]

false

指定なし

1 以上

無し [3]

指定なし

false

0

無し

指定なし

false

1 以上

無し [3]

指定なし

指定なし

0

無し [3]

指定なし

指定なし

1 以上

無し [3]

クライアントへの解析結果の送信

セッションウェブフックの session.created 時に払い出した、 audio_streaming, audio_streaming_auto の組み合わせごとの subscribe しているクライアントへの解析結果の送信有無は下記の通りです。

audio_streaming の指定

audio_streaming_auto の指定

subscribe 数

クライアントへの解析結果の送信

true

true [4]

0

無し

true

true [4]

1 以上

有り

true

false

0

無し

true

false

1 以上

有り

true

指定なし

0

無し

true

指定なし

1 以上

有り

false

false

0

無し

false

false

1 以上

無し

false

指定なし

0

無し

false

指定なし

1 以上

無し

指定なし

false

0

無し

指定なし

false

1 以上

無し

指定なし

指定なし

0

無し

指定なし

指定なし

1 以上

無し

1 コネクション 1 HTTP/2 コネクション

音声ストリーミングが開始している状態でそのチャネルに新規クライアントが参加すると、 audio_streaming_url 宛てに新しく HTTP/2 コネクションが張られ、 クライアントから送られてきた Opus のバイナリデータがそのまま送られます。

HTTP/2 コネクションを張る際のヘッダーには以下の値が入ります。

  • sora-channel-id
    • クライアントのチャネル ID
  • sora-connection-id
    • クライアントのコネクション ID
  • sora-audio-streaming-language-code
    • クライアントの言語コード

プッシュ通知経由での戻り値の通知

シグナリングのプッシュ通知経由で外部サーバーからの戻り値を通知します。

{
    "type": "push",
    "data": {
        "type": "audio_streaming_result",
        "connection_id": "<connection_id>",
        "result": "レスポンスがそのまま含まれる"
    }
}

ウェブフック

音声ストリーミングの開始、終了時にウェブフックを通知します。

このウェブフックはデフォルト無効です。

もし利用する場合は sora.confignore_audio_streaming_webhookfalse にして通知を有効にしてください。

audio-streaming.started

  • セッションで音声ストリーミングが開始した場合に通知されます
  • 自動開始/停止が有効の場合は "audio_streaming_auto": true が入ってきます
  • 音声ストリーミングを開始した時間が "audio_streaming_started_timestamp" に入ってきます
  • このウェブフックはかならず session.created よりも後に送信されます
{
  "data": {
    "audio_streaming_auto": false,
    "audio_streaming_started_timestamp": "2023-05-01T08:23:58.489262Z"
  },
  "id": "VWGZ8NK2C55XBCGQ54SECK7J08",
  "label": "WebRTC SFU Sora",
  "timestamp": "2023-05-01T08:24:20.757279Z",
  "type": "audio-streaming.started",
  "version": "2023.2.0",
  "max_connections": 1,
  "node_name": "sora@127.0.0.1",
  "session_id": "DYPX8R6F4D11ZEG6XCX6N8EEWM",
  "channel_id": "sora",
  "spotlight": false,
  "created_time": 1682929437,
  "total_connections": 1,
  "created_timestamp": "2023-05-01T08:23:57.274844Z"
}

audio-streaming.stopped

  • セッションで音声ストリーミング停止した場合に通知されます
  • 自動開始/停止が有効な場合は "audio_streaming_auto": true が入ってきます
  • 音声ストリーミングを開始した時間が "audio_streaming_started_timestamp" に入ってきます
  • 音声ストリーミングを停止した時間が "audio_streaming_stopped_timestamp" に入ってきます
  • このウェブフックはかならず session.destroyed よりも前に送信されます
{
  "data": {
    "audio_streaming_auto": false,
    "audio_streaming_started_timestamp": "2023-05-01T08:23:58.489262Z",
    "audio_streaming_stopped_timestamp": "2023-05-01T08:24:20.756785Z"
  },
  "id": "VWGZ8NK2C55XBCGQ54SECK7J08",
  "label": "WebRTC SFU Sora",
  "timestamp": "2023-05-01T08:24:20.757279Z",
  "type": "audio-streaming.stopped",
  "version": "2023.2.0",
  "max_connections": 1,
  "node_name": "sora@127.0.0.1",
  "session_id": "DYPX8R6F4D11ZEG6XCX6N8EEWM",
  "channel_id": "sora",
  "spotlight": false,
  "created_time": 1682929437,
  "total_connections": 1,
  "created_timestamp": "2023-05-01T08:23:57.274844Z"
}

audio-streaming.failed

このウェブフックは、Sora が接続する音声ストリーミングゲートウェイが利用するサービスに不具合があったことを、Sora に伝える仕組みです。

リトライが発生する場合は最大リトライ数を超えている場合に、以下の状況でウェブフックが送信されます。

  • 音声ストリーミングゲートウェイに接続した際 5xx 系のエラーが返ってきた場合に送信します
  • 音声ストリーミングゲートウェイに接続した際 4xx 系のエラーが返ってきた場合に送信します
  • 音声ストリーミングゲートウェイから "type": "error" が返ってきた場合に送信します
  • 音声ストリーミングゲートウェイへの接続確立がタイムアウト以外で失敗した場合に送信します

音声ストリーミングを再開したい場合は、再接続をしてください。

音声ストリーミングゲートウェイへの接続がタイムアウトになった場合にはウェブフックは送信されません。

{
  "data": {
    "failed_reason": "<string>"
  },
  "id": "VWGZ8NK2C55XBCGQ54SECK7J08",
  "label": "WebRTC SFU Sora",
  "timestamp": "2023-05-01T08:24:20.757279Z",
  "type": "audio-streaming.failed",
  "role": "sendrecv",
  "version": "2024.1.0",
  "node_name": "sora@127.0.0.1",
  "client_id": "B2JPGFZPMD3H973Y811MF8ZZ70",
  "connection_id": "B2JPGFZPMD3H973Y811MF8ZZ70",
  "bundle_id": "B2JPGFZPMD3H973Y811MF8ZZ70",
  "session_id": "DYPX8R6F4D11ZEG6XCX6N8EEWM",
  "channel_id": "sora",
  "simulcast": false,
  "spotlight": false,
  "log_written": true
}

シグナリング通知経由で audio-streaming.failed をクライアントへ通知する

このシグナリング通知は、Sora が接続する音声ストリーミングゲートウェイが利用するサービスに不具合があったことを、 そのチャネルに参加している全てのクライアントへ通知する仕組みです。

sora.conf にて signaling_notify_audio_streaming_failedtrue を指定した場合、 audio_streaming_url への接続を諦めた際、セッションに参加している全てのコネクションにシグナリング通知 audio-streaming.failed を送信します。

この設定はデフォルトで false です。

{
  "type": "notify",
  "event_type": "audio-streaming.failed",
  "failed_connection_id": "<connection_id>"
}

設定

audio_streaming_url

デフォルト:

指定なし

音声ストリーミングゲートウェイの URL を指定してください。 音声ストリーミングゲートウェイは HTTP/2 に対応している必要があります。

https または http から始まる URL を指定してください。

詳細は audio_streaming_url をご確認ください。

audio_streaming_max_retries

デフォルト:

0

範囲:

0..10

音声ストリーミングゲートウェイへの接続が失敗した場合の最大リトライ回数を指定してください。

詳細は audio_streaming_max_retries をご確認ください。

audio_streaming_retry_interval

デフォルト:

5 s

範囲:

0..60 s

音声ストリーミングゲートウェイへの接続が失敗した場合のリトライ間隔を指定してください。

詳細は audio_streaming_retry_interval をご確認ください。

default_audio_streaming_result_push

デフォルト:

true

音声ストリーミングゲートウェイからのレスポンスをシグナリングプッシュ通知で送ることをデフォルトで行うかを指定してください。

詳細は default_audio_streaming_result_push をご確認ください。

default_audio_streaming_language_code

デフォルト:

指定なし

音声ストリーミングゲートウェイ接続時に HTTP ヘッダー sora-audio-steraming-language-code にデフォルトで含める文字列を指定してください。

詳細は default_audio_streaming_language_code をご確認ください。

audio_streaming_tls_fullchain_file

デフォルト:

指定なし

音声ストリーミングゲートウェイとの通信に HTTPS で mTLS を利用するための設定です。 中間証明書を含む PEM 形式 のクライアント証明書のパスを設定して下さい。

詳細は audio_streaming_tls_fullchain_file をご確認ください。

audio_streaming_tls_privkey_file

デフォルト:

指定なし

音声ストリーミングゲートウェイとの通信に HTTPS で mTLS を利用するための設定です。 PEM 形式のクライアント証明書秘密鍵のパスを設定して下さい。

詳細は audio_streaming_tls_privkey_file をご確認ください。

audio_streaming_tls_verify_cacert_file

デフォルト:

指定なし

音声ストリーミングゲートウェイとの通信に HTTPS を利用する際に、 サーバー証明書のチェックを行う PEM 形式の CA ファイルのパスを設定して下さい。

詳細は audio_streaming_tls_verify_cacert_file をご確認ください。

API

StartAudioStreaming API

セッションが存在し、音声ストリーミングが開始していないチャネルに対して音声ストリーミングを開始します。

詳細は StartAudioStreaming をご確認ください。

StopAudioStreaming API

セッションが存在し、音声ストリーミングが開始しているチャネルに対して音声ストリーミングを停止します。

詳細は StopAudioStreaming をご確認ください。

SubscribeAudioStreamingResultPush API

指定した接続が、音声ストリーミングゲートウェイからの戻り値のプッシュ通知をサブスクライブするよう設定します。

詳細は SubscribeAudioStreamingResultPush をご確認ください。

UnsubscribeAudioStreamingResultPush API

指定した接続が、音声ストリーミングゲートウェイからの戻り値のプッシュ通知をサブスクライブしないよう設定します。

詳細は UnsubscribeAudioStreamingResultPush をご確認ください。

ListAudioStreamingResultPushState API

指定したチャネルのセッションのコネクションごとのサブスクライブの状態を確認します。

[
  {
    "connection_id": "B2JPGFZPMD3H973Y811MF8ZZ70",
    "subscribe": true
  },
  {
    "connection_id": "KT116Z11KX5Y547KA1V12HW8PG",
    "subscribe": false
  },
  {
    "connection_id": "A5GYXGRYAX6590M3AFH7F9Z2H4",
    "subscribe": false
  }
]

詳細は ListAudioStreamingResultPushState をご確認ください。

Audio Streaming Gateway Suzu

shiguredo/suzu: Audio Streaming Gateway Suzu

Sora から HTTP/2 経由で送られてくるヘッダーや Opus 音声データを Ogg 形式に変換して、 音声からテキストに変換するサービスへ送信し、サービスから受信した解析結果を Sora に返すゲートウェイです。

時雨堂が開発し、 OSS として公開しています。

対応サービス

シーケンス図

Suzu + AWS Transcribe

sequenceDiagram
    autonumber
    participant C as クライアント
    participant S as Sora
    participant Suzu
    participant AWS Transcribe
    C->>S: SRTP
    C->>S: SRTP
    C->>S: SRTP
    note over C, AWS Transcribe: StartAudioStreaming API 実行
    C->>S: SRTP
    S->>Suzu: Opus over HTTP/2
    Suzu->>AWS Transcribe: Ogg over HTTP/2
    C->>S: SRTP
    S->>Suzu: Opus over HTTP/2
    Suzu->>AWS Transcribe: Ogg over HTTP/2
    C->>S: SRTP
    S->>Suzu: Opus over HTTP/2
    Suzu->>AWS Transcribe: Ogg over HTTP/2
    AWS Transcribe->>Suzu: JSON over HTTP/2
    Suzu->>S: JSON over HTTP/2
    S->>C: シグナリングプッシュ通知

自動開始/停止

クライアントSoraアプリケーションサーバーSuzuクライアントSoraアプリケーションサーバーSuzuセッションウェブフックsession.created1"audio_streaming": true"audio_streaming_auto": true2SRTP3SRTP4SRTP5SubscribeAudioStreamingResultPushAPI 実行6200 OK7Subscribe しているCが 1 になっセッションウェブフックaudio-streaming.started8200 OK9Suzu への HTTP/2 コネクション接続SRTP10Opus over HTTP/211SRTP12Opus over HTTP/213JSON over HTTP/214シグナリングプッシュ通知15SRTP16Opus over HTTP/217UnsubscribeAudioStreamingResultPushAPI 実行18200 OK19Subscribe しているクライアントが0 になったSuzu への HTTP/2 コネクション切断SRTP20