VoIP回線でファックスを使う
https://note.com/sqm/n/nbd0c545fd63e
twilio でファックスを使う
クラウドPBX として使える twilio は、回線の調達、電話番号の確保などが随時API経由で行えてとても便利なのですが、扱うのがニガテなものもあります。
一般の電話回線で当たり前に使われている、ファックス(FAX、ファクス、ファクシミリ)です。2021年現在、世界をみると日本以外ではファックスはほぼ絶滅しています。互換性に乏しいファックスは、同じ規格に対応した機械同士でしかやりとりできないため、どうしてもドメスティックな環境でしか使えず日本以外ではもっと便利な電子メイルになっています。(日本でも電子メイルを使えばいいんですが、なぜか?ファックスは根強い人気があります。件名が必要ないのがいいんだろうか)
一般家庭ではアナログ回線と ITU-T T.30 V.17(通称G3)ファックス、企業ではアナログ回線に ITU-T T.30 V.17(通称G3)ファックス、もしくは ITU-T T.30 V.34(通称スーパーG3)ファックスが使われています。INS回線を使ったさらに高速高解像度の ITU-T T.62/T.70(通称G4)ファックスもありますが、INS回線自体が 2025年を目処に廃止が決まっているので、ビジネス用複合機などでは VoIP に対応した ITU-T T.38(通称 FoIP)に置き換えが進んでいます。
ファックスの原理は、原稿を読み取ったら、その濃淡(というか、白黒2値)をオーディオ信号に置き換えて相手方に送り、受け取った方は信号を濃淡(白黒)に戻して画像に戻します。
オーディオ信号のやりとりさえできればいいので、途中の経路は電話回線である必要はありません。これなら、カンタンに VoIP に置き換えられそうな気がします。
しかし現実的には、VoIP でファックスを扱うのはとても困難です。例えば、ファックスモデムが出力するオーディオ信号を、携帯電話のマイクに入れて相手方に送り、相手方のファックスで受け取れるでしょうか。できそうなものですが、実際にはほぼ動きません。
なぜかというと、携帯電話で音声を送るときにはマイクに入ってきた信号をそのまま送るわけではないからです。帯域を節約するため、携帯電話では音声を「人間が言葉をしゃべっている」前提でデータを間引きをして高圧縮の信号を作り出します。この過程で、もとの音声に含まれていた多くの情報は失われているので、着信した側ではもとに戻せなくなっています。これは極端な話、通話の内容さえ伝わればよく、「音声を文字起こし」したものをテキストデータで送って「音声読み上げ」しても通話としては成り立ちます。(双方が VoLTE など、高ビットレートな通話なら、ギリ通るかもしれません。高ビットレートの PHS回線ではファックスが送れることもありました)
twilio など、VoIP で扱う音声も同じように、帯域を節約するためにデータの大幅な圧縮を行います。この手法を(規格化したものを)コーデックと呼んでいますが、一般的に使われるどのコーデックを使っても必ず圧縮されます。(技術的には無圧縮、可逆圧縮のコーデックも作れますが、電話で使うメリットが "ほぼ" ないので普及していません)
twilio では ITU-T G.711 μ-law と ITU-T G.711 A-law しか扱えません。どちらも遅延が少なく、ビットレート64kbps前後という、「高音質」で「圧縮率の低い」コーデックです。
G.711 μ-law を使ったとしても、ファックスで扱う信号をやり取りしようとすると、80~96kbps は安定して必要になってきます。あとは、ファックスの信号自身が持っているエラー訂正に頼る形になります。
twilio 以外の 050IP電話サービスでは、G.711 μ-law に非対応のものもたくさんあります。たとえばユーザの多い NTT Communications系の 050 plus では G.729a しか使えません。これは品質の悪い回線でも通話ができるようにデータ量を抑えたコーデックで、その代わりに遅延が激しく、音質も悪いです。
NTT Communications系の IP電話では、他の IP電話事業者と直接接続をせず、接続インタフェイスは PSTN経由になっているので他社とコーデックの仕様を合わせる必要がありません。(相互接続事業者間では、コーデックが異なると、コーデック変換処理が必要になる(=コストが掛かる)ので、ユーザが使うコーデックを統一する事業者が多い)
そこで、VoIP回線しかない状況でファックスを使う場合は、これまでのように音声信号を使ってデータをやりとりするのではなく、画像は画像データとして送るという規格を使います。これが、T.38 ファックスです。
しかし、ファックスの規格は送受信のそれぞれが同じ規格に対応している必要があります。こちらが T.38 ファックスを使っていても、相手が T.38非対応の環境ではやり取りができません。
T.38対応の相手とは T.38で、T.38非対応の相手とは T.30 で、という対応が必要になります。ファックス機自体はアナログ回線しか収容できなくても、VoIPゲートウェイが対応していれば使えます。例えば、NTT東西系(と各コラボ)のひかり電話を使っているユーザに貸与される HGW の FXSポートは、T.38対応になっているのでここに市販のファックスを接続するだけで T.38ファックスとして使えます。
VoIP上に T.30規格の音声信号を(RTPパケットとして)流すことを、「みなし音声方式」ファックスと呼んだりします。
前提が長くなってしまいましたが、twilio の回線と、市販のファックス機を使って、「みなし音声方式」でのファックスの送受信が成功したので設定内容をシェアしたいと思います。
VoIPゲートウェイ、Grandstream HT802
twilio の回線は SIP、市販のファックス機はアナログ回線ですから、これを物理的につなげる必要があります。これをつなげるための機械を、VoIPゲートウェイ、ATA などと呼びます。VoIP回線とアナログ電話機をつなげる ATA は、FXSポートを備えたものが必要です。
いま、安い ATA といえば、Grandstream HandyToneシリーズ一択という状況です。むかしは Linksys(後に買収され、Cisco)SPA3000シリーズという名機があったのですが、2021年現在は終売になっていて中国製のパチモノしか手に入りません。
今回は、Grandstream HT-802 という、2 SIPアカウントにレジストでき、2 FXSポートを備えた ATA を使います。
twilio での SIPアカウントの発行(SIP Domain、Credentials、SIP Registrtation)、各種ルーティング設定などは割愛します。ある 050番号宛の着信を、今回設定に使う SIPアカウントに着信する、そしてこの SIPアカウントからの発信を 050番号から PSTN へ発信する、という下準備が整っているものとして進めます。
Grandstream HT-802 の FXSポートの設定は非常に項目が多い上にわかりづらく、装置自体もあまり安定して動くものではないので設定が困難です。(Grandstream の製品はむかしから全体的にこんな感じです。非力な CPU に、あまり練られていないファームウェアを載せてくるので、どうしても動作が不安定気味です)
設定の要となるところだけピックアップして説明します。
Primary SIP Server はエッヂロケーションサーバ名を入れます。
いままでの設定例だと、ポート5061 と TLS(TLS over TCP)を使っていましたが、なぜかうまく動かなかったので UDP としました。(もう少し、動作を検証してみます)
SIP User ID と Authenticate Password は twilio console の Credential で作ったものです。ユーザ名は紐付けた 050電話番号を使って twilio 側のルーティングで楽をしています。もちろん、fax などの英数字を使ったユーザ名を使っても構いません。(この場合、twilio 側の function などで電話番号とユーザ名の紐付けが必要です)
Register Expiration は SIP Registration の消費期限です。ファックスを置くということは固定回線環境でしょうから、10~60 の間で指定します。(10以下、60以上は twilio から怒られます)
Enable SIP OPTIONS/NOTIFY Keep Alive はルータの NAPTテーブルを維持するために、定期的なパケットを送出することを目的としています。上記の Register Expiration を設定したため、5分置き(10分で設定したので、その半分程度)に SIP REGISTER を送るはずなので、No でも問題ありません。念のため(?)、OPTIONS を送るようにしてあります。(とつぜん、ルータが落ちて NAPTテーブルが破棄された場合など?のために)
Support SIP Instance ID は使われていない古い規格のための機能なので、No にしておきます。
Check SIP User ID for incoming INVITE は P2P での direct IP calling を使うときは No にしますが、ファックス機で P2P direct IP calling がくることは皆無だと思われるので、Yes にします。(twilio 経由での INVITE しか取らない)
Allow Incoming SIP Messages from SIP Proxy Only も P2P の direct IP calling のための設定です。使わないので Yes にします。
訂正追記:
Twilio はどうも SIP Registration に使ったサーバから必ずパケットが来るわけではなく、様々な IPアドレスが送信元に使われるようです。
Check SIP User ID for incoming INVITE と Allow Incoming SIP Messages from SIP Proxy Only は No にしておいたほうが良いかもしれません。
Preferred DTMF method はダイヤルやボタンの操作をどうやって送るかを決めますが、twilio は RFC2833 が使えるのでプライオリティの最上位を RFC2833 にしておきます。すべて RFC2833 でも良いです。In-audio は音声信号にして RTPパケットに載せて送ります。
Call-Waiting は NTT東西でいうところのキャッチホンのことです。ファックス機でキャッチホンを使うことはないので、Disable にしておきます。
Ring Timeout は呼び出し時間です。ファックス機なので呼び出し時間ゼロでとるはずなので、デフォルトの 60 で構いません。0 にしておけば永遠に呼び出し続けます。
SUBSCRIBE for WMI は留守番電話が録音されたときに、録音済みのメッセイジがあることを知らせて、電話機などの LED ランプを光らせる設定です。ファックス機単体だとあまり意味がありません。たとえば、IP-PBX でこれを受信すれば、ファックスの受信があったことを他の SIP電話機の LEDランプなどでお知らせすることができます。要らなければ、No のままで大丈夫です。
Preferred Vocoder は通話に使うコーデックの指定です。PCMU(ITU-T G.711 μ-law)以外を使うとトラブルのもとなので、すべての候補を PCMU にしておきます。(PCMU と PCMA 以外では帯域が足りなかったり、圧縮率が高すぎて、ファックスは送れません)
Fax Mode は Pass-Through とします。「みなし音声方式」を使って、T.30ファックスのやり取りをオーディオ信号として RTPパケットに載せます。相手が T.38対応ファックス機のみとわかっていれば、T.38 で大丈夫です。(例えば、支社間、特定の取引先との間でしか使わないなど)
Re-INVITE After Fax Tone Detected は T.38方式を使う場合は Enabled にします。今回は Pass-Through なので Disabled にしてあります。
Jitter Buffer Type と Jitter Buffer Lengh はジッター軽減のためのバッファの設定です。通話の場合、ここを大きくしてしまうと途切れは少なくなるものの、音が遠くなる(遅延が大きくなる)ため、なるべく小さくしたいのですが、ファックスの場合は遅延は大きな問題ではなく、ジッターのほうが敵なのでバッファを最大限大きく確保するようにします。Fixed と High の組み合わせで使います。(なんで Large じゃなくて、High なんだろう?)
SLIC Setting と Caller ID Scheme はナンバーディスプレイの方式です。日本の電話機なら、JAPAN CO と NTT Japan の組み合わせで使えます。
Polarity Reversal は極性反転の設定です。相手が電話を切ったときに、こちらに電話が切れたことを電話線の極性を反転することで知らせる仕組みです。これがなくても、受信側では busy tone を検出しているので必要ないはずなのですが、相性問題で busy tone を聞き取れない機器があるかもしれないので念のために入れておきます。
Loop Current Disconnect は電話を切ったときに電話線を一瞬、切断させるかの設定です。これもなくても動作するはずですが、念のために入れておきます。
Enable Hook Flash はキャッチホン(Call-Waiting)を取る動作(受話器を一瞬置く)を取得するかの設定ですが、そもそもキャッチホンは使いませんしファックス機でフックフラッシュ(キャッチホンをとるため、受話器を一瞬だけ置く動作)は使わないので、No にしておきます。
Disable Line Echo Canceller(LEC) と Disable Network echo Suppressor はエコーキャンセラの設定です。使っても構わないと思うのですが、一部のファックス機で動かないことがあるらしいので、Yes(= Disabled)にしておきます。T.30ファックスの通信の中でエラー訂正が行われるので、多少のエコーがあっても通信できるようです。
概ね、このパラメータの組み合わせで送受信が行えるようになりました。PSTN網(アナログ回線)に接続したファックス機同士で動作テストしています。
インクジェット複合機、EPSON PX-M885F とレーザージェット複合機、Brother MFC-8380DN
1台は EPSON PX-M885F というインクジェット複合機です。とても使いやすく気に入っているので、機会があれば紹介したいと思います。
もう一台は 2012年から稼働している brother の MFC-8380DN というモノクロレーザージェットファックス機です。当時、数少ない IPv6対応機種ということで導入してみたものの、肝心の IPv6まわりはバグだらけで使い物にならず、9年の稼働であちこちが壊れてきたので前述 EPSON PX-M885F に代を譲りました。ファックスの送受信は使えるので今回の実験のために供出されました。
それぞれのファックスを PSTN網、VoIP網につないでお互いに送受信を行うクロス形式で 4通りのテストをやっています。
まず、EPSON PX-M885F に関しては、PSTN網、VoIP網での送受信はまったく問題ありません。一方、brother MFC-8380DN に関しては PSTN網で使った場合には問題はなかったのですが、VoIP網(Grandstream HT-802経由)に接続した場合、送信は問題ないのですが、受信ができたりできなかったりでした。
原因としては、Grandstream HT-802 が brother MFC-8380DN のオフフック(着信)を認識してくれないことがあります。こればかりは、アナログ信号レベルの話なので設定などではどうにもならず、相性問題ということで解決を諦めました。着信することもあるので、なんかタイミングなどでちょっと合わないところがあるのかもしれません。
2台間でのテストに加えて、ブラザーのファクス送受信テスト用番号、052-824-4773 も使いましたが送受信ともできました。余談ですが、この着信先の番号はここから徒歩圏内の某ビルだったりします。
別の機会に、twilio の VoIP回線同士でのファックスのやりとりを紹介します。
目次
twilio に SIPクライアントを追加するときの注意(特にスマホ)
クラウドPBX、twilio を VoIPフォンで使う(Panasonic KX-UT248)
VoIP回線でファックスを使う (この記事)