Asteriskの研究



トラブルシューティング#1(エコー問題)

現象

  Asteriskでは、しばしば相手の声や、自分の声が反響したり、
山彦のように響いて聞こえたりする「エコー」が問題になります。
Asteriskというか、SIPなど音声を電線ではなくデータにしてから
伝送するものにはかならずついて回る問題です。
ここでは、このエコーの問題を考えて見ます。

しくみ

  エコーが起きる理由は、様々にあって、簡単には説明できませんが、
大雑把な解釈としてあげるとすれば、話者が発した声が電話線を通って
相手に届いたときに、相手側の電話機のスピーカから出た音を同じ電話機の
マイクが拾ってしまい、そのマイクが拾った音が電話線を伝って話者の
スピーカから聞こえてしまうということです。

このとき、音が戻ってくる時間が早いと、エコーしたかどうかわからないので
気になりませんが、何かの理由で戻ってくる速度が遅いと、エコーしていると
知覚してしまいます。

さらに、話者の声を戻してしまうポイントは相手の電話機に限らず、
様々な要因が考えられます。

解決の糸口

  まず、いかなる場合でも、家庭のアナログ電話機と同じ品質の通話が
できなければだめだというお客さんには、エコーの解決は難しいです。
高額なエコーキャンセラでも入れれば改善されるかもしれませんが。

ですので、エコーの根本解決は難しいという前提で考えていかなければだめです。
エコーをなくすのでなく、エコーをさせにくい状態にするというスタンスです。

エコーをさせにくい状態を作る方法ですが、
「話者が発した音のボリュームは小さく、耳に届く直前のスピーカ側のボリューム調整で音量をあわせる」
つまり、発話側の音量は小さくし、音量自体は受話側の末端で調整するというのが鉄則らしいです。

対処方法

  送話のボリュームを調整するためには、Asteriskに付属しているツールが便利です。
zaptelフォルダにある『ztmonitor』ツールがそれです。

やりかたは簡単です。

ztmonitor <チャンネル番号> -v

というコマンドを投入し、そのチャンネルを使って電話をかけます。
すると、声の大きさに合わせて、ボリューム表示が伸びたり縮んだりするはずです。

txは送話側、つまりこちらの音声、rxは受話側つまり相手の音声の大きさです。
このボリューム表示が振り切れていると、音量が大きすぎます。

音量を調節するには、/etc/asterisk/zapata.conf の rxgain 及び txgain の
値をマイナス値にしてみてください。

そしてAsteriskを再起動し、もう一度ztmonitorを実行して電話をかけ、音量を
チェックします。
これを、メーターが振り切れなくなるまで繰り返します。

Asteriskのエコーキャンセル関係の設定項目の代表的なものには、 echocancel = yes
echotraining = yes
echocancelwhenbridged=yes
などがあります。
これらは、/etc/asterisk/zapata.conf にあります。
上に戻る


トラブルシューティング#2(IAXの遅延問題)

現象

  IAXで接続されている端末との通話で音声の著しい遅延が発生する。
特に、受話か送話のどちらか一方のみが遅延するような現象が発生する。

例としては、こちらが話した内容は相手に即座に聞こえるが、
相手が話した声はしばらくたたないと聞こえない

原因

  IAXプロトコルで受話か送話どちらかだけが遅延する場合、
AsteriskサーバとIAX端末の間の時刻が狂っている可能性があります。
特に、WindowsXPなどでは、時刻の修正を一度に行わず、
正しい時刻に徐々にあわせていくSlewというモードで時刻が
修正されるためこの現象が発生しやすいです。

実際に遅延が発生しているかどうかをチェックする方法ですが、Asterisk CLIのコマンドで
iax2 show peersと入力したときに表示される
『LAG』という表示が遅延の大きさを表します。

対処方法

  Win32Timeというサービスが時刻同期を制御しています。
これを停止するか、時刻を供給しているサーバとPCの間の
時差をなくすことで、現象を抑えることができます。
上に戻る


トラブルシューティング#3(不出時のアナウンス問題)

現象

  INS1500回線などを接続している環境で、
間違い電話や移転番号に電話をかけてしまったときに、
『おかけになった電話は現在使われておりません』などの
局側で再生する音声メッセージをデフォルトの状態では聞くことができません。

原因

  ISDNのプロトコル(Q.931)で、相手が電話に出なかった場合等に
網側から送られてくるイベントをAsteriskが受け取ると、即座に呼を切断して
しまうことが原因です。

対処方法

  Libpriを修正する必要があります。
この修正が必要な方はFritzが個別に対応しますので、
メールを送ってください。

改修方法のヒント

  libpriのなかのq931.cを改造します。
q931_receive()という関数のなかで切断イベント(Q931_DISCONNECT)を
ハンドリングしている部分がありますが、ここで、切断理由コードが
16の場合でかつ呼が生きている場合(c->aliveが真のとき)のみ
HangUpイベントを発行しないように修正すれば直ります。
この修正を加えた場合、当然のことながらこちらから呼を切るまで
接続を保ちます。
上に戻る


トラブルシューティング#4(INS1500がつながらない!)

現象

  Asteriskは各国のISDNの規格に準拠したプロトコルを実装しています。
ところが!
Asteriskのコンフィグレーションには日本のNTTのINS1500は
ありません・・・。
むりやりINS1500を接続しても、着信はなんとかできるものの発信は一切できません。

原因

  ISDNの規格では、発着信しようとしている電話番号の先頭に、
番号種別コードというのをくっつける必要があります。
これは、国際通話とか市外通話など通話の種類を特定するための
キーになる値です。
外国のISDNではすべてこの種別コードが正しく扱われているのですが、
なぜか日本のINS1500はこの種別コードの扱いが違うために
発信時に電話番号の先頭に種別コードを設定して送信すると
網側でその番号を却下してしまうことが原因です。

対処方法

  Libpriを修正する必要があります。
この修正が必要な方はFritzが個別に対応しますので、
メールを送ってください。

改修方法のヒント

  主にlibpriのなかのq931.cを改造します。
送出しようとする番号種別コードをPRI_UNKNOWNにすることで
発信もできるようになります。

ある方より、お問い合わせがありましてFritzのほうで
パッチを作成したところ、ちゃんと動作したとのことなので
そのパッチを一応UPしときます。

isdn-patch-002.tar

asterisk1.2.24とlibpri1.4.1用のパッチです。
パッチ適用後、、/etc/asterisk/zapata.conf に
switchtype=ntt を入れればOKなはずです。
上に戻る

 戻る