(57)【要約】【課題】安定したエコーキャンセル動作を行うことができる信号処理装置を実現する。【解決手段】実施形態によれば、第１の処理手段は、第１のタスクから出力される出力サウンドデータを、タイムスタンプが付与された状態で第１のキューに追加する。第２の処理手段は、第２のタスクによってマイクロホンから取得される入力サウンドデータを、タイムスタンプが付与された状態で第２のキューに追加する。制御手段は、第１のキューから、第２のキューの先頭の第１の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する第１の出力サウンドデータをリファレンスデータとして取り出す。エコーキャンセラは、リファレンスデータに基づいて第１の入力サウンドデータ内のエコー成分をキャンセルするエコーキャンセル処理を実行する。【選択図】図２
2014123875.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーション層から受信される再生対象のサウンドストリームを信号処理装置のスピーカに送出するための第１のタスクと信号処理装置のマイクロホンからサウンドストリームを取得するための第２のタスクとを含む複数のタスクを実行するように構成された信号処理装置であって、
前記第１のタスクから出力される出力サウンドデータを、タイムスタンプが付与された状態で第１のキューに追加する第１の処理手段と、
前記第２のタスクによって前記マイクロホンから取得される入力サウンドデータを、タイムスタンプが付与された状態で第２のキューに追加する第２の処理手段と、
前記第１のキューから、前記第２のキューの先頭の第１の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する第１の出力サウンドデータをリファレンスデータとして取り出す制御手段と、
前記リファレンスデータに基づいて前記第１の入力サウンドデータ内のエコー成分をキャンセルするエコーキャンセル処理を実行するエコーキャンセラと
を具備する信号処理装置。
【請求項２】
前記制御手段は、前記第２のキューの先頭の前記第１の入力サウンドデータのタイムスタンプを前記第１のキューの先頭の出力サウンドデータのタイムスタンプと比較し、これらタイムスタンプ間の時間差が前記所定範囲内である場合、前記エコーキャンセラに、前記第１のキューの先頭の出力サウンドデータを前記リファレンスデータとして使用する、前記第１の入力サウンドデータに対するエコーキャンセル処理を実行させ、前記タイムスタンプ間の時間差が前記所定範囲内でない場合、前記第１のキューの先頭の出力サウンドデータを破棄して前記第１のキューの２番目の出力サウンドデータを前記第１のキューの先頭に移す請求項１記載の信号処理装置。
【請求項３】
前記制御手段は、前記第１の入力サウンドデータのタイムスタンプと前記第１のキューの先頭の出力サウンドデータのタイムスタンプとの間の第１の時間差と、直前の複数回のタイムスタンプ間の比較によって得られる複数の時間差とを使用して、第１の時間差と前記複数の時間差を含む全ての時間差の平均を算出し、算出した平均が前記所定範囲内であるか否かを判定する請求項２記載の信号処理装置。
【請求項４】
前記制御手段は、前記第１のキューに蓄積されているデータサイズおよび前記第２のキューに蓄積されているデータサイズをチェックし、前記第１のキューおよび前記第２のキューの各々に前記エコーキャンセル処理に必要なデータサイズ以上のデータが蓄積されている場合、前記第１のキューから前記第１の出力サウンドデータを前記リファレンスデータとして取り出すための処理を実行する請求項１記載の信号処理装置。
【請求項５】
アプリケーション層から受信される再生対象のサウンドストリームを信号処理装置のスピーカに送出するための第１のタスクと信号処理装置のマイクロホンからサウンドストリームを取得するための第２のタスクとを含む複数のタスクを実行するように構成された信号処理装置における信号処理方法であって、
前記第１のタスクから出力される出力サウンドデータを、タイムスタンプが付与された状態で第１のキューに追加し、
前記第２のタスクによって前記マイクロホンから取得される入力サウンドデータを、タイムスタンプが付与された状態で第２のキューに追加し、
前記第１のキューから、前記第２のキューの先頭の第１の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する第１の出力サウンドデータをリファレンスデータとして取り出し、
前記リファレンスデータに基づいて前記第１の入力サウンドデータ内のエコー成分をキャンセルするエコーキャンセル処理を実行する、
信号処理方法。
【請求項６】
アプリケーション層から受信される再生対象のサウンドストリームをコンピュータのスピーカに送出するための第１のタスクとコンピュータのマイクロホンからサウンドストリームを取得するための第２のタスクとを含む複数のタスクを実行するように構成されたコンピュータによって実行されるプログラムであって、
前記第１のタスクから出力される出力サウンドデータを、タイムスタンプが付与された状態で第１のキューに追加する手順と、
前記第２のタスクによって前記マイクロホンから取得される入力サウンドデータを、タイムスタンプが付与された状態で第２のキューに追加する手順と、
前記第１のキューから、前記第２のキューの先頭の第１の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する第１の出力サウンドデータをリファレンスデータとして取り出す手順と、
前記リファレンスデータに基づいて前記第１の入力サウンドデータ内のエコー成分をキャンセルするエコーキャンセル処理を実行する手順とを前記コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、エコーをキャンセルするための技術に関する。
【背景技術】
【０００２】
一般に、テレビ会議、電話会議といった通信システムにおいては、ハンズフリー通話が広く利用されている。このハンズフリー通話を実現するためには、エコー（音響エコー）をキャンセルするためのエコーキャンセラが有用である。
【０００３】
エコーキャンセラを備える通信システムとしては、基地局のような装置内でエコーをキャンセルするための処理を実行するシステムが知られている。
【０００４】
また、スマートフォン、ＰＤＡ、パーソナルコンピュータといった情報端末においては、エコーキャンセラは、通話のみならず、マイクから入力されるサウンド信号を処理することが必要な様々なアプリケーションに適用することもできる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００４−４０５４２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ところで、従来の情報端末においては、サウンド信号の処理は専用ＬＳＩ、ＤＳＰといったハードウェアによって行われていたが、近年の多くの情報端末においては、サウンド信号はソフトウェアによって処理される場合がある。
【０００７】
エコーはスピーカから出力される音がマイクロホンにまわり込むことによって引き起こされる。このため、マイクロホンから入力される入力サウンド信号からエコー成分をキャンセルするためには、このエコー成分に対応する出力サウンド信号を特定することが必要である。しかし、多くの情報端末においては非リアルタイムＯＳが利用されているため、スピーカに出力サウンド信号を送出するためのタスクとマイクロホンから入力サウンド信号を取得するためのタスクとを厳密に同期させることは困難である。このため、入力サウンド信号と出力サウンド信号との同期がとれず、エコーキャンセル動作が不安定になる場合がある。
【０００８】
本発明の目的は、安定したエコーキャンセル動作を行うことができる信号処理装置および信号処理方法を提供することである。
【課題を解決するための手段】
【０００９】
実施形態によれば、信号処理装置は、アプリケーション層から受信される再生対象のサウンドストリームを信号処理装置のスピーカに送出するための第１のタスクと信号処理装置のマイクロホンからサウンドストリームを取得するための第２のタスクとを含む複数のタスクを実行するように構成されている。前記信号処理装置は、第１の処理手段と、第２の処理手段と、制御手段と、エコーキャンセラとを具備する。第１の処理手段は、前記第１のタスクから出力される出力サウンドデータを、タイムスタンプが付与された状態で第１のキューに追加する。前記第２の処理手段は、前記第２のタスクによって前記マイクロホンから取得される入力サウンドデータを、タイムスタンプが付与された状態で第２のキューに追加する。前記制御手段は、前記第１のキューから、前記第２のキューの先頭の第１の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する第１の出力サウンドデータをリファレンスデータとして取り出す。前記エコーキャンセラは、前記リファレンスデータに基づいて前記第１の入力サウンドデータ内のエコー成分をキャンセルするエコーキャンセル処理を実行する。
【図面の簡単な説明】
【００１０】
【図１】実施形態に係る信号処理装置の構成を示すブロック図。
【図２】同実施形態の信号処理装置に含まれるＴｘ／Ｒｘ同期制御部の構成を示すブロック図。
【図３】図２のＴｘ／Ｒｘ同期制御部内のＲｘスレッドによって生成されるＲｘパケットの構成例を示す図。
【図４】図２のＴｘ／Ｒｘ同期制御部の動作を示す図。
【図５】図２のＴｘ／Ｒｘ同期制御部によって実行されるタイムスタンプ付与動作の例を示す図。
【図６】図２のＴｘ／Ｒｘ同期制御部内のＲｘスレッドによって実行される処理の手順を示すフローチャート。
【図７】図２のＴｘ／Ｒｘ同期制御部内のＴｘスレッドによって実行される処理の手順を示すフローチャート。
【図８】図２のＴｘ／Ｒｘ同期制御部内のＴｘスレッドによって実行されるパケット同期処理の手順を示すフローチャート。
【図９】同実施形態の信号処理装置のアプリケーション層の構成例を示すブロック図。
【図１０】同実施形態の信号処理装置のアプリケーション層の他の構成例を示すブロック図。
【発明を実施するための形態】
【００１１】
以下、実施の形態について図面を参照して説明する。  
図１は、一実施形態に係る信号処理装置１０の構成を示す。この信号処理装置１０は、タブレット、スマートフォン、パーソナルコンピュータといった情報端末として実現し得る。この信号処理装置１０は、スピーカ１１およびマイクロホン１２を備える。この信号処理装置１０は、ソフトウェアを使用してサウンドデータを処理することができる。この信号処理装置１０は、出力タスク２１と入力タスク２２とを含む複数のタスクを実行するように構成されている。これら各タスクはプロセスであってもよいし、スレッドであってもよい。
【００１２】
サウンドデータを処理するためのソフトウェアは、オペレーティングシステム上で動作する３つの層、つまり、ドライバ層１３、サウンドミドルウェア層１４、およびアプリケーション層１５を含み得る。オペレーティングシステムとしては、Ａｎｄｒｏｉｄ  ＯＳ（登録商標）を使用してもよい。Ａｎｄｒｏｉｄ  ＯＳ（登録商標）を使用する場合には、ドライバ層１３はＡｎｄｒｏｉｄ  ＯＳ（登録商標）のＡＬＳＡ（Ａｄｖａｎｃｅ  Ｌｉｎｕｘ（登録商標）  Ｓｏｕｎｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）であってよく、サウンドミドルウェア層１４はＡｎｄｒｏｉｄ  ＯＳ（登録商標）のＨＡＬ（Ｈａｒｄｗａｒｅ  Ａｂｓｔｒａｃｔｉｏｎ  Ｌａｙｅｒ）であってもよい。ＨＡＬは、ハードウェアを抽象化するためのソフトウェア層である。
【００１３】
出力タスク２１は、アプリケーション層１５から受信される再生対象のサウンドストリーム（Ｒｘ信号系列）をスピーカ１１に送出するためのサウンド出力タスクである。出力タスク２１は、Ａｎｄｒｏｉｄ−ＯＳ（登録商標）のＡｕｄｉｏＳｔｒｅａｍＯｕｔであってもよい。ＡｕｄｉｏＳｔｒｅａｍＯｕｔは、サウンド（オーディオ）出力ハードウェアを抽象化するためのスレッドである。この出力タスク２１は、上述のサウンドミドルウェア層１４上に位置する。
【００１４】
アプリケーション層１５はサウンドデータ（音声信号、または音楽のようなオーディオ信号）を扱うための１以上のアプリケーションプログラムによって実現される。アプリケーション層１５は、ＶｏＩＰのような通信プロトコルを使用して端末間で音声通信をするためのアプリケーションプログラムであってもよい。ＶｏＩＰのような通信プロトコルは、ＴＶ会議、電話会議、ビデオチャット、ボイスチャット、ＩＰ電話、他の様々な音声コミュニケーションを実行するために使用しうる。
【００１５】
入力タスク２２は、マイクロホン１２から音声信号のようなサウンドストリーム（Ｔｘ信号系列）を取得するためのサウンド入力タスクである。入力タスク２２は、Ａｎｄｒｏｉｄ−ＯＳ（登録商標）のＡｕｄｉｏＳｔｒｅａｍＩｎであってもよい。ＡｕｄｉｏＳｔｒｅａｍＩｎはサウンド（オーディオ）入力ハードウェアを抽象化するためのスレッドである。入力タスク２２は、上述のサウンドミドルウェア層１４上に位置する。
【００１６】
出力タスク２１と入力タスク２２は互いに独立したタスクである。したがって、出力タスク２１と入力タスク２２は互いに非同期で動作する。
【００１７】
エコーキャンセラ（ＥＣ）２３は、出力タスク２１から出力される出力サウンドデータに基づいて推定される疑似エコー信号（エコー成分）を、入力タスク２２から受信される入力サウンドデータから減じることによって、第１の入力サウンドデータ内のエコー成分をキャンセルするエコーキャンセル処理を実行する。このエコーキャンセラ（ＥＣ）２３は、サウンドミドルウェア層１４上に位置するソフトウェアによって実現し得る。なお、エコーキャンセラ（ＥＣ）２３にノイズキャンセラ（ＮＣ）の機能を追加してもよい。
【００１８】
エコーキャンセラ（ＥＣ）２３においては、入力サウンドデータ（Ｔｘ信号）に対応する出力サウンドデータ（Ｒｘ信号）に基づいて、入力サウンドデータ（Ｔｘ信号）内のエコー成分を推定する必要がある。このため、エコーキャンセラ（ＥＣ）２３においては、Ｔｘ信号とＲｘ信号の入力タイミングを合わせる必要があるため、２つのスレッド（出力タスク２１、入力タスク２２）から送られてくるデータ間の同期制御、つまり入力サウンドデータ（Ｔｘ信号）と出力サウンドデータ（Ｒｘ信号）との間の同期制御が必要となる。
【００１９】
上述したように、出力タスク（ＡｕｄｉｏＳｔｒｅａｍＩｎ）２１と入力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２２は非同期のタスク（非同期のスレッド）であり、例えばＶｏＩＰ開始時には出力タスク２１の動作開始タイミングと入力タスク２２の動作開始タイミングが異なる場合がある。例えば、ＶｏＩＰ動作開始時は出力タスク２１が入力タスク２２よりも先に動作を開始する場合がある。また、例えば、ＶｏＩＰ動作中においては、出力タスク２１からの出力サウンドデータ（Ｒｘ信号）の個数が入力タスク２２からの入力サウンドデータ（Ｔｘ信号）の個数よりも多くなるという現象（揺らぎ）、つまり余分なＲｘ信号が入力されるという現象が発生する場合がある。このような揺らぎが発生すると、Ｔｘ信号の入力タイミングとＲｘ信号の入力タイミングとが徐々にずれて行き、Ｔｘ／Ｒｘ信号間の同期がとれなくなる。そのため、ＶｏＩＰ開始時にはＲｘ信号とＴｘ信号の入力タイミングを合わせることが必要であり、さらに、ＶｏＩＰ動作中においては、Ｔｘ信号の入力タイミングとＲｘ信号の入力タイミングとがずれているか否かを判定し、入力タイミングのずれが検出された場合にはＴｘ信号の入力タイミングとＲｘ信号の入力タイミングとを調整することが必要となる。
【００２０】
そこで、本実施形態の信号処理装置１０は、Ｔｘ／Ｒｘ信号間の同期制御を行うように構成されたＴｘ／Ｒｘ同期制御部２４を備えている。Ｔｘ／Ｒｘ同期制御部２４はサウンドミドルウェア層（ＨＡＬ）１４に位置し、入力タスク（ＡｕｄｉｏＳｔｒｅａｍＩｎ）２２および出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１から入力サウンドデータ（Ｔｘ信号）および出力サウンドデータ（Ｒｘ信号）を順次受け取り、ある入力サウンドデータ（Ｔｘ信号）と、このある入力サウンドデータ（Ｔｘ信号）に対応する出力サウンドデータ（Ｒｘ信号）とがエコーキャンセラ（ＥＣ）２３に入力されることを可能にするための同期制御を行う。
【００２１】
図２は、Ｔｘ／Ｒｘ同期制御部２４の構成を示す。Ｔｘ／Ｒｘ同期制御部２４は、Ｒｘスレッド５０およびＴｘスレッド６０を備える。
【００２２】
Ｒｘスレッド５０は、出力タスク２１から出力される出力サウンドデータ（Ｒｘ信号）を、タイムスタンプが付与された状態でＲｘキュー５２に追加する。Ｒｘキュー５２は可変長のキューである。出力タスク２１から出力される出力サウンドデータはスピーカ１１に送出されると共に、Ｒｘスレッド５０にも送られる。Ｒｘスレッド５０が出力サウンドデータを受信した時に、Ｒｘスレッド５０はタイムススタンプ（現在のクロックタイム）を取得し、出力サウンドデータとタイムススタンプとを含むパケット（Ｒｘパケット）をＲｘキュー５２に追加する。タイムスタンプは、Ｒｘスレッド５０によって出力サウンドデータが受信されたタイミングを示す。
【００２３】
Ｔｘスレッド６０は、入力タスク２２によってマイクロホン１２から取得される入力サウンドデータ（Ｔｘ信号）を、タイムスタンプが付与された状態でＴｘキュー６２に追加する。Ｔｘキュー６２は可変長のキューである。Ｔｘスレッド６０が入力サウンドデータを受信した時に、Ｔｘスレッド６０はタイムススタンプ（現在のクロックタイム）を取得し、入力サウンドデータとタイムススタンプとを含むパケット（Ｔｘパケット）をＴｘキュー６２に追加する。このタイムスタンプは、Ｔｘスレッド６０によって入力サウンドデータが受信されたタイミングを示す。
【００２４】
Ｔｘスレッド６０は、さらに、Ｔｘ／Ｒｘタイムスタンプ比較部６４を備える。Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｒｘキュー５２から、Ｔｘキュー６２の先頭の入力サウンドデータ（第１の入力サウンドデータ）のタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する出力サウンドデータ（第１の出力サウンドデータ）をリファレンスデータとして取り出す制御部として機能する。上述の第１の入力サウンドデータはＴｘバッファ６８を介してエコーキャンセラ（ＥＣ）２３に送られ、また上述の第１の出力サウンドデータはＲｘバッファ６６を介してエコーキャンセラ（ＥＣ）２３に送られる。なお、上述の所定範囲は予め決められた時間長を有している。
【００２５】
上述したように、出力タスク２１と入力タスク２２は別個のタスクであり、これら出力タスク２１と入力タスク２２は非同期で動作する。このため、もしＲｘキュー５２から、Ｔｘキュー６２の先頭の入力サウンドデータ（第１の入力サウンドデータ）のタイムスタンプに一致するタイムスタンプを有する出力サウンドデータを取り出そうとすると、このような出力サウンドデータがなかなか見つからず、エコーキャンセル処理が比較的長い間実行されない可能性がある。この場合、エコー成分を含む入力サウンドデータが遠隔端末に送信されてしまう可能性がある。
【００２６】
本実施形態では、出力タスク２１と入力タスク２２が非同期で動作していることを考慮して、Ｒｘキュー５２から、Ｔｘキュー６２の先頭の入力サウンドデータ（第１の入力サウンドデータ）のタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する出力サウンドデータ（第１の出力サウンドデータ）をリファレンスデータとして取り出している。したがって、出力タスク２１と入力タスク２２とが非同期で動作する環境であっても、つまり、上述の揺らぎが発生しても、エコー成分を安定して推定することができ、これによって安定したエコーキャンセル処理を実現することができる。
【００２７】
より詳しくは、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、まず、Ｔｘキュー６２およびＲｘキュー５２の各々に蓄積されているデータ量をチェックする。エコーキャンセル処理に必要なデータサイズ以上のデータがＴｘキュー６２およびＲｘキュー５２の各々に蓄積されていれば、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｔｘキュー６２の先頭の入力サウンドデータのタイムスタンプ（Ｔｘ  Ｔｉｍｅ）をＲｘキュー５２の先頭の出力サウンドデータのタイムスタンプ（Ｒｘ  Ｔｉｍｅ）と比較する。そして、これらタイムスタンプ間の時間差（＝Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）が上述の所定範囲内である場合、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｔｘキュー６２の先頭の入力サウンドデータとＲｘキュー５２の先頭の出力サウンドデータとが同期していることをエコーキャンセラ（ＥＣ）２３に通知してもよい。これにより、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｒｘキュー５２の先頭の出力サウンドデータとＴｘキュー６２の先頭の入力サウンドデータとを使用したエコーキャンセル処理をエコーキャンセラ（ＥＣ）２３に実行させることができる。
【００２８】
エコーキャンセル処理においては、エコーキャンセラ（ＥＣ）２３は、Ｒｘキュー５２の先頭の出力サウンドデータをリファレンスデータとして使用する。そして、エコーキャンセラ（ＥＣ）２３は、例えばこのリファレンスデータとスピーカ１１からマイクロホン１２への伝達関数を模擬したフィルタ係数とを畳み込むことによって、リファレンスデータに対応する疑似エコー信号（エコー成分）を推定し、この疑似エコー信号をＴｘキュー６２の先頭の入力サウンドデータから減じる。疑似エコー信号が減じられた入力サウンドデータはＴｘ出力バッファ３１を介してアプリケーション層１５に送られる。このように、エコーキャンセラ（ＥＣ）２３においては、リファレンスデータに基づいてＴｘキュー６２の先頭の入力サウンドデータ内のエコー成分をキャンセルする処理が実行される。
【００２９】
一方、Ｔｘキュー６２の先頭の入力サウンドデータのタイムスタンプをＲｘキュー５２の先頭の出力サウンドデータのタイムスタンプとの間の時間差（＝Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）が上述の所定範囲を超えている場合には、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｔｘ／Ｒｘ信号間のタイミングがずれていること、つまりＲｘキュー５２の先頭の出力サウンドデータが余分な（古い）出力サウンドデータであると判定する。この場合、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｒｘキュー５２の先頭の出力サウンドデータを破棄してＲｘキュー５２の２番目の出力サウンドデータをＲｘキュー５２の先頭に移す。そして、Ｔｘ／Ｒｘタイムスタンプ比較部６４は、Ｔｘキュー６２の先頭の入力サウンドデータのタイムスタンプとＲｘキュー５２の先頭に移された出力サウンドデータのタイムスタンプとを再度比較する。このようにして、余分な（古い）出力サウンドデータが破棄されることにより、Ｔｘ／Ｒｘ信号間のタイミングが調整される。
【００３０】
ここで、ＶｏＩＰ開始時の同期制御動作を説明する。ＶｏＩＰ開始時には、出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１が入力タスク２２よりも先に動作を開始する場合がある。この場合、まず、最初に、Ｒｘキュー５２に幾つかのＲｘパケットが蓄積される。この後、入力タスク２２が動作を開始し、Ｔｘキュー６２にＴｘパケットが蓄積される。Ｔｘスレッド６０は、Ｔｘキュー６２の先頭のパケットのＴｘタイムスタンプとＲｘキュー５２の先頭のＲｘパケットのタイムスタンプとを比較する。このＲｘパケットはＴｘパケットよりもかなり古いパケットである場合がある。この場合、これらパケットのタイムスタンプ間の時間差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）は大きい。したがって、Ｔｘスレッド６０は、同期ずれが発生していると判定し、このＲｘパケットをＲｘキュー５２から破棄する。タイムスタンプ間の時間差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）が少なくなるまで、Ｒｘキュー５２の先頭のＲｘパケットに後続する幾つかのＲｘパケットが順次破棄される。
【００３１】
次に、ＶｏＩＰ動作中の同期制御動作を説明する。ＶｏＩＰ動作中においては、出力サウンド信号ＲｘデータがＴｘデータに比べて多く発生する場合がある。この場合、出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１から出力サウンドデータ（Ｒｘ信号）が連続して投げられ、Ｒｘキュー５２に余分なデータが蓄積されてしまうケースが発生する。この場合、短い期間内に複数のＲｘパケットが作成されるため、タイムスタンプの差が小さな複数のＲｘパケットがＲｘキュー５２に追加される。Ｔｘキュー６２に蓄積される複数のＴｘパケットそれぞれのタイムスタンプは一定に近い間隔で増加するのに対して、Ｒｘキュー５２に蓄積される複数のＲｘパケットそれぞれのタイムスタンプはほとんど増加しないため、Ｔｘキュー６２の先頭のＴｘパケットとＲｘキュー５２の先頭のＲｘパケットとの間の時間差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）が大きくなり、同期ずれと判定される。同期ずれと判定された場合には、Ｒｘキュー５２の先頭のＲｘパケットが破棄される。
【００３２】
図３は、Ｒｘスレッド５０によって生成されるＲｘパケットの構成例を示す。Ｒｘスレッド５０は、出力タスク２１から受信される出力サウンドデータ（バッファ）にタイムスタンプを付与してＲｘパケットを生成する。そして、Ｒｘスレッド５０は、Ｒｘパケットを、可変長のＲｘキュー５２の末尾に追加する。Ｒｘパケットは、出力サウンドデータ（バッファ）に、その出力サウンドデータのデータサイズ（バッファサイズ）とタイムスタンプとが付加された構造体である。
【００３３】
エコーキャンセル処理に必要なデータサイズ（ＥＣ入力バッファサイズ）分の出力サウンドデータがＲｘキュー５２から取り出される。同時に、タイムスタンプもＲｘキュー５２から取り出される。ＥＣ入力バッファサイズは、エコーキャンセル処理で使用される適応フィルタのフィルタ長に対応するデータサイズであってもよい。
【００３４】
Ｔｘパケットも、Ｒｘパケットと同様の構造を有する。すなわち、Ｔｘパケットは、入力サウンドデータ（バッファ）に、その入力サウンドデータのデータサイズ（バッファサイズ）とタイムスタンプとが付加された構造体である。
【００３５】
図４は、Ｔｘ／Ｒｘ同期制御部２４の動作を示す。Ｔｘキュー６２およびＲｘキュー５２の各々にＥＣ入力バッファサイズ分のデータが蓄積されていれば、Ｔｘ／Ｒｘ同期制御部２４は、Ｔｘキュー６２およびＲｘキュー５２の各々の先頭からデータを取り出す。同時に、Ｔｘ／Ｒｘ同期制御部２４は、Ｔｘキュー６２およびＲｘキュー５２の各々の先頭からタイムスタンプも取り出し、Ｔｘキュー６２の先頭のデータに対応するタイムスタンプとＲｘキュー５２の先頭のデータに対応するタイムスタンプとを比較する（タイムスタンプ比較処理）。
【００３６】
Ｒｘパケット内の出力サウンドデータのデータサイズ、Ｔｘパケット内の入力サウンドデータのデータサイズ、ＥＣ入力バッファサイズは、互いに異なる。このため、連続する２つのＴｘパケットをまたいで入力サウンドデータを取得するケースや、連続する２つのＲｘパケットをまたいで出力サウンドデータを取得するケースも発生する。
【００３７】
連続する２つのパケット（古いパケットと新しいパケット）をまたいでデータを取得する場合には、データの取得に新たに使用されたパケット（新しいパケット）のタイムスタンプがタイムスタンプ比較処理で使用される。図４においては、タイムスタンプ（２）とタイムスタンプ（３）とが比較される。なお、タイムスタンプ（３）とタイムスタンプ（４）とに基づいて、タイムスタンプ比較処理で使用すべき新たなタイムスタンプを算出してもよい。この場合、新しいパケットから取得されるデータサイズと古いパケットから取得されるデータサイズとの比に基づいて、古いパケットのタイムスタンプと新しいパケットのタイムスタンプの重み付け平均を算出してもよい。
【００３８】
タイムスタンプ比較処理においては、Ｔｘ／Ｒｘ同期制御部２４は、過去数フレームでのタイムスタンプの差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）の平均値（ＡＶＲ（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）を算出してもよい。
【００３９】
より詳しくは、Ｔｘ／Ｒｘ同期制御部２４は、Ｒｘキュー５２の先頭のＲｘパケットのタイムスタンプとＴｘキュー６２の先頭のＴｘパケットのタイムスタンプとの間の時間差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）と、直前の複数回のタイムスタンプ間の比較によって得られる複数個の時間差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）とを使用して、これら全ての時間差（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）の平均（移動平均）を上述の平均値（ＡＶＲ（Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）として算出し得る。移動平均が上述の所定範囲に対応する閾値よりも大きいか否かに応じて、Ｔｘ／Ｒｘ同期制御部２４は、同期ずれが発生しているか否かを判定する。このように移動平均を用いて同期ずれの有無を判定することにより、Ｒｘ／Ｔｘパケットのタイムスタンプの瞬時的な変動に影響されにくい、安定した判定動作を実現できる。
【００４０】
図５は、Ｔｘ／Ｒｘ同期制御部２４によって実行されるタイムスタンプ付与動作の例を示す。  
サウンドミドルウェア層１４よりもハードウェア寄りの層として上述のドライバ層１３が存在する。ドライバ層１３においてもＴｘ／Ｒｘ信号がバッファリングされる場合がある。この場合、出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１が下位に渡すＲｘ信号がスピーカ１１から出力されるタイミングは、ドライバ層１３内のサウンド出力バッファ（ＲｘＡＬＳＡＢｕｆ）１３１の埋まり具合に依存する可能性がある。サウンド出力バッファ（ＲｘＡＬＳＡＢｕｆ）１３１に蓄積されているデータ量が多いほど、Ｒｘ信号に対応する音が実際にスピーカ１１から出るタイミングは、Ｒｘ信号にタイムスタンプとして付与されたクロックタイムよりも遅くなる場合がある。
【００４１】
Ｔｘ／Ｒｘ同期制御部２４は、上述したように、Ｔｘ／Ｒｘ同期制御部２４が出力タスク２１からＲｘ信号を受信した時に、現在のクロックタイムを取得し、そのクロックタイムをタイムスタンプとしてＲｘ信号に付与する。この場合、Ｔｘ／Ｒｘ同期制御部２４は、サウンド出力バッファ（ＲｘＡＬＳＡＢｕｆ）１３１に蓄積されているデータ量に応じて、上述のクロックタイム（タイムスタンプ）を修正し得る。サウンド出力バッファ（ＲｘＡＬＳＡＢｕｆ）１３１に蓄積されているデータ量に対応する時間だけ、Ｒｘ信号に付与されるクロックタイム（タイムスタンプ）の値が進められるように、蓄積されているデータ量に応じたオフセット値をクロックタイムに加算することによってクロックタイム（タイムスタンプ）の値を修正してもよい。
【００４２】
同様に、入力タスク（ＡｕｄｉｏＳｔｒｅａｍＩｎ）２２からＴｘ信号が出力されるタイミングは、ドライバ層１３内のサウンド入力バッファ（ＴｘＡＬＳＡＢｕｆ）１３２の埋まり具合に依存する可能性がある。サウンド入力バッファ（ＴｘＡＬＳＡＢｕｆ）１３２に蓄積されているデータ量が多いほど、入力タスク（ＡｕｄｉｏＳｔｒｅａｍＩｎ）２２からＴｘ信号が出力されるタイミングは、マイクロホン１２に音声信号が入力されるタイミングよりも遅くなる。Ｔｘ／Ｒｘ同期制御部２４は、上述したように、Ｔｘ／Ｒｘ同期制御部２４が入力タスク２２からＴｘ信号を受信した時に、現在のクロックタイムを取得し、そのクロックタイムをタイムスタンプとしてＴｘ信号に付与する。この場合、Ｔｘ／Ｒｘ同期制御部２４は、サウンド入力バッファ（ＴｘＡＬＳＡＢｕｆ）１３２に蓄積されているデータ量に応じて、上述のクロックタイム（タイムスタンプ）を修正し得る。サウンド入力バッファ（ＴｘＡＬＳＡＢｕｆ）１３２に蓄積されているデータ量に対応する時間だけ、Ｔｘ信号に付与されるクロックタイム（タイムスタンプ）の値が遅らされるように、蓄積されているデータ量に応じたオフセット値をクロックタイムから減算することによってクロックタイム（タイムスタンプ）の値を修正してもよい。
【００４３】
図６のフローチャートは、Ｔｘ／Ｒｘ同期制御部１４内のＲｘスレッド５０によって実行される処理の手順を示す。
【００４４】
出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１がオペレーティングシステムからコールされると（ステップＳ１１）、出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１は、Ｒｘ信号を出力する。このＲｘ信号はドライバ層１３を介してスピーカ１１に送られると共に、Ｒｘスレッド５０に送られる。Ｒｘスレッド５０は、Ｒｘ信号の受信に応答して、クロック関数を使用して、オペレーティングシステムを通じて現在のクロックタイムをタイムスタンプ（システムタイムスタンプ）として取得する（ステップＳ１２）。
【００４５】
Ｒｘスレッド５０は、Ｒｘ信号（バッファ）、バッファサイズ、タイムスタンプを含む上述のＲｘパケットを生成する（ステップＳ１３）。そして、Ｒｘスレッド５０は、Ｒｘパケットを可変長のＲｘキュー５２の末尾に追加する（ステップＳ１４）。ステップＳ１２〜Ｓ１４の処理は、Ｒｘ信号が受信される度に実行される。
【００４６】
図７のフローチャートは、Ｔｘ／Ｒｘ同期制御部２４のＴｘスレッド６０によって実行される処理の手順を示す。  
入力タスク（ＡｕｄｉｏＳｔｒｅａｍＩｎ）２２がオペレーティングシステムからコールされると（ステップＳ２１）、入力タスク（ＡｕｄｉｏＳｔｒｅａｍＩｎ）２２は、Ｔｘ信号を出力する。このＴｘ信号はＴｘスレッド６０に送られる。Ｔｘスレッド６０は、Ｔｘ信号の受信に応答して、クロック関数を使用して、オペレーティングシステムを通じて現在のクロックタイムをタイムスタンプ（システムタイムスタンプ）として取得する（ステップＳ２２）。Ｔｘスレッド６０は、Ｔｘ信号（バッファ）、バッファサイズ、タイムスタンプを含む上述のＴｘパケットを生成する（ステップＳ３３）。そして、Ｔｘスレッド６０は、Ｔｘパケットを可変長のＴｘキュー６２の末尾に追加する（ステップＳ２４）。
【００４７】
次いで、Ｔｘスレッド６０内のタイムスタンプ比較部６４は、上述の同期制御動作を実行する（ステップＳ２５）。このステップＳ２５では、タイムスタンプ比較部６４は、Ｒｘキュー５２から、Ｔｘキュー６２の先頭のＴｘパケットのタイムスタンプ（Ｔｘ  Ｔｉｍｅ）との時間差が所定範囲内のタイムスタンプ（Ｒｘ  Ｔｉｍｅ）を有するＲｘパケットを取り出す。この場合、タイムスタンプ比較部６４は、Ｔｘキュー６２の先頭のＴｘパケットのタイムスタンプ（Ｔｘ  Ｔｉｍｅ）とＲｘキュー５２の先頭のＲｘパケットのタイムスタンプ（Ｒｘ  Ｔｉｍｅ）とを比較して、これらタイムスタンプ間の時間差（＝Ｔｘ  Ｔｉｍｅ−Ｒｘ  Ｔｉｍｅ）を算出する。この後、エコーキャンセラ（ＥＣ）２３は、Ｔｘキュー６２の先頭のＴｘパケット内のＴｘ信号と、取り出されたＲｘとを使用して、上述のエコーキャンセル処理（ＥＣ処理）を実行する（ステップＳ２６）。ステップＳ２６では、ＥＣ処理のみならず、ノイズキャンセル処理（ＮＣ）も実行しても良い。
【００４８】
図８のフローチャートは、Ｔｘスレッド６０によって実行される同期制御動作の手順を示す。Ｔｘスレッド６０は、Ｔｘキュー６２に蓄積されているデータサイズがエコーキャンセル処理に必要なデータサイズ（Ｘサンプル）よりも多く、且つＲｘキュー５２に蓄積されているデータサイズがエコーキャンセル処理に必要なデータサイズ（Ｘサンプル）よりも多いという条件が成立しているか否かを判定する（ステップＳ３１）。
【００４９】
上述の条件が成立しているならば（ステップＳ３１のＹＥＳ）、Ｔｘスレッド６０は、Ｔｘキュー６２の先頭のＴｘパケットを取得し（ステップＳ３２）、そしてＲｘキュー５２の先頭のＲｘパケットを取得する（ステップＳ３３）。ステップＳ３２では、Ｔｘスレッド６０は、Ｔｘキュー６２の先頭のＴｘパケットからタイムスタンプを取り出し、さらにＴｘキュー６２の先頭のＴｘパケットからＸサンプル分のデータを取り出しても良い。同様に、ステップＳ３３では、Ｔｘスレッド６０は、Ｒｘキュー５２の先頭のＲｘパケットからタイムスタンプを取り出し、さらにＲｘキュー５２の先頭のＲｘパケットからＸサンプル分のデータを取り出しても良い。
【００５０】
そして、Ｔｘスレッド６０は、取り出したＴｘパケットのタイムスタンプと取り出したＲｘパケットのタイムスタンプとを比較し、そして時間差（ＴｘＲｘＴｉｍｅＤｉｆｆ）を算出する（ステップＳ３４）。次いで、Ｔｘスレッド６０は、以前に算出された幾つかの時間差（ＴｘＲｘＴｉｍｅＤｉｆｆ）と今回算出された時間差（ＴｘＲｘＴｉｍｅＤｉｆｆ）とを使用して、時間差（ＴｘＲｘＴｉｍｅＤｉｆｆ）の移動平均値（ＴｘＲｘＴｉｍｅＤｉｆｆＡｖｒ）を算出する（ステップＳ３５）。
【００５１】
Ｔｘスレッド６０は、移動平均値（ＴｘＲｘＴｉｍｅＤｉｆｆＡｖｒ）が上述の所定範囲に対応する閾値（ＳｙｎｃＤｅｌａｙＴｈｒ）未満であるか否かに応じて、同期ずれが発生しているか否かを判定する（ステップＳ３６）。移動平均値（ＴｘＲｘＴｉｍｅＤｉｆｆＡｖｒ）が上述の所定範囲に対応する閾値（ＳｙｎｃＤｅｌａｙＴｈｒ）未満であるならば（ステップＳ３６のＹＥＳ）、Ｔｘスレッド６０は、Ｔｘキュー６２の先頭のＴｘパケットから取り出されたＸサンプル分のデータと、Ｒｘキュー５２の先頭のＲｘパケットから取り出されたＸサンプル分のデータとを、エコーキャンセラ（ＥＣ）２３に送る（ステップ３７）。あるいは、Ｔｘスレッド６０は、Ｔｘ信号とＲｘ信号とが同期していることのみをエコーキャンセラ（ＥＣ）２３に通知しても良い。この場合、エコーキャンセラ（ＥＣ）２３は、Ｔｘキュー６２の先頭のＴｘパケットからＸサンプル分のデータを取り出し、さらに、Ｒｘキュー５２の先頭のＲｘパケットからＸサンプル分のデータを取り出す。
【００５２】
移動平均値（ＴｘＲｘＴｉｍｅＤｉｆｆＡｖｒ）が上述の所定範囲に対応する閾値（ＳｙｎｃＤｅｌａｙＴｈｒ）未満でないならば（ステップＳ３６のＮＯ）、Ｔｘスレッド６０は、上述の揺らぎに起因して同期ずれが発生していると判定し、Ｒｘキュー５２の先頭のＲｘパケットを破棄してＲｘキュー５２の２番目のＲｘパケットをＲｘキュー５２の先頭に移す（ステップＳ３８）。このように、Ｒｘキュー５２の先頭のＲｘパケットを破棄することにより、Ｒｘ信号とＴｘ信号のタイミングを調整することができる。つまり、たとえ、上述の揺らぎに起因して、Ｔｘキュー６２の先頭のＴｘパケットよりも古い幾つかのＲｘパケットがＲｘキュー５２に蓄積されるという現象が発生しても、Ｔｘキュー６２の先頭のＴｘパケットのＴｘ信号に対応するＲｘ信号をエコーキャンセラ（ＥＣ）２３に提供することが可能となる。
【００５３】
図９は、信号処理装置１０のアプリケーション層１５の構成例を示す。ここでは、信号処理装置１０は、上述のスピーカ１１、マイクロホン１２、エコーキャンセラ（ＥＣ）２３、Ｔｘ／Ｒｘ同期制御部２４に加え、ユーザボリューム１００、通信部２０１、復号化部２０２、符号化部２０３を備える。ユーザボリューム１００は、出力サウンドデータの音量レベルをユーザ操作に応じて変更する。通信部２０１、復号化部２０２、および符号化部２０３は上述のＶｏＩＰを使用して音声通話を行うアプリケーション部として機能する。遠隔端末から受信される音声信号（Ｒｘ信号）は、復号化部２０２によってデコードされる。デコードされた音声信号は出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１を介してＤ／Ａコンバータに送られると共に、Ｔｘ／Ｒｘ同期制御部２４に送られる。デコードされた音声信号はＤ／Ａコンバータによってデジタル音声信号からアナログ音声信号に変換される。このアナログ音声信号に対応する音がスピーカ１１から出力される。
【００５４】
スピーカ１１から出力される音はエコー（音響エコー）としてマイクロホン１２に回り込む。マイクロホン１２によって収音される音声信号は、Ａ／Ｄコンバータによってアナログ音声信号からデジタル音声信号に変換される。デジタル音声信号（Ｔｘ信号）は出力タスク（ＡｕｄｉｏＳｔｒｅａｍＯｕｔ）２１を介してＴｘ／Ｒｘ同期制御部２４に送られる。Ｔｘ／Ｒｘ同期制御部２４では、Ｔｘ信号に対応するＲｘ信号がＲｘキュー５２から取り出され、Ｔｘ信号と、この取り出されたＲｘ信号とがエコーキャンセラ（ＥＣ）２３に送られる。エコーキャンセラ（ＥＣ）２３では、Ｒｘ信号に基づいて疑似エコー信号が生成され、Ｔｘ信号から疑似エコー信号が減じられる。Ｔｘ信号から疑似エコー信号を減じることによって得られる残差信号、つまり音響エコーが抑圧されたＲｘ信号は、符号化部２０３によってエンコードされる。エンコードされたＲｘ信号は通信部２０１を介して遠隔端末に送信される。
【００５５】
図１０は、信号処理装置１０のアプリケーション層１５の構成例を示す。ここでは、信号処理装置１０は、図９の通信部２０１、復号化部２０２、および符号化部２０３の代わりに、メモリ３０１および音声認識部３０２を備える。メモリ３０１には、ＴＶ番組、音楽のようなコンテンツデータ（メディアデータ）が格納されている。音声認識部３０２は、マイクロホン１２から入力される音声信号を認識するためのアプリケーションプログラムとして機能し得る。信号処理装置１０においては、さらに、メディアデータを再生するためのアプリケーションプログラムも実行される。図１０の信号処理装置１０においては、再生されるメディアデータに対応する音がエコー（音響エコー）としてマイクロホン１２に回り込む。このエコーもエコーキャンセラ（ＥＣ）２３によって抑圧することができる。
【００５６】
以上説明したように、本実施形態によれば、出力タスク２１から出力される出力サウンドデータ（Ｒｘ信号）はタイムスタンプが付与された状態でＲｘキュー５２に追加され、入力タスク５２によってマイクロホン１２から取得される入力サウンドデータ（Ｔｘ信号）は、タイムスタンプが付与された状態でＴｘキュー６２に追加される。そして、Ｒｘキュー５２から、Ｔｘキュー６２の先頭の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する出力サウンドデータがリファレンスデータとして取り出される。そして、エコーキャンセラ（ＥＣ）２３では、リファレンスデータに基づいてＴｘキュー６２の先頭の入力サウンドデータ内のエコー成分がキャンセルされる。このように、Ｒｘキュー５２から、Ｔｘキュー６２の先頭の入力サウンドデータのタイムスタンプとの時間差が所定範囲内のタイムスタンプを有する出力サウンドデータがリファレンスデータとして取り出すことにより、エコー成分の推定を安定して行うことが可能となり、これによって非リアルタイムＯＳにエコーキャンセラ（ＥＣ）が組み込まれた環境においても、安定したエコーキャンセル動作を行うことができる。
【００５７】
なお、本実施形態のＴｘ／Ｒｘ同期制御部２４はソフトウェアによって実現できるので、このＴｘ／Ｒｘ同期制御部２４の処理手順を実行するコンピュータプログラムを、このコンピュータプログラムが格納されたコンピュータ読み取り可能な記憶媒体を通じて情報端末のようなコンピュータにインストールして実行するだけで、本実施形態と同様の効果を容易に実現することができる。
【００５８】
なお、Ｔｘ／Ｒｘ同期制御部２４およびエコーキャンセラ（ＥＣ）２３の各々は専用のまたは汎用のハードウェアによって実現してもよい。
【００５９】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００６０】
１０…信号処理装置、１１…スピーカ、１２…マイクロホン、２１…出力タスク、２２…入力タスク、２３…エコーキャンセラ、２４…Ｔｘ／Ｒｘ同期制御部、５２…Ｒｘキュー、６２…Ｔｘキュー、６４…タイムスタンプ比較部。
【図１】
2014123875.tif 000003
【図２】
2014123875.tif 000004
【図３】
2014123875.tif 000005
【図４】
2014123875.tif 000006
【図５】
2014123875.tif 000007
【図６】
2014123875.tif 000008
【図７】
2014123875.tif 000009
【図８】
2014123875.tif 000010
【図９】
2014123875.tif 000011
【図１０】
2014123875.tif 000012