2013年7月22日月曜日

CSipSimple の最適化 「G-Call050」編

「G-Call050」をより快適に使用するために、「CSipSimple」の設定を自分なりに最適化していきました。ここではその経過を報告します。

まずは、「CSipSimple」の設定の変更により、通話品質がどの程度変化するのかを検証します。もちろん、自分の聞こえ方ではなく、相手側にどのように聞こえているかの検証です。

その検証結果を基に、「G-Call050」に最適な「CSipSimple」の設定を見つけたいと思います。


まず、「G-Call050」ってなに?という人は次の記事を参照してください。
スマホでIP電話「G-Call050」のすすめ

「G-Call050」は専用アプリでしか使えないのでは?と思う人は次の記事をご覧ください。
「G-Call 050」のSIP情報を抜く方法



【CSipSimpleの設定項目について】

まず、「CSipSimple」には大枠として下記設定項目があります。
  • 簡易設定
  • ネットワーク
  • メディア
  • ユーザインターフェース
  • 通話オプション
  • フィルター

    これら設定の中で通話品質に関わりそうなものをピックアップします。

    <ネットワーク>
  • QoSを有効
  • DSCP値
  • コンパクトSIPを使用
  • ICEを有効


    <メディア>
  • エコーキャンセル
  • エコー除去
  • エコーモード
  • 音声検出
  • メディア品質
  • クロックレート
  • 音声フレーム ptime



    【CSipSimpleの音質に関わる設定の説明】

    以下は私流の解釈です。正直言って良くわかっていないです。間違ったものがありましたら、ぜひ教えてください。

    [QoSを有効]

    QoS(Quality of Service)

    超混雑時などでスマホの通信は遅くなると思います。数kBの読み込みすら時間がかかります。
    しかし、それだけ混んでいる回線でも通話は難なくできます。

    このように同じ3G通信の中でも、通話に使う帯域は優先して確保されます。
    これが「QoS」です。

    しかし、これを使うにはサーバ側の対応が必要なため、「G-Call050」の通常利用では使えません。
    (検証から除外)


    [DSCP値]

    DSCP(Differentiated Services Code Point)

    これもQoSと似ているのですが、こちらはパケット自体に優先度を判断する情報を乗せて通信します。
    これもサーバ側(SIPサーバ)の対応が必要なため、使えません。
    (検証から除外)


    [コンパクトSIPを使用]

    検索しましたが、その意味はよくわかりませんでした。
    SIP通信を圧縮し、それにより容量が減らせるため、ハード側のメモリーを節約できる的なことが書かれていました。

    これは、G-Call050サーバ側の対応を確認したいため、検証しました。
    しかし、そもそもSIP自体が非常にコンパクトなため、どの程度効果があるかは分かりません。


    [ICEを有効]

    ICE (Internet Connectivity Exchange)

    SIP通信でNAT越えをする際に使用します。
    また、相手側まで最短ルートで到達できるように最適なネットワークルートを自動で探し出します。

    NAT越えが目的ではなく、これを有効にすることで、ネットワーク上の最短ルートを通過できるのか確認したく、検証しました。

    [エコーキャンセル]
    [エコー除去]
    [エコーモード]


    エコーはそのままの意味ですので説明は割愛します。
    なお、エコーは遅延時間が大きいほど増加します。

    エコー除去時間はデフォルトの200msでは短すぎるため、「G-Call050」の遅延時間に合わせ、300msを設定し検証しました。
    なお、300という数字の根拠は、過去に行ってきた検証結果からの経験値です。


    [音声検出]

    これは音声を検出した場合以外の音声を無音にするものです。
    人間がしゃべり始めた瞬間を検知し、その瞬間から音声が聞こえなくなるまでの間だけマイクを有効にする、といったイメージです。

    これは、OFFのほうが明らかに良いとは思うのですが、あらためて検証してみることとしました。


    [メディア品質]

    説明では「メディアストリームの品質」となっているので、これはメディアストリームのことと解釈します。(違うかも知れません。)

    メディアストリームとは、1本につき1メディアを送信するコネクションを確立するためのものです。
    例えばビデオ通話では映像の送受信で2本分、音声の送受信で2本分、計4本のメディアストリームが必要と言うことになります。

    これが、私の考える「メディアストリーム」であれば、4は大きすぎです。2で十分のはず。そのため、4と2の2パターン検証しました。


    [クロックレート]

    「CSipSimple」には「オーディオチャンネル周波数」との説明がありますが、詳細がわかりません。
    送信するときのサンプリングレートなのか、受信時のものなのか分からないため検証してみました。


    [音声フレーム ptime]

    これは、何ms間隔で音声パケットをひとかたまりとするかを決定するものです。
    少ない時間の方が遅延時間は小さくなりますが、それだけ音声パケットが細切れになるということです。
    これを小さくすることにより、遅延時間は減少しますが、ゆらぎは増加するはずです。

    これは回線状況とSIPサーバにより、最適値はかなり左右されるはずなので、5、10、15、20の4パターン検証します。



    【検証前の準備】

    検証条件は次のとおりです。(前回とほぼ同様)
  • 光回線へWi-Fi接続、使用する音声コーデックはSILK(8kHz)とする
  • PCスピーカの音声を拾う
  • 音質の検証は「FUSION IP-Phone SMART」の留守電を使用
  • 遅延時間の測定は「IP電話→携帯電話」通話時の音声波形より抽出
  • 遅延時間の測定は1点ではなく、1分程度の連続した通話の中で、複数の測定点を設け、その平均値とする
  • 検証する項目以外の設定は、一部を除きすべてデフォルトとする(エコーキャンセルだけOFF)



    【音質検証結果】

    (夜中に録音している関係上、音量は小さめです。)

    <音声の元データ>



    [検証結果一覧]
    メニュー 項目 状態 デフォルト
    設定
    遅延時間 録音データ
    ネットワーク コンパクトSIPを使用 OFF 379ms
    ON   373ms
    ICEを有効 OFF 379ms
    ON   366ms
    メディア エコーキャンセル OFF   379ms

    ON 388ms

    エコー除去 300ms 200ms
    エコーモード シンプル 自動
    音声検出 OFF 379ms

    ON   365ms

    メディア品質 4 379ms

    2   365ms

    クロックレート 8kHz   383ms

    16kHz 379ms

    44.1kHz   411ms

    音声フレーム ptime 5   344ms

    10   370ms

    15   424ms

    20 379ms




    【検討・考察】

    <ネットワーク>

    [コンパクトSIPを使用]
    ONにすると遅延時間が若干改善されました。誤差だとは思いますが、ONにしたときの副作用もないため、ONで使います。


    [ICEを有効]
    ONにすると遅延時間が若干改善されました。ネットワーク上の最短ルートを通ったのか判断はできませんが、これも上記と同様ONにします。


    <メディア>

    [エコーキャンセル]
    これをONにしても音質にはほとんど影響がないようです。しかし、ONで遅延時間が増加しています。
    これは、エコーをキャンセルするために、時間的バッファが必要になるためです。
    OFFに設定します。


    [音声検出]
    良い意味で予想を裏切ってくれました。
    これをONにすることで遅延が改善されています。
    無駄な処理を無くすことで負荷が減るのでしょうか?理由はわかりませんが、ONで使用します。

    以前、これをテストしたときは、ONで明らかに音質が落ちたのですが、そのときはエコーキャンセルと一緒に設定していました。
    もしかすると、単体での使用に威力を発揮する?いずれにしてもONでしばらくは様子見です。


    [メディア品質]
    予想を外しました。
    これは、どうやらメディアストリームのことではないようです。2に設定すると、遅延は若干改善されるのですが、それ以上に音質が劣化します。
    デフォルトの4で使用します。


    [クロックレート]
    クロックレートの変更で音質はほとんど変化しないようです。44.1kHzの時だけ音質が若干まろやかになったような気がします。(プラシーボかも・・・)
    いずれにせよ、レートの増加で遅延時間も増加します。
    これは、16kHzで使用します。


    [音声フレーム ptime]
    5にときに激的に遅延が改善されます。しかし、激的に音質が劣化します。
    10~20ではもうほとんど変化がありません。遅延は15のときには増加しています(誤差?)。
    それでしたら20で十分です。



    【最適なCSipSimpleの設定】

    以上のことをまとめます。
    「G-Call050」に最適な「CSipSimple」の設定は次のとおりです。

    <ネットワーク>
  • コンパクトSIPを使用
         → ON
  • ICEを有効
         → ON


    <メディア>
  • エコーキャンセル
         → OFF
  • 音声検出
         → ON
  • メディア品質
         → 4
  • クロックレート
         → 16kHz
  • 音声フレーム ptime
         → 20ms

    (コーデックは SILK 8kHz のみ使用)


    なお、コネクションキープアライブの設定は自分の環境に合わせて、適宜設定します。

    私の設定は以下のとおりです。
    これは、何も検証していない適当な数値です。

    WiFi UDPキープアライブ:600
    モバイル UDPキープアライブ:600
    WiFi TCPキープアライブ:600
    モバイル TCPキープアライブ:600
    WiFi TLSキープアライブ:3600
    モバイル TLSキープアライブ:3600

    その他は全てデフォルトです。


    以上の最適化をすべて行ったものと、デフォルトを比較しました。

    回線種別 状態 遅延時間 録音データ
    Wi-Fi(光) デフォルト 382ms

    最適化 387ms

    3G回線 デフォルト 577ms

    最適化 496ms


    Wi-Fi接続時はほとんど変化がありません。。
    3G回線の方は、激的に遅延が改善されています。真偽の程はわかりませんが、データ上の結果は非常に良好です。

    これは、短期間で結論が出せる話ではないため、今回の検証により最適化した(つもりの)「CSipSimple」と「G-Call050」で、しばらく使用してみて実証実験をしたいと思います。

    結果は後ほど追記します。
        
  • 6 件のコメント :

    1. 以前、通話料を半額にする呪文「0063」 のエントリで、Prefixerについてのコメントさせていただいた際、この記事はだいぶ先になるかなと思っていましたが、早速貴重な検証&パラメーター情報ありがとうございました!

      私の方は、wertさんから譲っていただいた?パラメーターの調整はしていませんでしたが、Androidのroot端末なしでもG-Call050のSIP情報が取れましたので、「G-Call 050」のSIP情報を抜く方法  のエントリに概略について投稿させていただきました。

      返信削除
      返信
      1. 早速のコメントありがとうございます。

        あらためて検証してみると、CSipSimpleのデフォルト設定は、高速のSIPサーバを想定しているように感じました。
        そのため、そのまま使ってもG-Call050にかなり適した設定になっています。

        (最適化適用前後のデータも追記しました)


        root化なしでのSIP情報の取得方法の掲載ありがとうございます。向こうにコメントさせて頂きましたが、これはぜひ記事にさせてください。

        削除
      2. ありがとうございます。
        CSipSimpleのパラメータ値をピンポイントで記述している記事は他にもありますが、各設定項目の解説までしているのは、たぶん、ここだけですね!

        というわけで、パラメーター設定のさらなるブラッシュアップ記事も期待してます!!

        追伸
        掲載していただいている、「最適化適用前後のデータ」ですが、「無効なソース」と表示されていて、再生が出来ないです..IE9にて

        削除
      3. >ブラッシュアップ記事

        ま~た~!
        多分、もうデータ上の数値での検証は難しくなるでしょうから、あとは感覚によるものになるかと思います。しかし、感覚による検証は正確さが大幅に落ちるので、時間をかけて行ないたいと思います。(Goさんによる情報提供も期待しています!)

        実際に、あと詰められるところとしては、「ptime」と「メディア品質」と思っています。
        「ptime」は検証では15で結果が出ませんでしたが、実際はG-Call050と最近の“ハイスペックスマホ”ならば10~15ぐらいの使用にも耐え得る気がします。
        「メディア品質」は、これ自体の意味が理解できていないので(単純に音が良くなるだけ?)、今度は数字を上げた検証が必要かな、と思っています。


        不具合報告ありがとうございます。
        IE9用の設定を忘れていました…。

        今回IE9に対応したつもりですが、これでも再生出来なかったら、お手数ですがまたお知らせ頂けないでしょうか。

        IE9はHTML5の挙動が不思議で、データが読み込まれるときと読み込まれないときがあります。
        これでダメならHTML5以外の方法を考えようと思います。

        削除
    2. このコメントは投稿者によって削除されました。

      返信削除
      返信
      1. 真木英心さん

        非常に参考になる報告をありがとうございます!
        いや、読み入ってしまいました。

        ご報告を読ませて頂いた限り、PCMuだとパケットが渋滞しているように思えます。
        IIJmioはUPの絞り方がかなりきついので、きっと上流回線側が詰まっています。

        音声データを符号化する際の最低時間を除けば、PCMu(G711コーデック)が最もCPU演算量が少なく、理屈的には一番遅延は少なくなります。
        更にSH-02EほどのCPUであれば、各コーデックの圧縮行程も微々たるものと思えます。

        以上のことから真木さんの環境では、GSMよりCPU負荷はかかりますが、高圧縮・高音質のG729aが最適のように思えます。

        ですが、CSipSimpleのG729a追加コーデックは非常に高価です。
        もし、試してみるときは15分以内にテストして返金すると良いです。(良好であればそのまま購入)
        なお、私の機種(P-06D)ではG729aで音質がかなり悪くなりました。(>_<)

        と、私の考えを押し付ける如く綴ってしまいました。すみません。


        真木さんと似た環境の人は相当数いると思います。
        有益な情報をありがとうございました!

        私もTCPオフ試してみますね。

        削除