(57)【要約】【課題】音声等の通信品質を向上できるパケット受信制御方法及びその装置並びにそのプログラムを提供する。【解決手段】受信したパケットを符号化された状態で符号化音声バッファ113に格納し、遅れて到着するパケットや逆の順序で到着するパケットの整列を符号化音声バッファ113上において行い、符号化音声バッファ113に格納されているパケットに含まれるサンプリングデータを実際に利用する直前に、符号化音声バッファ113に格納されているパケットを音声データ復号処理部114によって復号化処理して得られたサンプリングデータを復号済音声バッファ115に格納し、復号済音声バッファ115に格納されているサンプリングデータを読み出して音声出力処理を行う。【選択図】図２
2006121401.tif 000002
【特許請求の範囲】
【請求項１】
連続した信号を所定周期毎に切り取り、該切り取った信号を前記周期よりも短いサンプリング時間毎にサンプリングして得られた複数のサンプリングデータを含むフレームを生成すると共に該フレーム毎に、該フレームを含む符号化パケットを生成して順次送信する送信装置から通信網を介して前記符号化パケットを受信し、前記受信した符号化パケットを復号し該パケットに含まれる前記フレームを抽出して該フレームに含まれるサンプリングデータをバッファに格納し、バッファに格納されているサンプリングデータに対して読み出し処理を施すコンピュータ装置を用いたパケット受信制御方法であって、
前記コンピュータ装置は、
受信したパケットを符号化された状態で第一バッファに格納するステップと、
遅れて到着するパケットや逆の順序で到着するパケットの整列を前記第一バッファ上において行うステップと、
前記第一バッファに格納されているパケットに含まれるサンプリングデータを実際に利用する直前に、前記第一バッファに格納されているパケットを復号化処理して得られたサンプリングデータを第二バッファに格納するステップと、
前記第二バッファに格納されているサンプリングデータを読み出すステップとを実行する
ことを特徴とするパケット受信制御方法。
【請求項２】
前記コンピュータ装置は、
パケットを受信した時刻を取得するステップと、
受信したパケットを送信された順に整列し、該パケットの受信時刻と組にして第一バッファに格納するステップと、
第一バッファに保持された任意のパケットの受信時刻を取得するステップと、
時刻ごとに異なる第二バッファの読み出しアドレスに対応した時刻を取得するステップと、
前記第一バッファ上のパケットのサンプリングデータを、サンプリング単位のアドレスで指定してサンプリングデータの書き込み及び読み出しを行うことのできる前記第二バッファに書き込むための書き込みアドレスを決定するステップと、
第一バッファに保持されたデータのうち、第二バッファの読み出しアドレス領域に含まれる音声データを復元するのに必要なサンプリングデータだけを第一バッファから取り出して復号するステップと、
前記決定された第二バッファへの書き込みアドレスを先頭とする所定のアドレス領域に、前記第一バッファから取得したサンプリングデータを書き込むステップと、
前記第二バッファへサンプリングデータを書き込んだ後に、前記第二バッファの前記読み出しアドレスから当該読み出しアドレス領域に書き込まれているサンプリングデータを読み出すステップとを実行する
ことを特徴とする請求項１に記載のパケット受信制御方法。
【請求項３】
前記コンピュータ装置は、
前記第二バッファへの書き込みアドレスを決定するステップでは、前記パケットの受信時刻と前記第二バッファの読み出しアドレスに対応した時刻とに基づいて前記第二バッファへの書き込みアドレスを決定するステップを実行する
ことを特徴とする請求項２に記載のパケット受信制御方法。
【請求項４】
前記コンピュータ装置は、
前記第二バッファへの書き込みアドレスを決定するステップでは、前記第二バッファに既に書き込まれたサンプリングデータとの相対位置が、前記受信パケットが送信されたときの相対時刻をアドレスの差に換算したものと等しくなるように前記第二バッファへの書き込みアドレスを決定するステップを実行する
ことを特徴とする請求項２に記載のパケット受信制御方法。
【請求項５】
前記コンピュータ装置は、
読み出し処理時点での第二バッファの読み出しアドレスに対応した時刻から第一バッファから第二バッファへのデータ書き込み処理対象となっているパケットを受信した時刻を減算し、該減算結果に対して揺らぎ吸収のための余裕時間を加算した値に単位時間当たりのサンプル数を乗算した値を、読み出し処理時点の第二バッファの読み出しアドレスに加算して、前記第二バッファへの第一データ書き込みアドレスを決定するステップと、
直前に第二バッファにデータを書き込んだときの第二バッファにおける基準アドレスに対して、第一バッファから第二バッファへのデータ書き込み処理対象となっているパケットに含まれるタイムスタンプに相当する値を加算して、前記第二バッファへの第二データ書き込みアドレスを決定するステップと、
前記第一バッファから第二バッファへのデータ書き込み処理対象となっているパケットの受信時刻に基づいて、該パケットに含まれるサンプリングデータに対する前記第二バッファの書き込み可能アドレス領域を決定するステップと、
前記第二書き込みアドレスが前記書き込み可能アドレス領域に入っているときに、前記第二書き込みアドレスにデータを書き込むステップと、
前記第二書き込みアドレスが前記書き込み可能アドレス領域に入っていないときに、前記第一書き込みアドレスにデータを書き込むステップとを実行する
ことを特徴とする請求項２に記載のパケット受信制御方法。
【請求項６】
前記第二バッファの読み出し領域内にデータが存在しないとき、該読み出し領域に存在すべきサンプル数以上の補間データを生成して補償処理を行うステップを実行する
ことを特徴とする請求項１乃至請求項５の何れかに記載のパケット受信制御方法。
【請求項７】
前記第一バッファに所定量以上のデータが格納されているいるときに、該データのうちの所定のデータを破棄するステップを実行する
ことを特徴とする請求項１乃至請求項５の何れかに記載のパケット受信制御方法。
【請求項８】
連続した信号を所定周期毎に切り取り、該切り取った信号を前記周期よりも短いサンプリング時間毎にサンプリングして得られた複数のサンプリングデータを含むフレームを生成すると共に該フレーム毎に、該フレームを含む符号化パケットを生成して順次送信する送信装置から通信網を介して前記符号化パケットを受信し、前記受信した符号化パケットを復号し該パケットに含まれる前記フレームを抽出して該フレームに含まれるサンプリングデータをバッファに格納し、バッファに格納されているサンプリングデータに対して読み出し処理を行うパケット受信制御装置であって、
パケットを受信する手段と、
受信したパケットを符号化された状態で第一バッファに格納する手段と、
遅れて到着するパケットや逆の順序で到着するパケットの整列を前記第一バッファ上において行う手段と、
前記第一バッファに格納されているパケットに含まれるサンプリングデータを実際に利用する直前に、前記第一バッファに格納されているパケットを復号化処理して得られたサンプリングデータを第二バッファに格納する手段と、
前記第二バッファに格納されているサンプリングデータを読み出す手段とを備えている
ことを特徴とするパケット受信制御装置。
【請求項９】
パケットを受信した時刻を取得する手段と、
受信したパケットを該パケットの受信時刻と組にして保持する第一バッファと、
受信したパケットを送信された順に整列して、受信時刻と共に前記第一バッファに格納する手段と、
前記第一バッファに保持された任意のパケットの受信時刻を取得する手段と、
前記第一バッファから任意のパケットを取り出す手段と、
前記第一バッファから取り出したパケットからサンプリングデータを取得する手段と、
サンプリングデータをサンプリング単位のアドレスで指定して書き込み及び読み出しを行うことのできる第二バッファと、
時刻ごとに異なる前記第二バッファの読み出しアドレスを取得する手段と、
前記第二バッファの読み出しアドレスに対応した時刻を取得する手段と、
前記第一バッファ上のパケットのサンプリングデータを前記第二バッファに書き込むための書き込みアドレスを決定する手段と、
第一バッファに保持されたデータのうち、第二バッファの読み出しアドレス領域に含まれる音声データを復元するのに必要なサンプリングデータだけを第一バッファから取り出して復号し、前記決定された第二バッファへの書き込みアドレスを先頭とするアドレス領域に前記取得したサンプリングデータを書き込む手段と、
前記第二バッファの当該読み出し処理で読み出される領域に書き込むべきサンプリングデータを含むパケットを第一バッファから全て取り出して該パケットからサンプリングデータを取得し、該サンプリングデータを前記第二バッファに書き込んだ後に、前記第二バッファの前記読み出しアドレスから当該読み出しアドレス領域のサンプリングデータを読み出す手段とを有する
ことを特徴とする請求項８に記載のパケット受信制御装置。
【請求項１０】
前記第二バッファへの書き込みアドレスを決定する手段は、前記パケットの受信時刻と前記第二バッファの読み出しアドレスに対応した時刻とに基づいて前記第二バッファへの書き込みアドレスを決定する手段を有する
ことを特徴とする請求項９に記載のパケット受信制御装置。
【請求項１１】
前記第二バッファへの書き込みアドレスを決定する手段は、前記第二バッファに既に書き込まれたサンプリングデータとの相対位置が、前記受信パケットが送信されたときの相対時刻をアドレスの差に換算したものと等しくなるように前記第二バッファへの書き込みアドレスを決定する手段を有する
ことを特徴とする請求項９に記載のパケット受信制御装置。
【請求項１２】
読み出し処理時点での第二バッファの読み出しアドレスに対応した時刻から第一バッファから第二バッファへのデータ書き込み処理対象となっているパケットを受信した時刻を減算し、該減算結果に対して揺らぎ吸収のための余裕時間を加算した値に単位時間当たりのサンプル数を乗算した値を、読み出し処理時点の第二バッファの読み出しアドレスに加算して、前記第二バッファへのデータ書き込みアドレスを決定する第一アドレス決定手段と、
直前に第二バッファにデータを書き込んだときの第二バッファにおける基準アドレスに対して、第一バッファから第二バッファへのデータ書き込み処理対象となっているパケットに含まれるタイムスタンプに相当する値を加算して、前記第二バッファへのデータ書き込みアドレスを決定する第二アドレス決定手段と、
前記第一バッファから第二バッファへのデータ書き込み処理対象となっているパケットの受信時刻に基づいて、該パケットに含まれるサンプリングデータに対する前記第二バッファの書き込み可能アドレス領域を決定する手段と、
前記第二アドレス決定手段によって決定された書き込みアドレスが前記書き込み可能アドレス領域に入っているときに、前記第二アドレス決定手段によって決定された書き込みアドレスにデータを書き込む手段と、
前記第二アドレス決定手段によって決定された書き込みアドレスが前記書き込み可能アドレス領域に入っていないときに、前記第一アドレス決定手段によって決定された書き込みアドレスにデータを書き込む手段とを有する
ことを特徴とする請求項９に記載のパケット受信制御装置。
【請求項１３】
前記第二バッファの読み出し領域内にデータが存在しないとき、該読み出し領域に存在すべきサンプル数以上の補間データを生成して補償処理を行う手段を備えている
ことを特徴とする請求項８乃至請求項１２の何れかに記載のパケット受信制御装置。
【請求項１４】
前記第一バッファに所定量以上のデータが格納されているいるときに、該データのうちの所定のデータを破棄する手段を備えている
ことを特徴とする請求項８乃至請求項１２の何れかに記載のパケット受信制御装置。
【請求項１５】
連続した信号を所定周期毎に切り取り、該切り取った信号を前記周期よりも短いサンプリング時間毎にサンプリングして得られた複数のサンプリングデータを含むフレームを生成すると共に該フレーム毎に、該フレームを含む符号化パケットを生成して順次送信する送信装置から通信網を介して前記符号化パケットを受信し、前記受信した符号化パケットを復号し該パケットに含まれる前記フレームを抽出して該フレームに含まれるサンプリングデータをバッファに格納し、バッファに格納されているサンプリングデータに対して読み出し処理を行うコンピュータ装置からなるパケット受信制御装置のコンピュータプログラムであって、
前記請求項１乃至請求項７の何れかに記載の処理ステップを含むことを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、音声等のサンプリングデータのパケット通信において、受信するパケットの受信揺らぎを吸収するパケット受信制御方法及びその装置並びにそのプログラムに関するものである。
【背景技術】
【０００２】
従来、複数の送信装置から送信された音声パケットを受信してリアルタイムでミキシング等のリアルタイム処理を行うリアルタイム処理装置の一例として遠隔会議システムが知られている。
【０００３】
この様な、遠隔会議システムでは、複数の遠隔地点にクライアント端末装置を配置し、各クライアント端末装置において音声信号或いは音声信号と映像信号をサンプリングして得られた複数のサンプリングデータを含むフレームを生成し、該フレームをパケット化して各クライアント端末装置から通信網を介してサーバに送信する。
【０００４】
サーバでは、各クライアント端末装置から受信したパケットに含まれるフレームを抽出してミキシングし、ミキシングして得られた音声信号或いは音声信号と映像信号をパケット化して各クライアント端末装置に送信する。
【０００５】
これにより、各クライアント端末装置は全てのクライアント端末装置から送信された音声信号或いは音声信号と映像信号を受け取って再生することができる。
【０００６】
この様な処理装置の一例としては、特開２０００−２８６８８６号公報、特開２００１−０４５０６７号公報、特開２００１−２７４８２９号公報、特開２００２−２０４２５８号公報、特開２００２−１８５４９８号公報に開示される装置が知られている。
【特許文献１】特開２０００−２８６８８６号公報
【特許文献２】特開２００１−０４５０６７号公報
【特許文献３】特開２００１−２７４８２９号公報
【特許文献４】特開２００２−２０４２５８号公報
【特許文献５】特開２００２−１８５４９８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
前述のようなパケットを用いた音声通信を行う場合に、パケットの受信間隔の揺らぎにより、音切れが生じる。また、パケット到着遅延が大きくなると、通話の主観的品質が劣化する。さらに、パケットが通信網で消失したりすることもある。
【０００８】
また、音声通信には高能率な音声符号化方式が用いられる場合が多いが、高能率な音声符号化方式においては、過去の復号結果をもちいて次のフレームの音声を復号するため、符号化された順番に沿って復号化処理を行う必要がある。
【０００９】
音声パケットが遅延したり逆順で到着する場合を考慮すると、復号化処理は実際に音声データを使用する直前におこなうようにして、できるだけパケットの到着を待つ方式とするほうが有利である場合がある。
【００１０】
本発明の目的は上記の問題点に鑑み、音声等の通信品質を向上できるパケット受信制御方法及びその装置並びにそのプログラムを提供することである。
【課題を解決するための手段】
【００１１】
本発明は、上記の目的を達成するために、連続した信号を所定周期毎に切り取り、該切り取った信号を前記周期よりも短いサンプリング時間毎にサンプリングして得られた複数のサンプリングデータを含むフレームを生成すると共に該フレーム毎に、該フレームを含む符号化パケットを生成して順次送信する送信装置から通信網を介して前記符号化パケットを受信し、前記受信した符号化パケットを復号し該パケットに含まれる前記フレームを抽出して該フレームに含まれるサンプリングデータをバッファに格納し、バッファに格納されているサンプリングデータに対して読み出し処理を施すコンピュータ装置を用いたパケット受信制御方法であって、前記コンピュータ装置は、受信したパケットを符号化された状態で第一バッファに格納するステップと、遅れて到着するパケットや逆の順序で到着するパケットの整列を前記第一バッファ上において行うステップと、前記第一バッファに格納されているパケットに含まれるサンプリングデータを実際に利用する直前に、前記第一バッファに格納されているパケットを復号化処理して得られたサンプリングデータを第二バッファに格納するステップと、前記第二バッファに格納されているデータを読み出すステップとを実行する。
【００１２】
また、本発明は、上記の目的を達成するために、連続した信号を所定周期毎に切り取り、該切り取った信号を前記周期よりも短いサンプリング時間毎にサンプリングして得られた複数のサンプリングデータを含むフレームを生成すると共に該フレーム毎に、該フレームを含む符号化パケットを生成して順次送信する送信装置から通信網を介して前記符号化パケットを受信し、前記受信した符号化パケットを復号し該パケットに含まれる前記フレームを抽出して該フレームに含まれるサンプリングデータをバッファに格納し、バッファに格納されているサンプリングデータに対して読み出し処理を行うパケット受信制御装置であって、パケットを受信する手段と、受信したパケットを符号化された状態で第一バッファに格納する手段と、遅れて到着するパケットや逆の順序で到着するパケットの整列を前記第一バッファ上において行う手段と、前記第一バッファに格納されているパケットに含まれるサンプリングデータを実際に利用する直前に、前記第一バッファに格納されているパケットを復号化処理して得られたサンプリングデータを第二バッファに格納する手段と、前記第二バッファに格納されているサンプリングデータを読み出す手段とを備えているパケット受信制御装置を構成した。
【００１３】
該パケット受信制御装置によれば、第二バッファからサンプリングデータを読み出す直前に第一バッファに格納されているパケットを復号して得られた三宇リングデータを第二バッファに書き込むので、遅延したパケットをぎりぎりまで待って復号して第二バッファに書き込むことができる。
【００１４】
さらに、本発明は上記パケット受信制御装置において、パケットを受信した時刻を取得する手段と、受信したパケットを該パケットの受信時刻と組にして保持する第一バッファと、受信したパケットを送信された順に整列して、受信時刻と共に前記第一バッファに格納する手段と、前記第一バッファに保持された任意のパケットの受信時刻を取得する手段と、前記第一バッファから任意のパケットを取り出す手段と、前記第一バッファから取り出したパケットからサンプリングデータを取得する手段と、サンプリングデータをサンプリング単位のアドレスで指定して書き込み及び読み出しを行うことのできる第二バッファと、時刻ごとに異なる前記第二バッファの読み出しアドレスを取得する手段と、前記第二バッファの読み出しアドレスに対応した時刻を取得する手段と、前記第二バッファの読み出しアドレスに対応した時刻と、前記第一バッファに保持されたパケットの受信時刻との差の時間を前記第二バッファ上のアドレスの差に換算して、前記第二バッファの読み出しアドレスに加算し、さらに該加算結果に、所定の余裕時間をアドレスの差に換算した値を加算して前記第二バッファにおける第一バッファ上の当該パケットのサンプリングデータの書き込みアドレスを決定する手段と、該決定されたサンプリングデータの第二バッファへの書き込みアドレス領域の一部乃至全部が、第二バッファの当該読み出し処理で読み出されるアドレス領域内であった場合に、第一バッファから前記パケットを取出すと共に該パケットからサンプリングデータを取得し、前記該決定された第二バッファへの書き込みアドレスを先頭とするアドレス領域に前記取得したサンプリングデータを書き込む手段と、前記第二バッファの当該読み出し処理で読み出される領域に書き込むべきサンプリングデータを含むパケットを第一バッファから全て取り出して該パケットからサンプリングデータを取得し、該サンプリングデータを前記第二バッファに書き込んだ後に、前記第二バッファの前記読み出しアドレスから当該読み出しアドレス領域のサンプリングデータを読み出す手段とを有するパケット受信制御装置を構成した。
【００１５】
さらに、本発明は、上記のパケット受信制御方法および装置において、前記第二バッファの読み出し領域内にデータが存在しないとき、該読み出し領域に存在すべきサンプル数以上の補間データを生成して補償処理を行う手段を備えることにより、パケット消失の判定を行い、パケットが消失しているとき、消失したパケットの前後のパケットが使える場合には前後のパケットを用い、消失したパケットの前のパケットのみが使える場合には前のパケットのみを用い、消失したパケットの後のパケットのみがつかえる場合には後のパケットのみをもちいて消失したパケットの部分に相当する音声サンプリングデータを生成できるようにした。また、消失ではなく遅延した場合にも消失として扱う場合があったが、遅延の場合には、続いて本来のパケットが到着することから、遅延した時間分の音声サンプリングデータを生成しておき、続けて本来のパケットに含まれる音声サンプリングデータを出力するようにすることもできるようにした。
【発明の効果】
【００１６】
本発明によれば以下に示す効果を奏する。
【００１７】
・遅延揺らぎを吸収するためのバッファリング時間を、第二バッファの読み出しアドレスと、書き込みアドレスとの差に換算して、［１／サンプリング周波数］単位の時間分解能で制御することができるので、パケットサイズに依存しない時間単位で揺らぎを吸収することができる。
【００１８】
・実際の時刻としてパケット受信時刻と、第二バッファからの読み出しアドレスに対応した時刻を取得するのみで、後の時間は全てアドレスに換算されて処理されるので、実際に書き込みが完了した時刻や、読み出し処理が行われた時刻が揺らいでいる場合にも、処理時刻の揺らぎの影響を受けにくい。そのため負荷状況によって処理時刻が揺らぐコンピュータ上のソフトウェアとして実現した場合にも品質劣化が少ない。あるいは処理時刻の揺らぎによる品質劣化の度合いを制御可能である。
【００１９】
・音声再生等に必要なサンプリングデータのみを復号処理することで、遅延したパケットをぎりぎりまで待って復号することができ、符号化順序と復号順序の不一致による通信品質の劣化を生じにくい。
【００２０】
・実際に必要なサンプル数だけパケット消失補償処理を行うようにすることができるので、補間されるサンプリングデータの量を最小限に抑え、品質劣化を低減することができる。また、消失補償処理前後のサンプルを必要なだけ変形処理して劣化を目立たなくするような処理を容易に付加することができる。
【００２１】
・揺らぎ吸収がパケット単位でなくサンプル単位で行われること、および処理時刻の揺らぎに対してロバストであることから、例えば、多地点のクライアントからの音声データを複数受信し、同期してミキシングするような応用において遅延を短くすることができる。
【発明を実施するための最良の形態】
【００２２】
本発明は、以下の処理を行っていることを特徴とする。
【００２３】
・遅延揺らぎ吸収制御を受信パケットサイズに制約されない単位で行っている。
【００２４】
・受信パケットの復号化をできるだけ再生直前に行っている。
【００２５】
・サンプリングデータの破棄及びパケット消失補償処理をパケットサイズに制約されない単位で行っている。
【００２６】
・実装される装置のタイマ駆動による処理時刻の揺らぎに依存しない方法を用いている。
【００２７】
また、本発明は、以下の構成要素を有することを最も主要な特徴とする。
【００２８】
＜揺らぎ吸収バッファ制御方式＞
・符号化された状態のままサンプリングデータを保持する第一バッファと、復号済のサンプリングデータを保持する第二バッファとを有する。
【００２９】
・遅延揺らぎを吸収するためのバッファリング時間を、第二バッファの読み出しアドレスと、書き込みアドレスとの差に換算して、［１／サンプリング周波数］単位の時間分解能で制御する。
【００３０】
・第一バッファの読み出しアドレスと、読み出しアドレスに対応した時刻、当該パケットの受信時刻とを用いて、第一バッファへの書き込みアドレスを決定する第一アドレス決定手段と、第二バッファに既に書き込まれた音声データとの相対アドレスで当該パケットに含まれるサンプリングデータの第二バッファへの書き込みアドレスを決定する第二アドレス決定手段を有する。
【００３１】
・第一バッファに保持されたサンプリングデータのうち、第二バッファから読み出して再生されるアドレス範囲に対応するサンプリングデータを得るのに必要なものだけを復号処理して第二バッファに移動する。
【００３２】
すなわち、以下の処理を行うことを特徴とする。
【００３３】
受信したパケットを、送信側端末が送信した順序になるように整列して音声データが符号化されたままの状態で第一バッファに保持し、第二バッファ上に既に書き込まれた音声データが存在しない場合、もしくは、既に書き込まれたデータの末尾サンプルが、第二バッファの当該読み出しアドレスに対して所定の時間をアドレスの差に換算した値を差し引いたアドレスよりも前のアドレスに書き込まれている場合には、サンプリング単位のアドレスで指定してサンプリングデータの書き込み及び読み出しを行うことのできる第二バッファの読み出しアドレスに対応した時刻と、前記第一バッファに保持されたパケットの受信時刻との差の時間を前記第二バッファ上のアドレスの差に換算して、前記第二バッファの読み出しアドレスに加算し、さらに該加算結果に対して所定の余裕時間をアドレスの差に換算した値を加算して前記第二バッファにおける第一バッファ上の当該パケットのサンプリングデータの書き込みアドレスを決定する第一アドレス決定手段によってアドレスを決定する。
【００３４】
次に、第二バッファ上に既に書き込まれた音声データが存在し、且つ、既に書き込まれた音声データの書き込みアドレスとの相対アドレスが、第二バッファ上の音声データと当該受信パケットに含まれる音声データが送信側端末から送信された時刻の差をアドレスの差に換算した値と等しくなるように当該受信パケットに含まれる音声データの書き込みアドレスを決定する第二アドレス決定手段によってアドレスを決定する。
【００３５】
また、上記第にアドレス決定手段によって決定された第二バッファ上の書き込みアドレスが、所定のアドレス領域外になる場合には、第一アドレス決定手段によって決定されたアドレスを第二バッファの書き込みアドレスとする。
【００３６】
そして、第一バッファ上に保持された音声データのうち、上記第一アドレス決定手段もしくは第二アドレス決定手段によって決定された第二バッファの書き込みアドレスが、第二バッファの当該読み出しアドレス領域に含まれるもの、もしくは、第二バッファの当該読み出しアドレス領域に対応した音声データを復元する際に必要とされる音声データのみを第一バッファから読み出して復号し、第二バッファに書き込んだ後に、第二バッファの読み出しアドレス領域から音声データを読み出して、出力する。
【００３７】
＜パケット消失補償処理＞
・第二バッファから読み出して再生されるアドレス範囲に対応するサンプリングデータを含むサンプリングデータが第一バッファに存在しない場合にパケット消失補償処理を起動する。
【００３８】
・パケット消失補償処理から復帰する手段を有する。
【００３９】
すなわち、上記第二バッファの読み出しアドレス領域に書き込まれるべき音声データが第一バッファ上に存在しない場合に、第二バッファ上の読み出しアドレス領域を満たすために必要な最小限の音声データをパケット消失補償処理によって生成する。
【００４０】
第二バッファ上の読み出しアドレス領域を満たすために必要な最小限の音声データのみをパケット消失補償処理によって生成する点が従来のパケット消失補償処理手段と異なる。
【００４１】
以下、図面に基づいて本発明の一実施形態を説明する。
【００４２】
＜＜第１実施形態＞＞
【実施例１】
【００４３】
図１は本発明の第１実施形態における通信システムの一例を示す図、図２は本実施形態における端末の機能構成を示すブロック図である。
【００４４】
図において、１０は端末で、端末Ａ，Ｂ（１０）が通信網２０を介して相互に接続されている。即ち、端末Ａは端末Ｂに対してパケット化された音声信号を送信できると共に端末Ｂから送信された音声パケットを受信できるように端末Ｂと接続されている。端末Ｂは端末Ａに対してパケット化された音声信号を送信できると共に端末Ａから送信された音声パケットを受信できるように端末Ａと接続されている。
【００４５】
端末１０は、周知のコンピューター装置からなり、予め設定されているプログラムによって動作し、パケット処理部１１と、データ取出制御部１２、音声出力処理部１３、送信装置１４を備えている。ここで、端末１０を構成する各構成部分はソフトウェアとハードウェアの双方によって構成されている。
【００４６】
パケット処理部１１は、パケット受信処理部111と、符号化音声データ格納処理部112、符号化音声バッファ（第一バッファ）113、音声データ復号処理部114、復号済音声バッファ（第二バッファ）115、音声データ取出処理部116から構成されている。
【００４７】
データ取出制御部１２は、所定の一定周期毎、たとえば２０ｍｓ毎に、第二バッファの読み出しアドレスと読み出しアドレスに対応した時刻を更新し、音声データ取出処理部114の処理を起動する。
【００４８】
音声出力処理部１３はパケット処理部１１から出力される音声信号をスピーカから出力する。
【００４９】
尚、本実施形態においては、パケット処理部１１とデータ取出制御部１２によって本発明のパケット受信制御装置が構成される。
【００５０】
送信側端末Ａ(10)では、マイクから入力された音声を、たとえば８kＨｚサンプリングでサンプリングしG.711等の音声符号化アルゴリズムを用いて符号化し、１６０サンプル（２０ｍｓ）を単位としてタイムスタンプ、シーケンス番号を付与してRTPパケットとして受信側端末Ｂ(10)に送信する。
【００５１】
受信側端末Ｂ(10)では、受信したパケットを、シーケンス番号順に整列して再生処理を行う。
【００５２】
伝送路でのパケットの順序入れ替わり、廃棄、および伝送遅延の揺らぎの影響により、パケット到着時刻、到着の順序が揺らぎ、あるいは到着しない場合がある。これによって音声品質の劣化を生じる。
【００５３】
品質劣化を低減するために、受信側端末Ｂ(10)では、受信パケットの順序入れ替わり、および伝送遅延の揺らぎを吸収する、パケット受信揺らぎ吸収バッファ制御処理を行っている。
【００５４】
受信側端末Ｂ(10)のパケット受信揺らぎ吸収バッファ制御処理の概要を説明する。
【００５５】
通信が開始されると同時に、受信側端末Ｂ(10)では、パケット受信揺らぎ吸収バッファ制御処理が開始される。
【００５６】
動作開始時には、各処理部の初期化が行われた後、パケット受信処理部111は、パケットの受信を待って待機し、データ取出制御部１２は一定時間間隔での音声データの取出要求を開始する。
【００５７】
受信側端末Ｂ(10)のパケット受信処理部111では、送信側端末Ａ(10)からの音声パケットを待って待機し、送信側端末Ａ(10)から音声データパケットを受信するごとに、受信時刻を取得して、音声データパケットと共に符号化音声データ格納処理部112に渡す。
【００５８】
符号化音声データ格納処理部112では、受信パケットに含まれるシーケンス番号、タイムスタンプ情報を元に、受信したパケットを送信側端末Ａ(10)から送信された順番になるように整列した状態で、受信時刻と符号化されたままの状態の音声データを組にして符号化音声バッファ（以下、第一バッファと称する）113に格納する。
【００５９】
音声データ復号処理部114は、第一バッファから任意のパケットを取り出して、パケットからサンプリングデータを取得し、このサンプリングデータをサンプリング単位のアドレスで指定して復号済音声バッファ（以下、第二バッファと称する）115に書き込む。
【００６０】
データ取出制御部１２は、通信が開始されると同時に、音声データ取出処理部116に対して、一定時間間隔で音声データの取出要求を出す動作を開始する。
【００６１】
データ取出制御部１２からの要求は、たとえば２０ｍｓごとにおこなわれ、音声データ取出処理部116は、データ取出制御部１２からの要求に従って音声データを第二バッファ115から読み出し、音声出力処理部１３に出力する。
【００６２】
このとき、第二バッファ115上に必要とされる音声データが存在しない場合には、音声データ取出処理部116は、符号化音声バッファ113にデコード要求を行い、第一バッファ113から必要な音声データを取り出し、音声データ復号処理部114において復号して第二バッファ115に格納する。
【００６３】
第二バッファ115への格納に必要なだけ音声データが復号されるか、もしくは第一バッファ113上に復号すべき音声データが存在しなくなったら第一バッファ113からの音声データ取出しを終了し、第二バッファ115上の音声データを読み出して音声出力処理部１３に出力する。
【００６４】
送信装置１４は、周知のコンピュータ装置から構成され、予め設定されているプログラムよって動作し、音声入力部141と、アナログ／ディジタル（Ａ／Ｄ）変換部142、符号化処理部143、パケット生成部144、送信部145とから構成されている。送信装置１４を構成するこれらの各部分は、ハードウェア及びソフトウェアの両方によって構成されている。
【００６５】
音声入力部141はマイクから入力された音声信号をアナログ電気信号に変換してＡ／Ｄ変換部142に出力し、Ａ／Ｄ変換部142によって所定のサンプリングタイムでディジタル信号に変換された音声データ（サンプリングデータ）が符号化処理部173に備わるバッファに順次格納される。
【００６６】
また、符号化処理部143は、バッファに格納された符号化対象となる音声データフレームを符号化してパケット生成部174に送出する。
【００６７】
パケット生成部144は、符号化処理部143から入力した符号化された音声データを含む周知のＲＴＰパケットを生成して送信部145へ送出する。このときのＲＴＰパケットにはＲＴＰヘッダが付加される。
【００６８】
ＲＴＰヘッダには、周知のように、２ビットのVersion情報Ｖと、１ビットのPadding情報Ｐ、１ビットのExtension情報Ｘ、３ビットのCSRC-Count情報ＣＣ、１ビットのMarker情報（以下、マーカービットと称する）Ｍ、７ビットのPayload-Type情報ＰＴ、１６ビットのシーケンス番号（順序番号：Sequence Number）、３２ビットのタイムスタンプ（Timestamp）、３２ビットの同期信号元（ＳＳＲＣ）識別子、３２ビットの寄与送信元（ＣＳＲＣ）識別子等が含まれている。
【００６９】
また、送信部145は、パケット生成部144から入力したＲＴＰパケットを通信網２０を介して他の端末１０に送信する。
【００７０】
次に、図２乃至図１２を参照して本実施形態における端末１０の構成及び動作の詳細を説明する。
【００７１】
＜第一バッファの機能的構成例の説明＞
第一バッファ113のデータ構造としては、たとえばリスト構造を用いても良いし、格納されたメモリの先頭アドレスを管理する配列構造を用いて実装しても良いが、ここでは第一バッファ113をメモリの先頭アドレスを管理する配列構造を用いて構成する場合の機能的構成例を、図３乃至図５を参照して説明する。図３は第一バッファの機能的構成例を示す図、図４は第一バッファをリングバッファで構成した場合の概念図、図５は第二バッファの機能的構成例を示す図である。
【００７２】
第一バッファ113はリングバッファであり、リングバッファ実装の一形態として、たとえば、添え字0からBUF1＿SIZE＿MAX−１までの要素をもつ配列を用いてリングバッファを実現する。リングバッファの先頭要素を格納したインデックスを表す変数としてBuf1＿Index, 末尾位置を示すインデックスを表す変数としてBuf1＿Index＿Lastを定義する。
【００７３】
これらの変数を用いて、Buf1＿Index＝Buf1＿Index＿Lastであれば、データは存在しないことを示すように取り決めを行い、データの有無を判定する。
【００７４】
受信したパケットを保存しておくという目的に即して、シーケンス番号が不連続な複数の受信パケットが第一バッファ113に挿入される可能性がある。たとえば、図３の例で、受信したパケットのシーケンス番号が１、２、４、５の４つのパケットを受信して格納しており、シーケンス番号３のパケットは伝送路での破棄等の原因で受信していないとすれば、第一バッファ113の領域としては、インデックス１〜５までの５つを使用するが、シーケンス番号３に対応した領域のポインタはNULLであり、データが受信されていないことを示す。
【００７５】
また、第一バッファ113上のデータの個数はBuf1＿Index＜Buf1＿Index＿Lastの場合にはBuf1＿Index＿Last−Buf1＿Index−１から、そのインデックスで示される範囲のNULLの個数をさし引くことで求めることができる。Buf1＿Index＞Buf1＿Index＿Lastの場合には、第一バッファ113上のデータの個数は(BUF1＿SIZE＿MAX−Buf1＿Index)＋Buf1＿Index＿Last−１から、そのインデックスで示される範囲のNULLの個数を差し引いて求めることができる。
【００７６】
第一バッファ113上に格納可能なデータ個数の最大値はBUF1＿SIZE＿MAX−１個である。
【００７７】
また、初期化時にポインタにはNULLを格納しておく。ポインタがNULLである場合には、このインデックスの示す場所にデータが格納されていないことを示す。
【００７８】
初期状態では、第一のバッファ113には何も格納されていないため、たとえばBuf1＿Index＝0, Buf1＿Index＿Last＝0と設定しておくことができる。
【００７９】
＜パケット受信処理および第一バッファへのデータ格納処理動作の説明＞
音声パケットを受信してからこの音声パケットが第一バッファ113に格納されるまでの手順を図６，７，８，１２を参照して説明する。
【００８０】
通信が開始されると、図６に示すように、パケット受信揺らぎ吸収バッファ制御処理の動作が開始され、初期化処理として第一バッファクリア、第二バッファクリア、初期値設定が行われる（ＳＡ１）。このとき、初期値としてはBuf1＿Index＝Buf1＿Index＿Last＝0に設定される。
【００８１】
また、パケット受信処理部111の動作が開始され、パケット受信処理部111は、通信終了によって動作停止命令を受けるまでパケットの受信を監視するループに入る（ＳＣ１〜ＳＣ３）。
【００８２】
パケットが受信されると、パケット受信処理部111はパケット受信時刻を取得し（ＳＣ４）、受信時刻、シーケンス番号、タイムスタンプ、音声データを組にして符号化音声データ格納処理部112に出力して、これらを第一バッファ113に格納する（ＳＣ５）。その後、パケット受信処理部111は、次のパケットを受信するための受信監視ループに戻る。
【００８３】
次に、図１２及び図１３を用いて符号化音声データ格納処理部112の処理手順を説明する。
【００８４】
符号化音声データ格納処理部112では、パケット受信処理部111から、受信時刻、シーケンス番号、タイムスタンプ、音声データの組が入力される。
【００８５】
符号化音声データ格納処理部112は、第一バッファ113上に既に音声データが存在する場合には、第一バッファ113上に既に格納されている音声データとの相対位置で当該音声データの格納位置を決定し、第一バッファ113上に格納された音声データが存在しない場合には、当該音声データを第一バッファ113の先頭に格納する。
【００８６】
ここで第一バッファ113の先頭とはBuf1＿Index＝Buf1＿Index＿Lastとなっている場合のBuf1＿Indexが指す位置である。Buf1＿Index＝Buf1＿Index＿Lastとなっている場合には、Buf1＿Index＝Buf1＿Index＿Last＝0とすることとしても良い。
【００８７】
先ず、符号化音声データ格納処理部112は、前述のデータ有無を判定する手段によって、第一バッファ113上に既に音声データが存在するか否かを確認する（ＳＥ１）。ここで、Buf1＿Index＝Buf1＿Index＿Lastとなっている場合に音声データが存在しないことがわかる。
【００８８】
第一バッファ113上に音声データが存在しない場合には、受信パケットの第一バッファ113への格納位置を例えば第一バッファ113の先頭に決定し（ＳＥ２）、受信パケットのシーケンス番号を相対位置の基準に設定する（Buf1＿Seaq＝CurrentSeaq）（ＳＥ３）。この場合、たとえばBuf1＿Indexに対応するインデックス（たとえばBuf1＿Index＝1）に対応する領域に受信したパケットのシーケンス番号と、パケットを受信した時刻、受信パケットのデータを格納した領域へのポインタを格納する。さらに、Buf1＿Indexに対応したシーケンス番号として、受信したRTPパケットに含まれるシーケンス番号をBuf1＿Seaqに設定する。図３に示した例ではBuf1＿Index＝100、Buf1＿Seaq＝1である。
【００８９】
この後、第一バッファのデータが格納された最後尾を示すポインタBuf1＿Index＿Lastを更新する。
【００９０】
すでに第一バッファ113上に受信データが存在している場合には、既に設定されているBuf1＿IndexとBuf1＿Seaqを用いて当該音声データの格納位置を決定する（ＳＥ４）。例えば、受信したRTPパケットに含まれるシーケンス番号をRTPCurrentSeaqとすれば、当該パケットの格納位置Indexは、Index ＝ Buf1＿Index ＋ (RTPCurrentSeaq − Buf1＿Seaq)として求めることができる。
【００９１】
計算によって求められた格納位置がBuf1＿IndexとBuf1＿Index＿Lastで挟まれた範囲の外側となる場合には、Buf1＿IndexもしくはBuf1＿Index＿Lastを当該パケットの格納位置にあわせて変更することで挿入を行う。尚、Buf1＿Index＿Lastはバッファ上のデータ最後尾のインデックスを指すように設定する。
【００９２】
すなわち、当該音声データの格納位置がBuf1＿Indexよりも前の位置となる場合にはBuf1＿Indexを当該パケットの格納位置に変更する。
【００９３】
当該音声データの格納位置がBuf1＿Index＿Lastよりも後ろの位置となる場合にはBuf1＿Index＿Lastを当該パケットの格納位置に変更する。
【００９４】
次に、第一バッファ113が一杯になるか否かを判定する（ＳＥ５）。ここでは、当該パケットのシーケンス番号から、バッファに格納された先頭の音声データのシーケンス番号を引いた差が、バッファの最大値を超える場合にバッファが一杯になると判定する。
【００９５】
シーケンス番号が飛んでいる場合には実際にバッファに格納されている個数が最大値に満たなくてもバッファが一杯になると判定される場合もある。
【００９６】
シーケンス番号の差分を計算する際には、シーケンス番号が最大値を超えて０に戻っているものもあるので、そのような場合にはシーケンス番号の最大値＋１を加えて過去のものと連続になるように補正してから判定に用いる。
【００９７】
前記ＳＥ４の判定の結果、データの格納（挿入）により、第一バッファ113に保持可能なデータ領域を超える場合には、第一のバッファ113上の全てのデータを破棄してバッファの初期化を行う（ＳＥ６）。
【００９８】
第一バッファ113へのデータの挿入は符号化音声データ格納処理部112によって行われ、第一バッファ113からのデータの取り出しは、音声データ取出処理部116によって行われる（前述した第一バッファ113への蓄積量最大値を超えて挿入した場合のデータ破棄を除く）。
【００９９】
上記の処理において、当該パケットのシーケンス番号から、第一バッファ113に格納された音声データのうち、先頭のシーケンス番号を引いた差が、第一バッファ113の最大値を超える場合に第一バッファ113が一杯であると判定する。ここで、第一バッファ113上では音声データは送信側端末Ａ(10)から送信された順に整列して保持されている。第一バッファ113の先頭の音声データとは、送信側端末Ａ(10)から送信された順序が最も古い音声データである。
【０１００】
シーケンス番号が不連続となっている場合には、実際に第一バッファ113に格納されている個数が最大値に満たなくても第一バッファ113が一杯であると判定される場合もある。
【０１０１】
ここで、シーケンス番号の差分を計算する際には、ＲＴＰのシーケンス番号の定義により、シーケンス番号として表現できる数値には制限があり、シーケンス番号として表現できる最大値を超えた場合には０に戻っているものもあるので、そのような場合にはシーケンス番号の最大値＋１を加えて過去のものと連続になるように補正してから判定に用いる。
【０１０２】
次いで、上記のように求めたパケットの格納位置Index（Index ＝ Buf1＿Index ＋ (RTPCurrentSeaq − Buf1＿Seaq)）に当該パケットの受信時刻と、シーケンス番号、タイムスタンプ、音声データの値を格納する（ＳＥ７）。
【０１０３】
この後、これらのデータの格納位置が最後尾よりも後ろの場合はBuf1＿Index＿Lastの値を、Buf1＿Index＿Last＋＝(RTPCurrentSeaq−Buf1＿Seaq)と更新し（ＳＥ８）、音声データ格納処理を終了する。
【０１０４】
＜第二バッファの機能的構成例の説明＞
次に、第二バッファ115の機能的構成例を図５を参照して説明する。
【０１０５】
第二バッファ115は、音声データを再生される順に時系列でサンプルごとに格納するバッファである。この例では、第二バッファ115はリングバッファで構成される。
【０１０６】
初期状態では、第二バッファ115上の各サンプルは無音をあらわす0で初期化されている。
【０１０７】
第二バッファ115からのデータ読み出し位置をサンプリング周波数単位に対応したアドレスで示すポインタpReadStartAddressという変数で示し、たとえば20msを単位として読み出す。読み出し位置の終端は、pReadEndAddressを用いて次式であらわす。
pReadEndAddress ＝ pReadStartAddress ＋ ReadFrameSamples
ここで、ReadFrameSamplesは読み出し処理部の処理単位を表し、たとえば音声データ取出処理部116が20ms単位で処理を行う場合にはReadFrameSamplesは160サンプルである。
【０１０８】
pReadStartAddressは理想的には、たとえば音声データ取出処理部116の処理が起動される20msごとに160サンプル相当分ずつバッファ後方に移動する。図５のようにリングバッファ状に構成し、たとえば、音声データ取出処理部116が20msごとに起動される場合には、読み出し開始アドレスpReadStartAddressは、時計回り方向に160サンプル分ずつ移動する。
【０１０９】
次に、データ取出制御部１２及び音声データ取出処理部116の処理に関して説明する。
【０１１０】
概要としては、音声データ取出処理部116は、第二バッファ115に必要なデータが存在する場合には、第二バッファ115からデータを読み出して後段に出力し、第二バッファ115に必要なデータが存在しない場合には、第一バッファ113から読み出すか、後述のパケット消失時のデータ生成手段を用いて消失した音声データを生成して第二バッファ115に格納し、格納されたデータのうち必要な量のデータを読み出して後段に出力するような処理を行う。
【０１１１】
データ取出制御部１２の動作を図７を参照して説明する。
【０１１２】
通信が開始されると、図６を用いて前述したように、パケット受信揺らぎ吸収バッファ制御処理の動作が開始され、初期化処理として第一バッファクリア、第二バッファクリア、初期値設定が行われる。すなわちpReadStartAddress、pReadEndAddress、pFrameStartAddress、pFrameEndAddressの値が初期化される。
【０１１３】
この初期化においては、たとえば、pReadStartAddress＝0、pReadEndAddress ＝ pReadStartAddress ＋ ReadFrameSamples、pFrameStartAddress ＝ −１、pFrameEndAddress ＝ −１に設定される。ここで、ReadFrameSamplesは、読み出し処理の単位で、データ取出制御部１２が20msごとにデータ取出し処理を起動する場合には、ReadFrameSamplesの値は20msのサンプル数に相当する160に設定されている。
【０１１４】
初期化の後にデータ取出制御部１２の動作が開始される。
【０１１５】
データ取出制御部１２は、通信終了によって動作停止命令を受けるまで、一定時間間隔（たとえば２０ｍｓ間隔）で、音声データ取出処理部116を起動する処理を行う。
【０１１６】
また、データ取出制御部１２は、一定時間間隔ごとに次の処理を行う。
【０１１７】
停止命令を受けたか否かを確認し（ＳＢ１）、停止命令を受けていれば停止する（ＳＢ２）。停止命令を受けていない場合には、データ取出処理起動時刻ReadStartTimeとして現在時刻を取得して設定する（ＳＢ３）。
【０１１８】
次に、データ取出制御部１２は、音声データ取出処理部116を起動する。
【０１１９】
音声データ取出処理部116は、第一バッファ115に格納されている音声データのうち必要なものがあれば、それを復号処理して得られた音声データを第二バッファ115に格納する処理を行った後に、第二バッファ115の所定の読み出しアドレスpReadStartAddressからpReadEndAddress−１までのアドレス領域の音声データを読み出して音声出力処理部１３に出力すると共に、このデータ読み出しを行った第二バッファ115のアドレス領域を無音を表す０で初期化する（ＳＢ４，ＳＢ５）。
【０１２０】
ここで、読み出し処理を行うごとに、毎回読み出しが完了した領域を初期化するかわりに、音声データ取出処理部116の何回かの起動に１回の割合で、pReadStartAddressよりも所定サンプルだけ過去のアドレスをまとめて０で初期化するようにしても良い。
【０１２１】
データ取出制御部１２は音声データ取出処理部116の処理が完了してから、次の起動時刻まで（一定時間経過するまで）待機し（ＳＢ６）、所定の機動時刻になったら、第二バッファ115の読み出しアドレスを保持するパラメータを次式で更新し、第二バッファの読み出しアドレス領域を移動する（ＳＢ７）。
pReadStartAddress ＝ pReadStartAddress ＋ ReadFrameSamples
pReadEndAddress ＝ pReadStartAddress ＋ ReadFrameSamples
その後、データ取出処理時刻ReadStartTimeとして現在時刻を取得して設定し、次のデータ取出処理を起動する。
【０１２２】
次に、音声データ取出処理部116の動作を、図９乃至図１１及び図１３を参照して説明する。
【０１２３】
音声データ取出処理部116は、前述したようにデータ取出制御部１２によって一定時間間隔で起動される。その際に、音声データ取出処理部116の起動時刻ReadStartTimeと、音声データを読み出す音声データ読み出しアドレス領域の先頭アドレスpReadStartAddress、音声データ読み出しアドレス領域の末尾アドレスの次のアドレスpReadEndAddressがデータ取出制御部１２から音声データ取出処理部116に与えられる。
【０１２４】
音声データ取出処理部116は、起動されると先ず、第一バッファ113に音声データが存在するか否かをチェックする（ＳＤ１）。前述のように、Buf1＿Index＝Buf1＿Index＿Lastとなっている場合に第一バッファ113上に音声データが存在しないことがわかる。Buf1＿Index !＝ Buf1＿Index＿Lastの場合には第一バッファ113上に音声データが存在する。
【０１２５】
第一バッファ113に音声データが存在する場合には、この音声データが第二バッファ115上の最初のデータになるか否かを判定する（ＳＤ２）。この判定は、pFrameEndAddress＜pReadStartAddress−BufClearTimeSamplesであるか否かを判定することによって行われる。ここで、第二バッファ上のアドレスは０以上の正のアドレスで表現されている。このとき、pFrameEndAddressは、第二バッファ上に既に書き込まれた音声データの末尾サンプルが書き込まれているアドレスを保持する変数であり、前述したように動作開始時に「-1」で初期化されている。また、たとえ第二バッファ上に既に書き込まれた音声データが存在する場合であっても、第二バッファ上の音声データが当該読み出しアドレスに対して一定時間以上過去の音声データである場合には、第二バッファ上に音声データが存在しないものとして第一バッファ上の音声データの書き込みアドレスを決定する。BufClearTimeを所定の時間閾値とするとき、BufClearTimeSamples=BufClearTime*SamplesPerMilliSecで計算される。（BufClearTimeは、たとえば60msとすることができる。その場合にはBufClearTimeSamplesは480となる。）
第二バッファに書き込まれた末尾の音声データが書き込まれたアドレスpFrameEndAddressがPreadStartAddress - BufClearTimeSamplesよりも前のアドレスであった場合に、第二バッファ上に既に書き込まれた音声データは存在しないか、あるいは存在していても、十分に古いデータであるため、当該第一バッファの音声データが第二バッファに書き込まれる最初のデータであると判定する。
【０１２６】
この判定の結果、第二バッファ115上の最初のデータになるときは第二バッファ115への書き込みアドレスを決定し（ＳＤ３）、後述するＳＤ６の処理に移行する。このときの書き込みアドレスは、pCurrentAddress＝pWrightAddressIで決定される。
【０１２７】
また、ＳＤ２の判定の結果、第二バッファ115上の最初のデータにならないときは、第一バッファ113に格納された先頭の音声データの、受信時刻と、RTPタイムスタンプ、シーケンス番号、音声データを取得する（ＳＤ４）。ここで第一バッファ113に格納された先頭の音声データとは、第一バッファ113上の音声データのうち、送信側端末Ａ(10)から最も古い時刻に送信された音声データのことで、第一バッファ113のBuf1＿Indexで示された位置に格納された音声データである。
【０１２８】
次に、取得したタイムスタンプ情報を用いて第二バッファ115に既に書き込まれた音声データとの相対アドレスに基づいて、第一バッファ113上の先頭の音声データの、第二バッファ115上への書き込みアドレスを決定する（ＳＤ５）。
【０１２９】
次いで、決定した書き込みアドレスが第二バッファ115の読み出しアドレス領域に含まれるか否かを判定し（ＳＤ６）、決定した第二バッファ115への書き込みアドレスが第二バッファ115の当該読み出しアドレス領域に含まれないときは、後述するＳＤ８の処理に移行する。
【０１３０】
また、決定した第二バッファ115への書き込みアドレスが、第二バッファ115の当該読み出しアドレス領域に含まれる場合は、第一バッファ113から該音声データを取り出し、音声データ復号処理部114において復号処理を行った後に、音声データを第二バッファ115に書き込む（ＳＤ７）。
【０１３１】
上記アドレスの決定には後述する第一アドレス決定手段、第二アドレス決定手段を選択的に用いる。
【０１３２】
また、前記ＳＤ２の判定の結果、第一バッファ113に存在する音声データが第二バッファ115上の最初のデータにならないときは、第二アドレス決定手段によって決定された書き込みアドレスが読み出しアドレス領域の先頭よりも過去のものであるか否かを判定する（ＳＤ８）。この判定は、pReadStartAddress＞pCurrentAddressであるか否かを判定することによって行われる。
【０１３３】
この判定の結果、決定された書き込みアドレスが読み出しアドレス領域の先頭よりも過去のものではないときは、後述するＳＤ１３の処理に移行し、過去のもののときは、決定された書き込みアドレスに書き込む音声データが、第二バッファ115に書き込まれた最後の音声データよりも後の音声データであるか否かを判定する（ＳＤ９）。この判定は、pFrameEndAddress＜＝pCurrentAddressであるか否かを判定することによって行われる。
【０１３４】
この判定の結果、第二バッファ115に書き込まれた最後の音声データよりも後の音声データでないときは、書き込み対象となっている音声データにおけるpReadStartAddressよりも後ろの部分だけを書き込み、pReadStartAddressよりも前の部分は破棄する（ＳＤ１０）。ここで、予測符号化もしくはパケット消失補償処理を行う場合には、途中のパケットが遅れたものは単に破棄する。この詳細は図１４乃至図１７を用いて後述する。この後、前記ＳＤ１の処理に移行する。
【０１３５】
また、第二バッファ115に書き込まれた最後の音声データよりも後の音声データであるときは、PreBufferTimeSamplesを増加し（ＳＤ１１）、第一アドレス決定手段を用いて第二バッファ115への書き込みアドレスを決定する（ＳＤ１２）。第一アドレス決定手段を用いて決定された書き込みアドレスもpReadStartAddress＞pCurrentAddressとなる場合には注意が必要であり、この場合、pCurrentAddress == pReadStartAddressとするか、破棄する。この後、前記ＳＤ７の処理に移行する。
【０１３６】
前記ＳＤ８の判定の結果、決定された書き込みアドレスが読み出しアドレス領域の先頭よりも過去のものではないときは、第一バッファ113の末尾の音声データのタイムスタンプと受信時刻からアドレスを決定して差を計算し（ＳＤ１３）、この差が所定の閾値より大きいオーバーランであるか否かを判定する（ＳＤ１４）。オーバーランの定義および判定の詳細については後述する。
【０１３７】
この判定の結果、オーバーランであるときは、第一バッファ113の末尾の音声データのみを残して、それ以前の音声データを全て破棄し、残した音声データの受信時刻情報を取得する（ＳＤ１５）。この後、前記ＳＤ１２の処理に移行する。
【０１３８】
また、前記ＳＤ１の判定の結果、第一バッファ113に音声データが存在しないときは、音声データ取出処理部116は、第二バッファ115のpReadStartAddressからpReadEndAddress−１で示されるアドレス領域から、ReadFrameSamplesの音声データを読み出し、音声データ出力処理部１３へ出力する（ＳＤ１６）。
【０１３９】
読み出しを終えた後、音声データ取出処理部116はpReadStartAddressからpReadEndAddress−１で示されるアドレス領域を0で初期化する。ここで、読み出しを行った後、pReadStartAddressよりも所定アドレス以上前のアドレス領域を0で初期化するようにしても良い。また、音声データ取出処理部116で第二バッファ115の領域の一部を初期化するかわりに、データ取出制御部１２で第二バッファ115の領域の一部を初期化する処理を行うようにしても良い。
【０１４０】
以下に前述した第一アドレス決定手段および第二アドレス決定手段の詳細を説明する。
【０１４１】
図２の構成における音声データ取出処理部116内で、第一バッファ113上の音声データを第二バッファ115に書き込む際の、第二バッファ115上への書き込みアドレスの決定手段として第一アドレス決定手段と第二アドレス決定手段を用いる。本実施例では、第一アドレス決定手段及び第二アドレス決定手段は音声データ取出処理部116に備えられている。
【０１４２】
また、音声データ取出処理部116では、第一バッファ113上の音声データを所定の時間周期ごとにチェックし、第二バッファ115の当該読み出しアドレス領域内に含まれるべき音声データを復号するために必要な音声データが第一バッファ113上に存在するか否かを判別する。すなわち、第一バッファ113上の音声データに対して第一アドレス決定手段、および第二アドレス決定手段を用いてアドレスを算出してみて、条件を満たすか否かによって第一バッファ113から読み出して復号し第二バッファ115に移動すべきか否かを判別する。
【０１４３】
＜第一アドレス決定手段＞
第一アドレス決定手段では、処理対象のパケットを受信した時刻をRecvTime（もしくは特に当該処理対象のパケットの受信時刻をさす場合にはCurrentRecvTime）、処理時点での第二バッファ115の読み出しアドレスに対応した時刻をReadStartTime、その時点の第二バッファ115の読み出しアドレスをpReadStartAddress、揺らぎ吸収のための余裕時間をPreBufTimeとしたとき、次式でアドレスを決定する。
pWrightAddressI＝ pReadStartAddress＋(ReadStartTime−RecvTime＋PreButTime)*SamplesPerMilliSec
尚、SamplesPerMilliSecは１ｍｓあたりのサンプル数である。また、「*」は乗算を表し、以下同様である。
【０１４４】
ここで、所定の余裕時間をサンプル数に換算した値をPreBufTimeSamplesとして、PreBufTimeSamples ＝ PreBufTime*SamplesPerMilliSsecとした場合には、上式は次のように表すこともできる。
pWrightAddressI＝ pReadStartAddress
＋(ReadStartTime−RecvTime)*SamplesPerMilliSec ＋ PreBufTimeSamples
＜第二アドレス決定手段＞
第二アドレス決定手段では、直前に音声データを第二バッファ115に書き込んだ際に設定された基準アドレスpRTPBaseAddressと、現在処理対象としている第一バッファ113上の音声データのRTPタイムスタンプRTPCurrentTimeStampを用いて次式でアドレスを決定する。
【０１４５】
ここで、第二アドレス決定手段によって決定された第二バッファ115への書き込みアドレスをpWrightAddressIIとする。
pWrightAddressII ＝ pRTPBaseAddress ＋ RTPCurrentTimeStamp
＜pRTPBaseAddressの更新＞
第一アドレス決定手段もしくは第二アドレス決定手段のいずれかを用いて当該音声データの第二バッファ115上への書き込みアドレスが決定され、書き込みが行われた後、次の音声データのアドレス算出に用いるために、基準アドレスpRTPBaseAddressが更新される。
【０１４６】
最終的に決定された当該音声データの第二バッファ115上への書き込みアドレスをpCurrentAddressとすれば、pRTPBaseAddressは次式で決定される。
pRTPBaseAddress ＝ pCurrentAddess−RTPCurrentTimeStamp
＜第一アドレス決定手段、第二アドレス決定手段によるアドレスの選択＞
第一アドレス決定手段、および第二アドレス決定手段によって算出されたアドレスは、以下に説明する方法を用いていずれのアドレスに書き込むかを決定する。
【０１４７】
基本方針としては、第二アドレス決定手段によって決定されたアドレスが書き込み可能アドレス領域に入っていない場合に、書き込みアドレスを第一アドレス決定手段によって決定されたアドレスとする。
【０１４８】
ここで、パケット取出処理部の当該処理において、当該読み出しアドレス領域の先頭アドレスpReadStartAddressから、第一アドレス決定手段を用いて決定されるアドレスpWrightAddressIから所定アドレスだけ後方のアドレスまでの範囲を書き込み可能アドレス領域とする。
【０１４９】
即ち、次式の関係を満たす場合に、第二アドレス決定手段で算出されたアドレスpWrightAddressIIは、書き込み可能アドレス領域であると判定される。
pReadStartAddress＜＝pWrightAddressII＜pWrightAddressI＋BufOverRunTimeSamples
ここで、あるパケットが受信されてからそのパケット内の音声データが再生されるまでの時間がどの程度遅延しても良いかをあらわす許容遅延時間の最大をBufOverRunTimeとしたとき、BufOverRunTimeをサンプル数に換算した値がBufOverRunTimeSamplesである。
【０１５０】
BufOverRunTimeSamplesは次式で得られる。
BufOverRunTimeSamples ＝ BufOverRunTime * SamplesPerMilliSec
pReadStartAddress＜pWrightAddressIIとなる場合は、パケット到着が遅すぎた場合であり、このような状態をアンダーランと称する。
【０１５１】
pWrightAddressII − pWrightAddressIが、所定の閾値BufOverRunTimeSamplesを超える場合は、パケットが受信されてから再生までに時間がかかりすぎた場合であり、このような状態をオーバーランと称する。
【０１５２】
＜アンダーランの処理＞
決定された第二バッファ115上への書き込みアドレスが、pReadStartAddressよりも前のアドレスであった場合には、アンダーランとして次の処理を行う。
【０１５３】
決定されたアドレスをpCurrentAddressとすれば、pReadStartAddress ＞ pCurrentAddressの場合は、さらに以下の３通りに場合わけされて処理される。
【０１５４】
(1) pFramEndAddress ＞＝ pCurrentAddress−BufClearTimeSamples、且つ、pFrameEndAddress ＜＝ pCurrentAddressの場合：
→ 第二バッファに既に書き込まれた音声データよりも後に送信されたデータが遅れて到着した場合であるので、アンダーランの処理としてリバッファリングを行う。
【０１５５】
すなわち、PreBufTimeを増加させ、第一アドレス決定手段によって決定された第二バッファのアドレスpWrightAddressIに当該音声データを書き込む。
【０１５６】
このとき、PreBufTimeは次式を用いてPreBufTimeStepだけ増加する。
PreBufTime ＋＝ PreBufTimeStep
PreBufTimeSamples ＝ PreBufTime*SamplesPerMilliSec
第二バッファのアドレスは次式で計算する。
pCurrentAddress ＝ pWrightAddressI＝ pReadStartAddress＋(ReadStartTime−RecvTime)*SamplesPerMilliSec ＋ PreBufTimeSamples
また、次の音声データを格納する際に使用するためpRTPBaseAddress、pFrameEndAddressを次式で更新する。
pRTPBaseAddress ＝ pCurrentAddess−RTPCurrentTimeStamp
pFrameEndAddress ＝ pCurrentAddress＋CurrentFrameSamples
(2) pFramEndAddress ＞＝ pCurrentAddress−BufClearTimeSamples、且つ、pFrameEndAddress ＞ pCurrentAddressの場合：
→もしもpCurrentAddress ＋ CurrentFrameSamples ＜ pFrameStartAddressの場合には当該音声データは第二バッファに書き込まれること無く破棄される。
【０１５７】
この場合にはpRTPBaseAddress、pFrameEndAddressは更新されない。
【０１５８】
もしもpCurrentAddress ＋ CurrentFrameSamples ＞＝ pFrameEndAddress ＞ pReadStartAddressである場合には、第二バッファのアドレスpFrameEndAddressから、アドレスpCurrentAddress ＋ CurrentFrameSamplesまでの領域に、(pCurrentAddress ＋ CurrentFrameSamples − pFrameEndAddress)に相当するサンプルのみを書き込む。
【０１５９】
もしもpCurrentAddress ＋ CurrentFrameSamples ＞＝ pReadStartAddress ＞ pFrameEndAddressである場合には、第二バッファ115のアドレスpReadStartAddressから、アドレスpCurrentAddress ＋ CurrentFrameSamplesまでの領域に、(pCurrentAddress ＋ CurrentFrameSamples − pReadStartAddress)に相当するサンプルのみを書き込む。
【０１６０】
また、次の音声データを格納する際に使用するためpRTPBaseAddress、pFrameEndAddressを次式で更新する。
pRTPBaseAddress ＝ pCurrentAddess−RTPCurrentTimeStamp
pFrameEndAddress ＝ pCurrentAddress＋CurrentFrameSamples
(3) pFramEndAddress ＜ pCurrentAddress−BufClearTimeSample、且つ、pFrameEndAddress ＜＝ pCurrentAddressの場合：
→ 第二バッファ115に既に書き込まれた音声データよりも後に送信されたデータが遅れて到着した場合であるが、BufClearTimeで指定される値よりも長い時間が経過しているので、PreBufTimeは増加させず、リバッファリングのみを行う。
【０１６１】
即ち、PreBufTimeは増加させず、第一アドレス決定手段によって決定された第二バッファ115のアドレスpWrightAddressIに当該音声データを書き込む。
【０１６２】
上記第二バッファ115のアドレスは次式で計算する。
pCurrentAddress ＝ pWrightAddressI＝ pReadStartAddress＋(ReadStartTime−RecvTime)*SamplesPerMilliSec ＋ PreBufTimeSamples
また、次の音声データを格納する際に使用するためpRTPBaseAddress、pFrameEndAddressを次式で更新する。
pRTPBaseAddress ＝ pCurrentAddess−RTPCurrentTimeStamp
pFrameEndAddress ＝ pCurrentAddress＋CurrentFrameSamples
＜オーバーランの処理＞
第一バッファ113上に、第二バッファ115の当該読み出しアドレス領域に対応するデータが存在しない状態になった後に、第一バッファ113上の末尾の音声データの情報を取得する。
【０１６３】
ここで第一バッファ113に格納された末尾の音声データとは、第一バッファ113上の音声データのうち、送信側端末Ａ(10)から最も新しい時刻に送信された音声データのことで、第一バッファ113のBuf1＿Index＿Lastで示された位置に格納された音声データである。
【０１６４】
末尾の音声データの受信時刻と、ReadStartTimeから、第一アドレス決定手段を用いて末尾音声データの第二バッファ115への書き込みアドレスpWrightAddressIを算出する。
【０１６５】
末尾の音声データのタイムスタンプと、直前の音声データ書き込みの際に算出したpRTPBaseAddressから、第二アドレス決定手段を用いて末尾音声データの第二バッファ115への書き込みアドレスpWrightAddressIIを算出する。
【０１６６】
算出された２つの第二バッファ115への書き込みアドレスの差pWrightAddressII − pWrightAddressIが、所定の閾値を超える場合に、音声データがバッファに溜まりすぎた状態「オーバーラン状態」であると判定する。
【０１６７】
オーバーラン状態と判定された場合には、第一バッファ113の末尾の音声データのみを残し、それ以外の第一バッファ113の音声データを全て破棄する。
【０１６８】
第一バッファ113の末尾の音声データは受信時刻をもとに算出したアドレスpWrightAddressIに書き込むこととして、pWrightAddressIが当該読み出しアドレス領域に含まれていれば当該音声データ取出処理で第一バッファ113から読み出して復号し第二バッファ115に書き込み、当該アドレス領域に含まれていなければ、第一バッファ113に残したまま次回以降の音声データ取出処理を待つ。
【０１６９】
尚、オーバーラン処理で間引きを行う場合の実施例については後述する。
【実施例２】
【０１７０】
次に、前述したパケット処理部１１を用いて、パケット消失補償処理を行う場合の処理の詳細を図１４乃至図２０を用いて説明する。
【０１７１】
＜パケット消失補償処理の概要＞
送信側端末Ａ(10)から送信されたパケットは、伝送路で遅延、順序逆転、破棄を生じる場合がある。
【０１７２】
また、送信側端末Ａ(10)で、無音圧縮処理を行う場合には、送信側端末Ａ(10)の音声入力部141に入力された音声が無音と判定される場合に、音声パケットが送信されないような処理が行われる場合がある。
【０１７３】
本発明のパケット受信制御装置では、受信パケットの遅延、破棄、無音を判定し、パケット消失補償処理を行うようにすることができる。
【０１７４】
パケット消失補償処理は次のような場合に起動される。
【０１７５】
第二バッファ115の当該読み出しアドレス領域に、十分な音声データが復号されていない場合であって、且つ、第一バッファ113に当該第二バッファ115の読み出しアドレス領域に書き込むべき音声データを含むパケットが存在しない場合に、パケット消失補償処理を起動して第一バッファ113に存在しない音声データを生成し、第二バッファ115に書き込んだ上で、第二バッファ115の当該読み出し領域の音声データを読み出して音声出力処理部１３に出力する。
【０１７６】
図１４乃至図１７はパケット消失補償処理を行う場合の音声データ取出処理部116の処理を説明するフローチャートである。
【０１７７】
これらのフローチャートに示すように、パケット消失補償処理を行う場合、音声データ取出処理部116は、データ取出処理が起動されると、読み出しアドレス領域の末尾まで音声データが書き込まれているか否かを判定する（ＳＦ１）。この判定は、if(pReadEndAddress＜pFrameEndAddress)であるか否かを判定することによって行われる。
【０１７８】
この判定の結果、読み出しアドレス領域の末尾まで音声データが書き込まれているときは後述するＳＦ７の処理に移行し、書き込まれていないときは、取出対象となっている音声データが第二バッファ115上の最初のデータであるか否かを判定する（ＳＦ２）。この判定は、pFrameEndAddress＜pReadStartAddress−BufClearTimeSamplesであるか否かを判定することによって行われる。
【０１７９】
この判定の結果、取出対象となっている音声データが第二バッファ115上の最初のデータであるときは、第一アドレス決定手段を用いて第二バッファへの書き込みアドレスをpCurrentAddress＝pWrightAddressIとして決定し（ＳＦ３）、後述するＳＦ１５の処理に移行する。また、最初のデータではないときは、第一バッファ113にデータが存在するか否かを判定し（ＳＦ４）、データが存在するときは後述するＳＦ１３の処理に移行する。また、第一バッファ113にデータが存在しないときは、pFrameEndAddressからpReadEndAddressまでを消失補償して得られたデータを第二バッファ115に書き込む（ＳＦ５）。このときの消失補償処理としては、後述するパケット消失補償処理パターンＢを用いる。
【０１８０】
この後、第二バッファ115のpReadStartAddressからpReadEndAddress-1で示されるアドレス領域からReadFrameSamplesの音声データを読み出し、音声出力処理部１３へ出力して（ＳＦ６）、音声データ取出処理を終了する。
【０１８１】
一方、前記ＳＦ１の判定の結果、読み出しアドレス領域の末尾まで音声データが書き込まれているときは、第一バッファ113の先頭から順に音声データをチェックし、第二アドレス決定手段で求めたアドレスpCurrentAddressがpFrameEndAddress＞pCurrentAddressとなるものがあるとき、このアドレスのデータを破棄する（ＳＦ７）。
【０１８２】
次いで、第一バッファ113の末尾の音声データのタイムスタンプと受信時刻からアドレスを決定して差を計算し（ＳＦ８）、この差が所定の閾値１より大きいオーバーランであるか否かを判定する（ＳＦ９）。この判定の結果、オーバーランでないときは前述したＳＦ６の処理に移行し、オーバーランのときは上記算出した差が所定の閾値２（＞閾値１）よりも大きいか否かを判定する（ＳＦ１０）。この判定の結果、オーバーランではないときは第一バッファ113から先頭の音声データを１つ取り出して復号し、復号して得られた音声データと、同じサイズの第二バッファ115の最後の音声データとをクロスフェードして第二バッファ115に書き戻す間引き処理を実行し（ＳＦ１１）、前記ＳＦ６の処理に移行する。
【０１８３】
また、前記ＳＦ１０の判定の結果、オーバーランであるときは、第一バッファ113上の音声データのうちの末尾の音声データ１つを残して他の音声データを全て破棄すると共に、残した１つの音声データのシーケンス番号と、受信時刻、タイムスタンプ情報を取得して（ＳＦ１２）、後述するＳＦ２２の処理に移行する。
【０１８４】
前記ＳＦ４の判定の結果、第一バッファ113にデータが存在するときは、第一バッファ113に格納された先頭の音声データのシーケンス番号と、受信時刻、タイムスタンプ情報を取得し（ＳＦ１３）、取得したタイムスタンプ情報と、第二アドレス決定手段を用いて、第二バッファ115に既に書き込まれた音声データとの相対アドレスで第二バッファ115への書き込みアドレスを決定する（ＳＦ１４）。
【０１８５】
次に、前記決定された書き込みアドレスが既に書き込まれたデータのアドレスよりも前のアドレスであるか否かを判定する（ＳＦ１５）。この判定は、pFrameEndAddress＞pCurrentAddressであるか否かを判定することによって行われる。
【０１８６】
この判定の結果、前記決定された書き込みアドレスが既に書き込まれたデータのアドレスよりも前のアドレスではないときは後述するＳＦ２１の処理に移行し、前のアドレスのときは、第一バッファ113に格納された先頭の音声データのシーケンス番号が第二バッファ115に書き込まれた最も後ろの音声データのシーケンス番号よりも後ろであるか否かを判定する（ＳＦ１６）。
【０１８７】
この判定の結果、第一バッファ113に格納された先頭の音声データのシーケンス番号が第二バッファ115に書き込まれた最も後ろの音声データのシーケンス番号よりも前のときは当該音声データを破棄して（ＳＦ１７）、前記ＳＦ１の処理に移行する。また、第一バッファ113に格納された先頭の音声データのシーケンス番号が第二バッファ115に書き込まれた最も後ろの音声データのシーケンス番号よりも後ろのときは、PreBufferTimeSamplesを増加し（ＳＦ１８）、第一アドレス決定手段を用いて第二バッファ115への書き込みアドレスを決定する（ＳＦ１９）。
【０１８８】
次いで、第一バッファ113の先頭の音声データを用いてpFrameEndAddressから、pCurrentAddressまでを消失補償し、続けて音声データを復号すると共に、これにより得られデータを第二バッファ115の決定されたアドレスに書き込む（ＳＦ２０）。このときの消失補償処理としては、後述するパケット消失補償処理パターンＢ−２若しくはＢ−３の復帰処理を用いる。
【０１８９】
前記ＳＦ１５の判定の結果、前記決定された書き込みアドレスが既に書き込まれたデータのアドレスよりも前のアドレスではないときは、第二アドレス決定手段によって決定された書き込みアドレスが読み出しアドレス領域の先頭よりも前であるか否かを判定し、（ＳＦ２１）。先頭よりも後のときは後述するＳＦ２４の処理に移行し、先頭よりも前のときは第一アドレス決定手段を用いて第二バッファへ115の書き込みアドレスを決定する（ＳＦ２２）。ここで、第一アドレス決定手段を用いて決定された書き込みアドレスでもpReadStartAddress＞pCurrentAddressとなる場合には注意が必要であり、この場合、pCurrentAddress == pReadStartAddressとするか、破棄する。
【０１９０】
次いで、第一バッファ113の先頭の音声データを取り出し、これを復号して第二バッファ115の決定されたアドレスに書き込む（ＳＦ２３）。ここで、pCurrentAddress＜pFrameEndAddressの場合には重複部はクロスフェード、pcurrentAddress＞pFrameEndAddressの場合にはパケット消失補償処理を行うこととしても良い。この後、前記ＳＦ１の処理に移行する。
【０１９１】
前記ＳＦ２１の判定の結果、前記決定された書き込みアドレスが読み出しアドレス領域の先頭よりも後であるときは、前記決定された書き込みアドレスが既に書き込まれたデータに連続するアドレスであるか否かを判定する（ＳＦ２４）。この判定は、pFrameEndAddress == pCurrentAddress且つpFrameEndSeaq+1 == pCurrentSeaqであるか否かを判定することによって行われる。
【０１９２】
この判定の結果、前記決定された書き込みアドレスが既に書き込まれたデータに連続するアドレスであるときは前記ＳＦ２３の処理に移行し、連続しないときは、シーケンス番号が連続で且つマーカービットが１であるか否かを判定する（ＳＦ２５）。ここでは、pFrameEndSeaq+1 == pCurrentSeaq且つpCurrentMaker == 1であるか否かを判定することによって行われる。
【０１９３】
この判定の結果、シーケンス番号が連続で且つマーカービットが１であるときは前記ＳＦ２３の処理に移行し、シーケンス番号が連続せず且つマーカービットが０のときは、第一バッファ113の先頭の音声データを用いて、pFrameEndAddressからpCurrentAddressまでを消失補償し、続けてpCurrentAddressから第一バッファ113の先頭の音声データを復号し、これによって得られたデータを第二バッファ115の決定されたアドレスに書き込む（ＳＦ２６）。この処理は、パケット消失補償処理パターンＡ若しくはパターンＢ−１の復帰処理もしくはパターンＢ−４の復帰処理に該当する。この後、前記ＳＦ１の処理に移行する。
【０１９４】
前述したパケット消失補償処理は、図１９に示すように「パターンＡ」と「パターンＢ」に分類することができる。さらに「パターンＢ」には、データの消失による補償を行う「パターンＢ−１」と、データの遅延による補償を行う「パターンＢ−２」と、データが無い無音状態における補償を行う「パターンＢ−３」に分類される。
【０１９５】
ここで、「パターンＡ」は、時刻Ｔの時点で消失と確定可能なケースであり、プリバッファ量をある程度長くしなければ消失と遅延の区別は付かない。また、「パターンＡ」は、音声データ取出処理部が起動された時点で、当該読み出しアドレス領域の音声データを復号するために必要な音声データが、第二バッファ115にも第一バッファ113にも存在せず、それより先の音声データが第一バッファ113上に存在するような場合である。たとえば、音声データのシーケンス番号がＮ−１まで到着していて、シーケンス番号Ｎ−１までの音声データは復号されて第二バッファ115に書き込まれており、且つ、第一バッファ113にはシーケンス番号Ｎの音声パケットは到着しておらず、シーケンス番号Ｎ＋１の音声データが第一バッファ113に格納されているような状態がパターンＡに該当する。
【０１９６】
パターンＡの場合には、図１８に示すように、音声データ取出処理部116は、シーケンス番号Ｎ−１の音声データを復号した状態で、第一バッファ113の先頭の音声データのシーケンス番号がＮ＋１（Ｎに相当する音声データ格納位置がＮＵＬＬである）であることから、シーケンス番号Ｎの音声データがまだ受信されておらず、シーケンス番号Ｎ＋１の音声データが第一バッファ113上に存在していることを知ることができる。
【０１９７】
このとき、シーケンス番号Ｎ＋１の音声データのＲＴＰタイムスタンプと、Ｎ−１の音声データを第二バッファ115に書き込んだ際に更新したpRTPBaseAddressを用いて、第二アドレス決定手段によってシーケンス番号Ｎ＋１の音声データの第二バッファ115への書き込みアドレスを決定する。決定されたアドレスをpCurrentAddress ＝ pWrightAddressIIとする。
【０１９８】
音声データ取出処理部116は、シーケンス番号Ｎ＋１の音声データを第一バッファ113から取り出し、pCurrentAddress − pFrameEndAddressサンプルのデータ生成と、シーケンス番号Ｎ＋１の音声データの復号を行うように指示する。
【０１９９】
音声データ復号処理部114は、既に復号したシーケンス番号Ｎ−１の音声データ復号後の内部状態と、音声データ取出処理部116から指示されたシーケンス番号Ｎ＋１の音声データを用いて、pCurrentAddress − pFrameEndAddressサンプルの音声データを生成し、さらに続けてシーケンス番号Ｎ＋１の音声データを復号する。この処理によって、連続してなめらかに変化するような音声波形が得られる。
【０２００】
音声データ取出処理部116は、音声データ復号処理部114から出力されたpCurrentAddress − pFrameEndAddress ＋ CurrentFrameSamplesの音声データを、第二バッファ115のアドレスpFrameEndAddressからpCurrentAddress＋CurrentFrameSamples−１までのアドレス領域に書き込む。
【０２０１】
また、次の音声データのアドレス決定に備えてpRTPBaseAddressを次式で更新する。
pRTPBaseAddress ＝ pCurrentAddess−RTPCurrentTimeStamp
その後、pFrameStartAddressからpFrameEndAddress−１までのアドレス領域の音声データを読み出して音声出力処理部１３に出力する。
【０２０２】
「パターンＢ」は、音声データ取出処理部116が起動された時点で、当該読み出しアドレス領域の音声データを復号するために必要な音声データが、第二バッファ115にも第一バッファ113にも存在せず、それ以降の音声データも第一バッファ113上に存在しないような場合である。
【０２０３】
たとえば、シーケンス番号がＮ−１までの音声データが到着していて、シーケンス番号Ｎ−１までの音声データは復号されて第二バッファ115に書き込まれており、且つ、第一バッファ113には全く音声データが存在しないような状態がパターンＢに該当する。
【０２０４】
また、パターンＢは、プリバッファ量よりも長い消失区間がある場合には、時刻Ｔの時点で、遅延、消失、無音を判別することが可能である。既に到着している音声データ（Ｎ−１以前）のパワー推移を観測することで無音と判定されているか否かを推定可能である。
【０２０５】
パターンＢの場合には音声データ取出処理部116は、音声データ復号処理部114に対してpFrameEndAddressからpReadEndAddress−１までのpReadEndAddress − pFrameEndAddressサンプルの音声データを、過去の音声データ情報を用いてパケット消失補償処理により生成するように指示する。生成された音声データを第二バッファ115に書き込む。
【０２０６】
また、次の音声データのアドレス決定に備えてpFrameEndAddress、pRTPBaseAddressを次式で更新する。
pRTPBaseAddress ＝ pRTPBaseAddress ＋ (pReadEndAddress − pFrameEndAddress)
pFrameEndAddress ＝ pFrameEndAddress ＋ (pReadEndAddress − pFrameEndAddress)
パターンＢの場合には、次のパケットが到着して初めて上記分類のうちどの分類に相当するかを判別することができる。また、パターンＢは、次に受信されるパケットの状態によって、前述のように「パターンＢ−１」、「パターンＢ−２」、「パターンＢ−３」に分類することができる。図２０にそれぞれの判別の例を示す。
【０２０７】
パターンＡおよびパターンＢで消失補償処理を行ってから、次回以降に音声データ取出処理部116の処理が起動された際に、第一バッファ113の先頭に音声データが存在する場合に、音声データ取出処理部116は消失補償処理からの復帰処理を行う。
【０２０８】
「パターンＢ−１」：時刻Ｔ＋１時点で消失と確定し、時刻Ｔで消失を補った結果を始点として到着した音声データへとなめらかに状態が遷移するようにＴ＋１を生成する。即ち、第一バッファ113の先頭がシーケンス番号Ｎ＋１（もしくはＮ＋１以上）の音声データであった場合にはパターンＢ−１であったと判定する。この場合には第二アドレス決定手段を用いて第一バッファ113の先頭の音声データの第二バッファ115への書き込みアドレスを決定する。
【０２０９】
決定されたアドレスをpCurrentAddress ＝ pWrightAddressIIとする。
【０２１０】
音声データ取出処理部116は、シーケンス番号Ｎ＋１の音声データを第一バッファ113から取り出し、pCurrentAddress − pReadStartAdderssサンプルのデータ生成と、シーケンス番号Ｎ＋１の音声データの復号を行うように指示する。
【０２１１】
音声データ復号処理部114は、既に復号したシーケンス番号Ｎ−１の音声データ復号後の内部状態と、音声データ取出処理部116から指示されたシーケンス番号Ｎ＋１の音声データを用いて、pCurrentAddress − pReadStartAddressサンプルの音声データを生成し、さらに続けてシーケンス番号Ｎ＋１の音声データを復号する。この処理によって、連続してなめらかに変化するような音声波形が得られる。
【０２１２】
音声データ取出処理部116は、音声データ復号処理部114から出力されたpCurrentAddress − pReadStartAddress ＋ CurrentFrameSamplesの音声データを、第二バッファ115のアドレスpReadStartAddressからpCurrentAddress＋CurrentFrameSamples−１までのアドレス領域に書き込む。ここで、pReadStartAddress＝pFrameEndAddressとなっていることに注意する。
【０２１３】
その後、pFrameStartAddressからpFrameEndAddress−１までのアドレス領域の音声データを読み出して音声出力処理部１３に出力する。
【０２１４】
「パターンＢ−２」：時刻Ｔ＋１時点で無音と確定し、音声データＮのシーケンス番号とマーカービットで無音から復帰したと判定できる。即ち、第一バッファの先頭がシーケンス番号Ｎであり、且つ、第二アドレス決定手段で決定されたアドレスpWrightAddressIIが、pFrameEndAddress＜pWrightAddressIIとなっている場合（シーケンス番号が連続にもかかわらずRTPタイムスタンプが前のRTPタイムスタンプ＋前のパケットに含まれていた音声データのサンプル数になっていない場合）には、送信側端末Ａ(10)において無音圧縮が行われたと判定する。このとき、当該音声データパケット内のマーカービットが１となっていることを確認するようにしても良い。
【０２１５】
このような場合には、第一バッファ113の先頭に保持されているシーケンス番号Ｎの音声データを復号し、第二バッファ115のpWrightAddressIIのアドレスに書き込む。
【０２１６】
ここで、pFrameEndAddressからpWrightAddressIIまでのアドレス領域は0で初期化されたままの状態であるが、音声データ復号処理部114でInterpolationSamples ＝ pWrightAddressII − pFrameEndAddressサンプルのパケット消失補償処理を行い、無音を生成することとしても良い。また、生成された音声データをフェードアウト処理して第二バッファ115に書き込むこととしても良い。
【０２１７】
「パターンＢ−３」：時刻Ｔ＋１時点で遅延と確定し、遅延の場合はアンダーラン処理を行って遅延音声データの書き込みアドレスを決定し、そこまでを補間完了する。即ち、第一バッファ113の先頭がシーケンス番号Ｎであり、且つ、第二アドレス決定手段で決定されたアドレスpWrightAddressIIが、pFrameEndAddress＝＝pWrightAddressIIとなっている場合（シーケンス番号が連続でRTPタイムスタンプが前のRTPタイムスタンプ＋前のパケットに含まれていた音声データのサンプル数になっている場合）には、遅延した音声データが到着したと判定する。
【０２１８】
このような場合には、第一バッファ113の先頭に保持されているシーケンス番号Ｎの音声データを復号し、第二バッファ115のpWrightAddressIIのアドレスに書き込む。
【０２１９】
「パターンＢ−４」：復帰時の音声データの直前が破棄されていれば、窓がけによってなだらかに復帰する。マーカービットがあるか否か、或いは復帰時のパワーで判別する。即ち、パケット消失補償処理によって連続して生成された音声データのサンプル数の合計ContinuedInterpolationSamplesが閾値CountinuedInterpolationSamplesThres（たとえば9600）を超えるとき、それ以降の連続するパケット消失補償処理は行わず、pFrameEndAddress＝−1に設定する。次に受信するパケットは、受信時刻を元に第一アドレス決定手段によって決定されたアドレスに書き込まれる。
【０２２０】
次に、パケット消失補償処理による音声データの生成処理に関して説明する。
【０２２１】
パケット消失補償処理としては、たとえば、符号化方式としてG.711を使用している場合には、G.711 AppendixIを使用することができる。
【０２２２】
パケット消失補償処理によって連続して生成された音声データのサンプル数の合計をContinuedInterpolationSamplesとし、起動時には0で初期化しておく。
【０２２３】
パケット消失補償処理でdWrightAddressサンプルの音声データを生成した場合に、ContinuedInterpolationSamplesをdWrightAddressだけ増加させる。
【０２２４】
また、パケット消失補償処理を行わない音声データを第二バッファに書き込んだ場合にContinuedInterpolationSamplesを0で初期化する。
【０２２５】
パケット消失補償処理によって連続して生成された音声データのサンプル数の合計ContinuedInterpolationSamplesが閾値CountinuedInterpolationSamplesThres（たとえば9600）を超えるとき、それ以降の連続するパケット消失補償処理は行わず、pFrameEndAddress＝−１に設定する。
【０２２６】
次に受信するパケットは、受信時刻を元に第一アドレス決定手段によって決定されたアドレスに書き込まれる。
【０２２７】
G.711 AppendixIでは60msのあいだ、音声データの振幅は徐々に減衰され、60ms以上では無音となる。
【０２２８】
同様に複数回のデータ読み出し処理部の起動において継続してパケット消失保証処理を行った場合、ContinuedInterpolationSamples＞9600では生成される音声データの振幅は0（無音）となる。このためCountinuedInterpolationSamplesThresは、たとえば60msをあらわす9600サンプルとすることができる。
【０２２９】
上記記載の操作により、データを復号し第二バッファ115のpCurrentAddressで示されるアドレスに格納し、pFrameEndAddressは第二バッファ115に格納された音声データの最後尾を指すように更新される。ここで、CurrentFrameSamplesは復号された音声データのサンプル数を表す。
pFrameEndAddress＝pCurrentAddress＋CurrentFrameSamples
更新後のpFrameEndAddressがpFrameEndAddress＜pReadEndAddressである場合には、第二バッファ115上に保持された音声データの量が十分でないので、さらに第一バッファ113からのRTPパケットを取り出して第二バッファ115に展開する処理を繰り返す。
【実施例３】
【０２３０】
次に、上記実施例２のフローチャートで説明した、データがバッファ上に溜まりすぎた場合に間引き処理を行う例について詳細に説明する。
【０２３１】
ここでは、第一アドレス決定手段、第二アドレス決定手段をもちいて決定されたアドレスの差を用いて、バッファ上のパケット蓄積量を監視し、パケット蓄積量が多い場合に間引き処理を行う場合の実施例を説明する。
【０２３２】
音声データ取出処理部116において、第一バッファ113の先頭の音声データの第一アドレス決定手段によって算出された第二バッファ115への書き込みアドレスをpWrightAddressI、第二アドレス決定手段を用いて算出された第二バッファ115への書き込みアドレスをpWrightAddressIIとするとき、両アドレスの差を用いてデータ蓄積量を監視する。
dWrightAddress ＝ pWrightAddressII − pWrightAddressI
ここで、dWrightAddressは、PreBufTimeで指定されたパケットを受信してから再生されるまでの余裕時間と、パケット受信から音声データ取出処理部116で音声データが読み出されて出力されるまでの実際の時間との差をサンプル数に換算した値であり、制御目標時刻からの差分時間をサンプル数で表したものである。
【０２３３】
dWrightAddress＝0である場合には、当該音声データは第二バッファ115上の理想的な位置に書き込まれており、蓄積量は順当であるということを示す。
【０２３４】
dWrightAddress＞0の場合には、音声データが制御目標PreBufTimeよりも長い時間、第一バッファ113及び第二バッファ115上に保持されており、蓄積される音声データの量が多く遅延が大きいことを示す。
【０２３５】
dWrightAddress＜0となる場合には、音声データが制御目標PreBufTimeよりも短い時間、第一バッファ113及び第二バッファ115上に保持されてから出力されており、蓄積される音声データの量が不足していることを示す。
【０２３６】
音声データ取出処理部116は、dWrightAddressが定常的に閾値以上の大きな正の値をとる場合に、第一バッファ113から音声データを取り出して部分的に破棄する間引き処理を起動する。
【０２３７】
間引き処理では、第一バッファ113に保持されているバッファの先頭から、連続する音声データを２つ取り出し、復号化処理を行った後に、クロスフェードしてdWrightAddressで示されたサンプル数だけ破棄した後に、残った音声データを第二バッファ115に格納する。
【０２３８】
この際、pRTPBaseAddressにdWrightAddressが加算され、第二バッファ115に格納するアドレスの整合性は保たれる。
【０２３９】
このとき、破棄の単位を、たとえば160サンプルごととして、dWrightAddress>160の場合にのみ、320サンプル以上の連続する音声データを第一バッファから読み出して復号し、連続する320サンプルを前半の160サンプルと後半の160サンプルでクロスフェードを行うようにしてもよい。この場合には、pRTPBaseAddressには破棄した160が加算される。
【０２４０】
また、dWrightAddressが閾値を越えている時間が一定の時間閾値を超えた場合にのみ間引き処理を行うようにすることもできる。
【実施例４】
【０２４１】
次に、上記実施例２のフローチャートで説明した、上記実施例３とは別の間引きの方法に関して詳細に説明する。
【０２４２】
ここでは、第一アドレス決定手段と第二アドレス決定手段をもちいて決定されたアドレスの差を用いて、バッファ上のパケット蓄積量を監視し、パケット蓄積量が多い場合に間引き処理を行う場合に関して説明する。
【０２４３】
本実施例と上記実施例３とは第一バッファ113の末尾の音声データを用いて間引き処理が必要か否かを判定する部分が異なる。
【０２４４】
音声データ取出処理部116の処理において、第二バッファ115の読出領域の範囲内に書き込まれるべき音声データを全て第一バッファ113から読み出して復号化処理し、第二バッファ115に書き込んだ後に、蓄積量の判定を行う。
【０２４５】
すなわち、第一バッファ113の末尾の音声データに関して第一アドレス決定手段によって算出された第二バッファ115への書き込みアドレスをpWrightAddressIとし、第二アドレス決定手段を用いて算出された第二バッファ115への書き込みアドレスをpWrightAddressIIとするとき、両アドレスの差(dWrightAddress)を用いてデータ蓄積量を監視する。
dWrightAddress ＝ pWrightAddressII − pWrightAddressI
ここで、dWrightAddressは、PreBufTimeで指定されたパケットを受信してから再生されるまでの余裕時間と、パケット受信から音声データ取出処理部で音声データが読み出されて出力されるまでの実際の時間との差をサンプル数に換算した値であり、制御目標時刻からの差分時間をサンプル数で表したものである。
【０２４６】
dWrightAddress＝0である場合には、当該音声データは第二バッファ115上の理想的な位置に書き込まれており、蓄積量は順当であるということを示す。
【０２４７】
dWrightAddress＞0の場合には、音声データが制御目標PreBufTimeよりも長い時間、第一バッファ113及び第二バッファ115上に保持されており、蓄積される音声データの量が多く遅延が大きいことを示す。
【０２４８】
dWrightAddress＜0となる場合には、音声データが制御目標PreBufTimeよりも短い時間、第一バッファ113及び第二バッファ115上に保持されてから出力されており、蓄積される音声データの量が不足していることを示す。
【０２４９】
音声データ取出処理部116は、dWrightAddressが定常的に大きな正の値をとる場合に、第一バッファ113から音声データを取り出して部分的に破棄する間引き処理を起動する。
【０２５０】
間引き処理では、第一バッファ113に保持されているバッファの先頭の音声データを１つ取り出し、復号化処理を行った後に、第二バッファ115に書き込まれた末尾の音声データを読み出して、復号化された音声データとクロスフェードしてdWrightAddressで示されたサンプル数だけデータ長を短縮した後に、得られた音声データを第二バッファ115に格納する。
【０２５１】
この際、pRTPBaseAddressにdWrightAddressが加算され、第二バッファ115に格納するアドレスの整合性は保たれる。
【０２５２】
ここで、間引き判定は第二バッファ115の読み出し領域に書き込まれるべき音声データを第一バッファ113から読み出す前に行うこととしても良い。
【０２５３】
また、破棄の単位を、たとえば160サンプルごととして、dWrightAddress>160の場合にのみ、320サンプル以上の連続する音声データを第一バッファから読み出して復号し、連続する320サンプルを前半の160サンプルと後半の160サンプルでクロスフェードを行うようにしてもよい。この場合には、pRTPBaseAddressには破棄した160が加算される。
【０２５４】
また、dWrightAddressが閾値を越えている時間が一定の時間閾値を超えた場合にのみ間引き処理を行うようにすることもできる。
【実施例５】
【０２５５】
次に、音声データ取出処理部116の起動時刻が揺らぐ場合の処理の一例に関して図２１及び図２２のフローチャートを参照して説明する。
【０２５６】
前述した実施例ではデータ取出制御部１２によってReadStartTimeを設定し、データ取出制御部１２が、音声データ取出処理部116を起動する直前に現在時刻を第二バッファ115の読み出しアドレスに対応した時刻として設定していたが、本実施例では、データ取出制御部１２が起動された時刻ではなく、処理を起動する予定だった理想的な時刻をReadStartTimeとして設定している点が異なる。
【０２５７】
また、処理が一定時間以上遅延し累積遅延が閾値以上となった場合に、遅延を回復するためにpReadStartAddressを累積遅延に相当するサンプル数分だけ増加させ、遅延を回復する処理を行う。
【０２５８】
即ち、データ取出制御が開始されると、データ取出制御部１２は一定時間間隔ごとに次の処理を行う。
【０２５９】
停止命令を受けたか否かを確認し（ＳＧ１）、停止命令を受けていれば停止する（ＳＧ２）。停止命令を受けていない場合には、データ取出処理起動時刻start＿timeとして現在時刻を取得して設定すると共に、第二バッファ115の読み出しアドレスに対応する時刻として理想的な読み出し処理時刻を設定する。すなわち音声データ取出処理部116が第二バッファ115からデータを読み出すアドレスに対応する時刻ReadStartTimeに、データ取出制御部１２の当該処理が起動されるべきだった理想的な時刻をあらわす変数last＿target＿timeの値を代入する。また、初回のみに変数last＿target＿timeの値として変数start＿timeの値を代入すると共に、初回のみに変数sleep＿timeの値を０に設定する（ＳＧ３）。
【０２６０】
次に、データ取出制御部１２は、データ取出制御部１２の動作起動時刻の累積遅延が許容量を超えているか否かを判定する（ＳＧ４）。この判定では、次回の処理までに処理を休止すべき時間を保持する変数sleep＿timeの値が負であり、且つ、その絶対値が予め設定されている所定の最大許容量maxdilaytimeよりも大きいとき、データ取出制御部１２の動作起動時刻の累積遅延が許容量を超えているものと判定する。
【０２６１】
ここで、累積遅延がある場合には、処理休止時間sleep＿timeの値は所定の第２周期よりも小さな値となり、さらに累積遅延が所定の第２周期よりも大きな場合には、sleep＿timeは負の値となる。
【０２６２】
この判定の結果、データ取出制御部１２の動作起動時刻の累積遅延が許容量を越えていないときは後述するＳＧ５の処理に移行し、遅延回復のために待機時間を短縮して動作したり、待機せず連続動作する。また、前記ＳＧ３の判定により累積遅延が許容量を超えているときは、遅延を回復するために音声データ処理をあきらめて、第二バッファ115の読み出しアドレスpReadStartAddressを累積遅延に相当するサンプル数分だけ一気に進めて、累積遅延分の音声データを処理しないことで累積遅延をクリアする（ＳＧ４）。
【０２６３】
このとき、読み出しアドレスpReadStartAddressの値に対して、変数sleep＿timeの値に−１を乗算し、更にこの値に１ｍｓあたりのサンプル数SamplesPerMilliSecを乗算した値を加算して得られた値を新たな読み出しアドレスpReadStartAddressの値とする。
【０２６４】
即ち、第二バッファ115の読み出しアドレスpReadStartAddressは次のような値に変更される。
pReadStartAddress＝pReadStartAddress＋((−1)*sleep＿time)*SamplesPerMilliSec
ここで、sleep＿timeはms単位の時間を表し、SamplesPerMilliSecは、1msあたりのサンプル数を表すこととする。
【０２６５】
さらに、変数last＿target＿timeの値として、変数start＿timeの値を代入する。また、pReadEndAddress＝pReadStartAddress＋ReadSamplesとする。
【０２６６】
ここで、last＿target＿timeは、当該処理が休止状態から復帰する予定だった理想的な時刻を表し、start＿timeは当該処理が処理休止状態から復帰した実際の時刻を表している。また、ReadSamplesの値は、SamplesPerMilliSecの値に２０を乗算した値（ReadSamples＝20*SamplesPerMilliSec）である。
【０２６７】
処理休止状態からの復帰時刻が遅れているか否かを表す時刻誤差errは、処理休止状態から復帰した実際の時刻start＿timeと、休止状態からの復帰予定時刻last＿target＿timeとの差によってerr＝start＿time−last＿targrt＿timeと表すことができる。
【０２６８】
累積遅延に相当するサンプリングデータを破棄した後に、last＿target＿timeに当該処理起動時刻start＿timeを代入することによって、時刻誤差判定に用いるerrの計算でerr＝0と算出される。すなわち、累積遅延をクリアしたことに相当する。
【０２６９】
次に、データ取出制御部１２は、音声データ取出処理部116を起動する。音声データ取出処理部116は、第一バッファ115に格納されている音声データのうち必要なものがあれば、それを復号処理して得られた音声データを第二バッファ115に格納する処理を行った後に、第二バッファ115の所定の読み出しアドレスpReadStartAddressからpReadEndAddress−１までのアドレス領域の音声データを読み出して音声出力処理部１３に出力すると共に、このデータ読み出しを行った第二バッファ115のアドレス領域を０で初期化する（ＳＧ６，ＳＧ７）。
【０２７０】
この後、データ取出制御部１２は、処理終了時刻をあらわす変数end＿timeの値として現在時刻を設定して処理終了時刻を取得する（ＳＧ８）。さらに、変数errと、変数target＿time、及び変数sleep＿timeを次式で示すように求める（ＳＧ９）。
err＝last＿target＿time − start＿time
target＿time＝start＿time ＋ 20ms − err
sleep＿time＝target＿time − end＿time
ここで、時刻誤差errは、今回処理休止状態から復帰した実際の時刻start＿timeと、今回の休止状態からの復帰予定時刻last＿target＿timeとの差によって表すことができる。
【０２７１】
target＿timeは、次回の処理休止命令からの理想的な復帰予定時刻で、現在の時刻start＿timeの値に、データ取出周期にあたる時間(20ms)を加えた値から、さらに今回の処理休止状態からの復帰が遅れた分の時刻誤差errを差し引いて求めることができる。
【０２７２】
この場合に、当該処理が終了した現在の時刻end＿timeから、次回処理起動予定時刻target＿timeまで、処理休止命令によって処理を休止する時間sleep＿timeは、sleep＿time＝target＿time − end＿timeで表すことができる。ここで、処理時刻の遅延errが大きければ、sleep＿timeは負の値を取る。
【０２７３】
この後、次回起動時刻取得ために、処理休止命令から復帰する理想的な時刻をあらわす変数last＿target＿timeの値として変数target＿timeの値を代入し（ＳＧ１０）、変数sleep＿timeの値が正の値（sleep＿time＞0）であるか否かを判定する（ＳＧ１１）。この判定の結果、変数sleep＿timeの値が０以下の値（sleep＿time＜＝0）であるときは後述するＳＧ１３の処理に移行し、変数sleep＿timeの値が正の値（sleep＿time＞0）であるときは変数sleep＿timeの値として設定されている時間だけ待機する（ＳＧ１２）。
【０２７４】
この後、次式で表される演算を行い、読み出しアドレスを20ms分進めて（ＳＧ１３）、前記ＳＧ１の処理に移行する。
pReadStartAddress ＝ pReadStartAddress ＋ ReadSamples
pReadEndAddress ＝ pReadStartAddress ＋ ReadSamples
ここで、ReadSamplesの値は、SamplesPerMilliSecの値に２０を乗算した値（ReadSamples＝20*SamplesPerMilliSec）である。
【０２７５】
前述したように第１実施形態におけるパケット受信制御によれば、遅延揺らぎを吸収するためのバッファリング時間を、第二バッファ115の読み出しアドレスと、書き込みアドレスとの差に換算して、［１／サンプリング周波数］単位の時間分解能で制御することで、パケットサイズに依存しない時間単位で揺らぎを吸収することができる。
【０２７６】
また、実際の時刻としてパケット受信時刻と、第二バッファ115からの読み出しアドレスに対応した時刻を取得するのみで、後の時間は全てアドレスに換算されて処理されるので、実際に書き込みが完了した時刻や、読み出し処理が行われた時刻が揺らいでいる場合にも、処理時刻の揺らぎの影響を受けにくい。そのため負荷状況によって処理時刻が揺らぐコンピュータ上のソフトウェアとして実現した場合にも品質劣化が少ない。さらに、処理時刻の揺らぎによる品質劣化の度合いを制御可能である。
【０２７７】
また、音声再生等に必要なサンプリングデータのみを復号処理することで、遅延したパケットをぎりぎりまで待って復号することができ、符号化順序と復号順序の不一致による通信品質の劣化を生じにくい。
【０２７８】
また、実際に必要なサンプル数だけパケット消失補償処理を行うようにすることで、補間されるサンプリングデータの量を最小限に抑え、品質劣化を低減することができる。また、消失補償処理前後のサンプルを必要なだけ変形処理して劣化を目立たなくするような処理を容易に付加することができる。
【０２７９】
さらに、揺らぎ吸収がパケット単位でなく、サンプル単位で行われること、および処理時刻の揺らぎに対してロバストであることから、例えば、多地点に存在する複数の端末１０からの音声データを複数受信し、同期してミキシングするような応用において遅延を短くすることができる。
【０２８０】
＜＜第２実施形態＞＞
次に、本発明の第２実施形態として、複数の端末１０と通信網２０を介して接続された音声会議サーバ４０を備えた遠隔会議システムに本発明を応用した一例を図２３乃至図２５を参照して説明する。
【０２８１】
図２３は遠隔会議システムを示す構成図、図２４は音声会議サーバの機能構成を示すブロック図である。図において、前述した実施例と同一構成部分は同一符号を持って表しその説明を省略する。
【０２８２】
音声会議サーバ４０は、複数の端末装置１０のそれぞれに対応したパケット処理部11-1〜11-Nと、データ取出制御部１２、ミキシング処理部１５、パケット送信処理部１６を備えている。
【０２８３】
パケット処理部11-1〜11-Nは上記実施例と同様の構成をなし、各パケット処理部11-1〜11-Nはデータ取出制御部１２によって動作制御されている。また、各パケット処理部11-1〜11-Nの音声データ取出処理部116から出力された音声データはミキシング処理部１５に入力され、ミキシング処理部１５によってミキシングされてパケット送信処理部１６を介して各端末１０に送信される。
【０２８４】
また、図２５に示すように、データミキシング処理部１５は、各パケット処理部11-1〜11-Nの第二バッファ115をレーンとしてとらえ、時間の経過と共に各第二バッファ115の読み出しアドレス領域（ミキシング領域）を更新しながら各第二バッファ115書き込まれているフレームのサンプリングデータをミキシング処理する。さらに、pBaseAddressは基準アドレスであり、３０秒ごとに240000サンプル分増加する。また、各レーンにおいて連続した複数のフレームの開始アドレスをフレーム開始アドレスpFrameStartAddress[i]とし、終了位置の１サンプル後ろのアドレスを、フレーム終了アドレスpFrameEndAddress[i]として管理している。
【０２８５】
また、ミキシング処理部１５は、２０ｍｓごとに、現在時刻を更新すると共に第二バッファ115のデータ読み出しアドレス領域（ミキシング領域）すなわち読み出し領域の先頭アドレスpReadStartAddressと末尾アドレスに１を加算したアドレスpReadEndAddressを更新する。さらに、ミキシングすべきデータが何れかのレーンに存在するときは、ミキシング領域内の音声サンプリングデータを第二バッファ115から取得してミキシング処理してパケット送信処理部１６に送出する。ミキシングすべきデータがどのレーンにもなければミキシング処理を行わない。
【０２８６】
パケット送信処理部１６は、ミキシング処理部１５のミキシングによって得られたデータをエンコード（符号化）したフレームを生成し、このフレームを含むＲＴＰパケットを生成して各端末装置１０に送信する。
【０２８７】
このように音声会議サーバ４０に本発明を適用した場合、複数の端末１０からの音声パケットを受信し、ミキシングした後に各端末１０に対してミキシングした音声データパケットを送信する際、全ての端末１０から音声パケットを受信しないときには、ミキシング結果を出力しないようにしても良い。
【０２８８】
＜＜第３実施形態＞＞
次に、図２６及び図２７を参照して、音声会議サーバ４０を用いずに複数の端末５０のみで構成した遠隔会議システムに関して説明する。
【０２８９】
図２６は第３実施形態における遠隔会議システムを示す構成図、図２６は第３実施形態における遠隔会議システムの各端末の機能構成を示すブロック図である。図において、前述した第１実施形態と同一構成部分は同一符号をもって表しその説明を省略する。
【０２９０】
また、第３実施形態における遠隔会議システムでは３つの端末Ａ，Ｂ，Ｃ（５０）がＩＰ網（通信網）２０を介して周知のメッシュ接続によって相互に接続されている。即ち、端末Ａは、端末Ｂと端末Ｃに対してパケット化された音声信号を送信できると共に端末Ｂと端末Ｃから送信された音声パケットを受信できるように各端末Ｂ，Ｃと接続されている。端末Ｂは、端末Ａと端末Ｃに対してパケット化された音声信号を送信できると共に端末Ａと端末Ｃから送信された音声パケットを受信できるように各端末Ａ，Ｃと接続されている。また、端末Ｃは、端末Ａと端末Ｂに対してパケット化された音声信号を送信できると共に端末Ａと端末Ｂから送信された音声パケットを受信できるように各端末Ａ，Ｂと接続されている。
【０２９１】
また、各端末Ａ，Ｂ，Ｃ（５０）のそれぞれは、図２７に示すように、受信装置１７と送信装置１４とを備えている。
【０２９２】
受信装置１７は、前述した第２実施形態における音声会議サーバ４０とほぼ同一の構成をなしており、相違点は、２つのパケット処理部11-1,11-2を有していること、及びパケット送信処理部１６に代えて音声出力処理部１３を備えていることであり、その他は第２実施形態の音声会議サーバ４０と同一である。
【０２９３】
受信装置１７は、他の２つの端末５０のそれぞれから送信された音声パケット信号を、それぞれに対応して設けられたパケット処理部11-1,11-2によって受信する。各パケット処理部11-1,11-2によってリアルタイムに音声信号が再生され、これらの音声信号がミキシング処理部１５によりミキシングされて音声出力処理部１３によってスピーカから音声信号として出力される。
【０２９４】
送信装置１４は、第１実施形態と同様の構成であり、送信部145はパケット生成部144から入力したＲＴＰパケットをＩＰ網（通信網）２０を介して他の２つの端末５０に送信する。
【０２９５】
前述の構成よりなる第３実施形態によれば、第２実施形態と同様に複数地点の端末５０から送信されたパケットの遅延揺らぎ吸収を各端末５０ごとに設けたパケット処理部11-1〜11-2のバッファにおいて独立して行うことができ、サンプリング時間単位で最適な遅延に制御し、サンプリング時間単位の精度でバッファからデータの読み出しを行うことができる。
【０２９６】
尚、上記各実施形態および各実施例は本発明の一具体例であり、本発明が上記実施形態及び実施例の構成のみに限定されないことは言うまでもないことである。
【０２９７】
また、上記プログラムを記録した情報記憶媒体を作成することにより、上記プログラムを用意に配布することができ、所定のコンピュータ装置を上記のリアルタイムミキシング処理装置として動作させることが容易に可能になる。
【図面の簡単な説明】
【０２９８】
【図１】本発明の第１実施形態における通信システムの一例を示す図
【図２】本発明の第１実施形態における端末の機能構成を示すブロック図
【図３】本発明の第１実施形態における第一バッファ機能的構成例を示す図
【図４】本発明の第１実施形態における第一バッファをリングバッファで構成した場合の概念図
【図５】本発明の第１実施形態における第二バッファの機能的構成例を示す図
【図６】本発明の第１実施形態における動作開始処理を説明するフローチャート
【図７】本発明の第１実施形態におけるデータ取出制御処理を説明するフローチャート
【図８】本発明の第１実施形態におけるパケット受信処理を説明するフローチャート
【図９】本発明の第１実施形態における音声データ取出処理を説明するフローチャート
【図１０】本発明の第１実施形態における音声データ取出処理を説明するフローチャート
【図１１】本発明の第１実施形態における音声データ取出処理を説明するフローチャート
【図１２】本発明の第１実施形態における音声データ格納処理を説明するフローチャート
【図１３】本発明の第１実施形態におけるデータ処理を説明する図
【図１４】本発明の第１実施形態における実施例２の音声データ取出処理を説明するフローチャート
【図１５】本発明の第１実施形態における実施例２の音声データ取出処理を説明するフローチャート
【図１６】本発明の第１実施形態における実施例２の音声データ取出処理を説明するフローチャート
【図１７】本発明の第１実施形態における実施例２の音声データ取出処理を説明するフローチャート
【図１８】本発明の第１実施形態における実施例２のパケット消失補償処理を説明する図
【図１９】本発明の第１実施形態における実施例２のパケット消失補償処理を説明する図
【図２０】本発明の第１実施形態における実施例２のパケット消失補償処理を説明する図
【図２１】本発明の第１実施形態における実施例５の音声データ取出処理部の起動時刻が揺らぐ場合の処理を説明するフローチャート
【図２２】本発明の第１実施形態における実施例５の音声データ取出処理部の起動時刻が揺らぐ場合の処理を説明するフローチャート
【図２３】本発明の第２実施形態における遠隔会議システムを示す構成図
【図２４】本発明の第２実施形態における遠隔会議システムの音声会議サーバを示すブロック図
【図２５】本発明の第２実施形態における音声会議サーバにおけるデータミキシング処理を説明する図
【図２６】本発明の第３実施形態における遠隔会議システムを示す構成図
【図２７】本発明の第３実施形態における端末を示すブロック図
【符号の説明】
【０２９９】
１０…端末、１１(11-1〜11-N)…パケット処理部、１２…データ取出制御部、１３…音声出力処理部、１４…送信装置、１５…ミキシング処理部、１６…パケット送信処理部、１７…受信装置、111…パケット受信処理部、112…符号化音声データ格納処理部、113…符号化音声バッファ（第一バッファ）、114…音声データ復号処理部、115…復号済音声バッファ（第二バッファ）、116…音声データ取出処理部、141…音声入力部、142…Ａ／Ｄ変換部、143…符号化処理部、144…パケット生成部、145…送信部、２０…通信網、４０…音声会議サーバ、５０…端末。
【図１】
2006121401.tif 000003
【図２】
2006121401.tif 000004
【図３】
2006121401.tif 000005
【図４】
2006121401.tif 000006
【図５】
2006121401.tif 000007
【図６】
2006121401.tif 000008
【図７】
2006121401.tif 000009
【図８】
2006121401.tif 000010
【図９】
2006121401.tif 000011
【図１０】
2006121401.tif 000012
【図１１】
2006121401.tif 000013
【図１２】
2006121401.tif 000014
【図１３】
2006121401.tif 000015
【図１４】
2006121401.tif 000016
【図１５】
2006121401.tif 000017
【図１６】
2006121401.tif 000018
【図１７】
2006121401.tif 000019
【図１８】
2006121401.tif 000020
【図１９】
2006121401.tif 000021
【図２０】
2006121401.tif 000022
【図２１】
2006121401.tif 000023
【図２２】
2006121401.tif 000024
【図２３】
2006121401.tif 000025
【図２４】
2006121401.tif 000026
【図２５】
2006121401.tif 000027
【図２６】
2006121401.tif 000028
【図２７】
2006121401.tif 000029