ライブキャプション — Vonage Video Linux SDK

OpenTok Linux SDK には、Linux クライアントが OpenTok セッション内でキャプションを送信および受信するための機能が含まれています。

ライブキャプションは、セッション単位で以下の設定を通じて有効にする必要があります。 REST API.

ライブキャプションは、以下の場合にのみサポートされます。 ルーティングセッション.

このトピックには以下のセクションが含まれます:

ライブキャプションの公開

OpenTokのパブリッシャーは、以下の関数を呼び出すことで、リアルタイムのライブキャプションの配信を開始または停止することができます。 otc_publisher_set_publish_captions() 関数である:

otc_publisher_set_publish_captions(publisher, OTC_FALSE);

出版社がオーディオトラックを収録していない場合は otc_publisher_callbacks.on_error() コールバック 関数がエラーとともに呼び出され、エラーコードが OTC_PUBLISHER_MISSING_AUDIO_TRACK.

Vonage Linus SDKはパブリッシャーが自身のキャプションのイベントを受け取ることをサポートしていません。スピーカー自身のキャプションをレンダリングするには、(パブリッシャーのストリームに) キャプションイベントをリッスンする隠しサブスクライバーを作成します。(次のセクションを参照)。

ライブキャプションを購読する

加入者は、次のコマンドを呼び出すことで、キャプションの受信を開始または停止できる。 otc_subscriber_set_subscribe_to_captions() 関数である:

otc_subscriber_set_subscribe_to_captions(subscriber, OTC_TRUE);

この関数は、ストリームのパブリッシャーが現在ライブキャプションを公開しているかどうかに関係なく呼び出すことができます。 この関数を呼び出すことができます。サブスクライバは、パブリッシャがキャプションを公開し始めると、 キャプションデータの受信を開始します。 サブスクライバーはキャプションデータの受信を開始します。

キャプションの受信を停止するには OTC_FALSE を関数に追加する:

otc_subscriber_set_subscribe_to_captions(subscriber, OTC_FALSE);

購読者は、ストリームのライブ・キャプションをアクティブに購読しているかどうかを otc_subscriber_get_subscribe_to_captions() 関数である:

otc_bool isSubscribed = otc_subscriber_get_subscribe_to_captions(subscriber);

購読者はイベントを通じて字幕を受け取ります。OpenTok SDK では、字幕のテキストは UI 上に表示されません。以下の設定を行ってください。 on_caption_text() のメンバー関数である。 otc_subscriber_callbacks インスタンス のインスタンスを作成し、キャプション・イベントのリスナーを設定します:

static void on_caption_text(otc_subscriber *subscriber,
                                      void *user_data,
                                      const char* text) {
    // Display the text in the UI.
}

subscriber_callbacks.on_caption_text = on_caption_text;

について otc_stream_has_captions() 関数は、ストリームにキャプションがあるかどうかを報告する:

otc_bool hasCaptions = otc_stream_has_captions(stream);

を実施する。 on_stream_has_captions_changed() のメンバー関数である。 otc_session_callbacks インスタンスを使用して、ストリームでキャプションが有効になっているときと無効になっているときを監視します:

static void on_stream_has_captions_changed(otc_session* session,
                                                   void *user_data,
                                             otc_stream *stream,
                                                  otc_bool has_captions) {
  // Adjust UI to indicate that captions are or are not available.
}

session_callbacks.on_stream_has_captions_changed = on_stream_has_captions_changed;

ライブキャプションの受信

Vonage Video API では、パブリッシャーが自身のキャプションに関するイベントを受信することはサポートされていません。話者自身のキャプションを表示するには、(ローカルパブリッシャーのストリームに対する)非表示のサブスクライバーを作成し、キャプションイベントをリッスンするようにしてください。 このサブスクライバーのビューを UI に表示したり、そのオーディオを購読したりしないでください(エコーを防ぐため)。その後、キャプションのテキストを UI に追加することができます。

Publisherはデフォルトではキャプションを公開しないため、 otc_publisher_set_publish_captions() 関数に、以下を引数として渡して TRUE:

    session_data->publisher = otc_publisher_new("vonage-linux-sdk-samples",
                                              NULL, /* Use WebRTC's video capturer. */
                                              &publisher_callbacks);
	otc_publisher_set_publish_captions(session_data->publisher, TRUE);

パブリッシャーのストリームを購読する on_publisher_stream_created() コールバック:

static void on_publisher_stream_created(otc_publisher *publisher,
                                        void *user_data,
                                        const otc_stream *stream) {
	printf("on_session_stream_received: streamId=%s", otc_stream_get_id(stream));
	subscriber_callbacks.on_caption_text = on_caption_text;
	otc_subscriber *subscriber = otc_subscriber_new(strcpy, &subscriber_callbacks);
    
	if (otc_session_subscribe(session, subscriber) == OTC_SUCCESS) {
		session_data_local->subscriber = subscriber;
		session_data_local->sub_stream = stream;

		otc_subscriber_set_subscribe_to_audio(session_data_local->subscriber, FALSE);
		otc_subscriber_set_subscribe_to_video(session_data_local->subscriber, TRUE); // This is a workaround for an OpenTok bug.
		otc_subscriber_set_subscribe_to_captions(session_data_local->subscriber, TRUE);

		self_publisher_stream_id = otc_stream_get_id(stream);
	}
}

前述の通り、字幕を表示するには動画の購読が必要です。(この問題は今後のバージョンで修正される予定です。)

この例では、パブリッシャーのストリーム ID を selfPublisherStreamId 変数。ここでは、そのビューがUIに追加されないようにするために使用されています:

static void on_subscriber_connected(otc_subscriber *subscriber,
                                    void *user_data,
                                    const otc_stream *stream) {
  	printf("on_subscriber_connected: streamId=%s ", otc_stream_get_id(stream));

  	if(otc_stream_get_id(otc_stream) == selfPublisherStreamId) {
		return;
	}

	// Show other subscribers in the UI
}

購読者は、以下のコールバックで(公開されたストリームの)文字起こしテキストを受け取ります:

void on_caption_text(otc_subscriber* subscriber,
                          void* user_data,
                          const char* text,
                          otc_bool is_final) {
	// Adjust UI to show captions.
	otc_stream* stream = otc_subscriber_get_stream(subscriber);
	if (strcmp(otc_stream_get_id(stream), self_publisher_stream_id) == 0)
    {
        // text is your own audio as transcribed text or captions
        printf("My own caption %s", text);
    } else {
        // other subscribers captions
    }
}