HARK FORUM › HarkDataStreamSenderのデータを受信するための既存ノードの有無
- This topic has 12 replies, 3 voices, and was last updated 4 years, 1 month ago by moriya.
-
AuthorPosts
-
September 8, 2020 at 11:02 am #1577
添付の図のように、ソケット通信でアレイマイクの音声を送信して、受信側で任意の方向ごとに音声を分離して出力したいと考えています。実現の可能性また実現方法について下記3点についてご質問させてください。HARKは使ったことがありません。Hark.jpのFAQとForumはわからないなりに同様の質問がないかは確認したつもりですが内容的に理解ができないところも多く、見落としあればすみません。
(1) HarkDataStreamSenderのデータを受信するための既存ノードの有無
HarkDataStreamSenderのデータを受信するためのノードはありますでしょうか?自作するしかないのでしょうか?
以下2つでは自作しているように思ったのですが、自作するしかないのでしょうか?
https://wp.hark.jp/forums/topic/how-to-receive-data-from-harkdatastreamsender/
https://wp.hark.jp/forums/topic/stream%e3%81%ae%e9%81%85%e5%bb%b6%e6%99%82%e9%96%93%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/(2) hark windowsの独自ノード作成の可能性
自作の場合、FAQに「HARK Windowsでの独自ノードの追加はサポートされていません。」とありました。
現状のharkのバージョンでもそうでしょうか? また、GUIを使わなければ、自分でhark-pythonや、C++を使ってデータを受信する部分を実装して、BeamFormingノードのコードを流用して音声ファイル出力することは可能でしょうか?(そもそもOS的に難しいのか?、C++でHarkオブジェクトを操作すれば可能でしょうか?)(3) 音声ファイル出力について
図中のWindows側で、指定した方向の音声だけを受信したい場合で、例えば、0〜10度、90-120度の音声をそれぞれのファイルに出力するということは可能でしょう?(ドキュメントを読むと同一PC上だとできそうな気がするのですが、ソケット通信後でもできますでしょうか?)- This topic was modified 4 years, 2 months ago by moriya.
September 8, 2020 at 11:06 am #1578(WPのエラーで投稿いじってたらおかしくなりました。すみません。)
添付の図のように、ソケット通信でアレイマイクの音声を送信して、受信側で任意の方向ごとに音声を分離して出力したいと考えています。実現可能か?また実現方法について下記3点についてご質問させてください。
※HARKは使ったことがありません。Hark.jpのFAQとForumはわからないなりに同様の質問がないかは確認したつもりですが見落としあればすみません。(1) HarkDataStreamSenderのデータを受信するための既存ノードの有無
HarkDataStreamSenderのデータを受信するためのノードはありますでしょうか?自作するしかないのでしょうか?
以下2つでは自作しているように思ったのですが、自作するしかないのでしょうか?
https://wp.hark.jp/forums/topic/how-to-receive-data-from-harkdatastreamsender/
https://wp.hark.jp/forums/topic/stream%e3%81%ae%e9%81%85%e5%bb%b6%e6%99%82%e9%96%93%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/(2) hark windowsの独自ノード作成の可能性
自作の場合、FAQに「HARK Windowsでの独自ノードの追加はサポートされていません。」とありました。
現状のharkのバージョンでもそうでしょうか? また、GUIを使わなければ、自分でhark-pythonや、C++を使ってデータを受信する部分を実装して、BeamFormingノードのコードを流用して音声ファイル出力することは可能でしょうか?(そもそもOS的に難しいのか?、C++でHarkオブジェクトを操作すれば可能でしょうか?)(3) 音声ファイル出力について
図中のWindows側で、指定した方向の音声だけを受信したい場合で、例えば、0〜10度、90-120度の音声をそれぞれのファイルに出力するということは可能でしょう?(ドキュメントを読むと同一PC上だとできそうな気がするのですが、ソケット通信後でもできますでしょうか?)画像がwordpressのエラーで添付できませんでした。 png, jpegでもダメでした。ファイルは512KB以下です。
以下、図をテキストで表現しました。
マイク(Tamago-03)
↓
——–[Utuntu]——————
↓
マイクから音声取得(AudioStreamFromMic)
↓
データ送信(HarkDataStreamSender)
———————————–
↓
↓
Socket通信
↓
↓
——–[Windows10Pro]————-
↓
データ受信
↓
データの取得方向指定(ConstantLocalization)
↓
ビームフォーミング(BeamForming)
↓
音声出力
———————————–
※ utuntuとwindowsは同一LANSeptember 9, 2020 at 1:54 pm #1625お問い合わせありがとうございます。
> ソケット通信でアレイマイクの音声を送信して、受信側で任意の方向ごとに音声を分離して出力したいと考えています。実現可能か?また実現方法について下記3点についてご質問させてください。
実現可能です。実現方法は複数あります。
- HarkDataStreamSenderの出力を受信するノードを作る(C++/Pythonは問わない)
- 受信側ネットワークファイルの最初のノードをAudioStreamFromMicにして、デバイスタイプにNETWORKを選択する
送信側の仕様については下記URLに記述がありますが、IEEE float形式のrawデータを送信するだけですのでシンプルな実装で済みます
動作確認は、arecordをIEEE float形式(FLOAT_LE)で実行し、pipeでtcpdump(HARKのAudioStreamFromMic宛て)に送るだけで動きます(TCP/IPセッションの管理などのために、実際の運用ではアプリを書かれた方が良いと思います)
https://www.hark.jp/document/hark-document-ja/subsec-AudioStreamFromMic.html
「ソケット通信で」の部分が重要でなければ下記の候補もご検討ください。
- HARK-ROSのPublisher/Subscriberを使用する(ROSの知識が必要になります)
- HARK 3.1 から処理分配機能が追加されましたので、ノードを実行するホストを変更する事で処理を振り分ける(現在、HARK 3.1はUbuntu版のみリリースしております)
Windows環境の場合は、VMwareやVirtualBox等でUbuntuのVirtualMachine環境を準備する必要があります
> (1) HarkDataStreamSenderのデータを受信するための既存ノードの有無
> HarkDataStreamSenderのデータを受信するためのノードはありますでしょうか?自作するしかないのでしょうか?HarkDataStreamSenderはHARKの出力を外部アプリケーションで受信できるようにするために作成されたノードですので、受信側のノードは準備しておりません。
> (2) hark windowsの独自ノード作成の可能性
> 自作の場合、FAQに「HARK Windowsでの独自ノードの追加はサポートされていません。」とありました。Windows版のHARKでも、HARK-Python3を用いたPython実装で独自ノードを作成する事は可能です。
Windows版のHARKでは、MSYS2やAnaconda等の複合環境を用いてビルドする関係で環境構築の難しさからソースコードに改変が必要な箇所などを含め情報を開示しておりません。つまり、C++実装による独自パッケージのビルド環境がユーザー様側で容易に構築できないためサポートしていないという表記となっております。> (3) 音声ファイル出力について
> 図中のWindows側で、指定した方向の音声だけを受信したい場合で、例えば、0〜10度、90-120度の音声をそれぞれのファイルに出力するということは可能でしょう?(ドキュメントを読むと同一PC上だとできそうな気がするのですが、ソケット通信後でもできますでしょうか?)ソケット通信と関係なく可能です。
SaveWavePCMノードのSOURCES(音源情報)入力端子の前段に、方位角のフィルタのためにSourceByDirectionノード(0~10度と90~120度の範囲に設定した2つを準備します)、および複数音源情報の結合にはCombineSourceノードを用いてください。
SaveWavePCMノードのファイル名にタグを付与する機能で角度値をファイル名に埋め込むことが可能です。
https://www.hark.jp/document/hark-document-ja/subsec-SaveWavePCM.html
https://www.hark.jp/document/hark-document-ja/subsec-SourceSelectorByDirection.html
https://www.hark.jp/document/hark-document-ja/subsec-CombineSource.html以上、宜しくお願い致します。
HARK Support Team- This reply was modified 4 years, 2 months ago by Masayuki Takigahira.
- This reply was modified 4 years, 2 months ago by Masayuki Takigahira.
- This reply was modified 4 years, 2 months ago by Masayuki Takigahira.
- This reply was modified 4 years, 2 months ago by Masayuki Takigahira.
- This reply was modified 4 years, 2 months ago by Masayuki Takigahira.
September 9, 2020 at 5:43 pm #1639ご回答いただきありがとうございます。
回答いただいた内容の不明点、および追加の質問になってしまう内容もありますが、4点ほど質問させてください。
よろしくお願いいたします。●質問1
> ・HARK 3.1 から処理分配機能が追加されましたので、ノードを実行するホストを変更する事で処理を振り分ける(現在、HARK 3.1はUbuntu版のみリリースしております)処理分配機能について、ドキュメント(3.1.0)のどのページを見ればよいか、教えていただけませんでしょうか?
(目次からそれらしいのがわからず、それらしいキーワードでぐぐっても探せなかったため)●質問2
>SaveWavePCMノードのSOURCES(音源情報)入力端子の前段に、方位角のフィルタのためにSourceByDirectionノード(0~10度と90~120度の範囲に設定した2つを準備します)、および複数音源情報の結合にはCombineSourceノードを用いてください。SourceSelectorByDirectionのパラーメータ値(フィルタリングする角度情報)を外部から動的に与えるにはどうすればよいでしょうか?例えば、時刻t1では0-10度、時刻t2では20-30度、時刻t3では70-90度のように、動的に任意の角度を渡したいのですが、その場合、どのようなノードを使えばよいでしょうか?
(やりたいことは質問3の具体例部分です)●質問3
SaveWavePCMを複数音源の音声を結合する方法がわからないので教えていただきたい。頂いた回答とドキュメントから以下のように理解しました
・CombineSourceは、2入力なので、もし複数入力に対応するには多段にすればよい
・もし複数音源(Tamago-03が複数)の場合、AudioStreamFromMicをMultiAudioStreamFromMicに変更して、
それぞれを次段のノードのINPUTとし、SourceSelectorByDirectionでフィルタリングまではできるが、音声出力部分がまだわからないため質問させてください。
SaveWavePCMの、INPUTは1つのようなので、複数の音源の音声データを結合して出力する場合は、どのようにすればよいでしょうか?具体的には、以下のことを実現するにはどのようにすればよいでしょうか?
———————————
時刻t1〜t2については音源1(Tamago-03)の0度〜10度を抽出した音声データ、
時刻t2〜t3については音源2の30度〜40度を抽出した音声データ、
時刻t3〜t4については音源2の0度〜20度を抽出した音声データ、
時刻t4〜t5については音源3の70度〜80度を抽出した音声データ、
を、時刻t1〜t5の1本の音声データとして出力また、上記と同時に、
時刻t1〜t2については音源3の10度〜20度を抽出した音声データ、
時刻t2〜t3については音源1の80度〜90度を抽出した音声データ、
時刻t3〜t4については音声データなし、
時刻t4〜t5については音源1の70度〜80度を抽出した音声データ、
を、時刻t1〜t5の1本の音声データとして出力したいというように、複数条件でフィルタリングした音声を出力したい
※1つ目の例のt1と、2つ目の例のt1は同じ時刻。
————————————●質問4
質問3の具体例のような処理を行う場合に必要となるPCのスペックを検討しています。
上記の処理は主にビームフォーミング処理と音声結合処理から構成されますが、どの程度のスペックのPCで各々の計算時間がどの程度になるのか、知見がございましらご教示頂けないでしょうか?September 16, 2020 at 8:18 pm #1690お問い合わせありがとうございます。
> ●質問1
> 処理分配機能について、ドキュメント(3.1.0)のどのページを見ればよいか、教えていただけませんでしょうか?
> (目次からそれらしいのがわからず、それらしいキーワードでぐぐっても探せなかったため)確認致しましたところ、ドキュメントの更新作業に遅れが発生しており
十分な情報がまだ公開されていない状況となっております。
もし宜しければ、別のThreadを立ててPostして頂けませんでしょうか。> ●質問2
> SourceSelectorByDirectionのパラーメータ値(フィルタリングする角度情報)を外部から動的に与えるにはどうすればよいでしょうか?例えば、時刻t1では0-10度、時刻t2では20-30度、時刻t3では70-90度のように、動的に任意の角度を渡したいのですが、その場合、どのようなノードを使えばよいでしょうか?
> (やりたいことは質問3の具体例部分です)SourceSelectorByDirectionは静止した話者方向のみを残すフィルタリングを目的としているため、
フィルタリングする角度情報を動的に与えることは出来ません。
HARK-Python等でSource情報を入力してフィルタ方向を決定するノードを実装する必要があります。
前回の図ではConstantLocalizationを使用されていますが、時間で動的に変化する音源を追跡するという事で宜しいでしょうか?その場合には、LocalizeMUSIC等の定位ノードで音源検出を行う必要があります。
動的に変化する音源であるが、音源方向が既知であるという場合についても考えましたがマイクアレイからの入力との事でしたので、お使いになる用途について確認させて頂ければと思います。> ●質問3
> SaveWavePCMを複数音源の音声を結合する方法がわからないので教えていただきたい。INPUT入力端子は1つですが、複数音源のスペクトルデータが入力されています。
まず、SaveWavePCMの挙動について説明させて頂きます。
SOURCES入力端子には音源情報(音源ID、定位結果の座標など)が Vector (C++ の std::vector に相当) で入力されます。また、INPUT入力端子には分離スペクトルが Map(C++ の std::map に相当)で入力されます。つまり、どちらの入力端子でも複数音源のデータを1端子で入力しています。
SaveWavePCMノードは毎フレーム受け取る Map の同一の Key (音源ID)を1つのファイルに書き出します。つまり、有音区間のデータしか書き出しされません。SOURCES入力端子が接続されている場合は、音源情報に含まれる音源IDだけがファイルに書き出されます。SOURCES入力端子が未接続時は Map に含まれるすべての Key (音源ID)が出力されます。無音区間を含めて結合する必要がある場合について:
soxなどの外部ツールをお使いください。
SaveSourceLocationノードで音源情報をファイルに出力する事が可能ですので、各音声ファイルの開始/終了フレーム(音声区間)をご確認頂く事が可能です。その時間情報に基づき、sox等の外部ツールを使って結合する事でご希望のファイルを得る事が出来ます。soxの場合、無音に対して音声ファイルの開始時間を与えてMixingしたものをファイルに書き出すのが楽だと思います。質問3の最後に書かれていた具体例について:
既知の音源方向であると仮定して書かせて頂きます。
前者はt1~t5までが連続しているため音源情報のIDが同一で、音源座標の情報が「 t1=> 5度 =>t2=> 35度 =>t3=> 10度 =>t4=> 75度 =>t5 」と変動していれば1つの音声データとして出力可能です。後者の場合にはt1~t3とt4~t5の2つの区間に分かれてしまっているので2つの音声データとして出力されます。
既知の特定時間で変動する音源情報を作るためには、次のように作成します。
まず、IterCountノードで現在のフレームカウント(16000Hzサンプリング、ADVANCEが160サンプルの初期設定では1フレームが10msです。)を取得し、これとConstantノードで与える定数(何フレーム目で切り替えるか)をGreaterまたはSmallerノードで比較した結果をIFノードの条件(COND端子の入力)とします。各区間での方向を表す座標を与えたConstantLocalizationノードをIFノードのTHEN端子とELSE端子に入力してこれを切り替える回数だけ多段に接続してください。
また、前者/後者の2つの音源情報をCombineSourceノードで結合し、SOURCES端子の入力とします。
*)別件ですが、Wordpress原因で図が添付できない問題が解決しましたので、ご連絡させて頂きます。テキストだと分かりにくいかと思われますので、後ほどサンプルを添付させて頂きます。> ●質問4
> 質問3の具体例のような処理を行う場合に必要となるPCのスペックを検討しています。
> 上記の処理は主にビームフォーミング処理と音声結合処理から構成されますが、どの程度のスペックのPCで各々の計算時間がどの程度になるのか、知見がございましらご教示頂けないでしょうか?毎年、HARK講習会を開催しておりますが来訪者の方には下記スペックのPCを準備して頂いております。
プロセッサ:Core iシリーズ (メモリ:4GB以上搭載、SSD搭載 を推奨)ビームフォーミング処理等は使用するアルゴリズムやパラメータで計算時間が異なりますので具体的な時間は申し上げにくいのですが、上記スペックのPCであればリアルタイムに処理を行うことが出来ます。
オフライン(ファイル入力)では実時間より短くなりますが、実際に処理を行って確認して頂く必要があります。—
投稿タイトルと異なる内容のご質問となる場合(例えば 質問1 や 質問4 のような場合)は、別のThreadに分けて投稿して頂いた方が他の方からも回答が付きやすくなります。ご検討ください。以上、宜しくお願い致します。
HARK Support Team,September 17, 2020 at 10:02 am #1697ご回答いただきありがとうございます。
以下、質問1と4に関して記入します。
質問2と3に関して、質問が下手で無駄なやりとりが発生しお手数おかけして申し訳ございません。
ご回答いただいた内容を確認し、不明点があれば後ほどご質問させてください。●質問1に関して
> 確認致しましたところ、ドキュメントの更新作業に遅れが発生しており十分な情報がまだ公開されていない状況となっております。もし宜しければ、別のThreadを立ててPostして頂けませんでしょうか。別スレッドでpostしました。よろしくお願いいたします。
https://wp.hark.jp/forums/topic/%e5%87%a6%e7%90%86%e5%88%86%e9%85%8d%e6%a9%9f%e8%83%bd%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e8%a8%98%e8%bc%89%e3%81%95%e3%82%8c%e3%81%a6%e3%81%84%e3%82%8b%e3%83%9a%e3%83%bc%e3%82%b8/●質問4に関して
ご回答ありがとうございます。●その他
>投稿タイトルと異なる内容のご質問となる場合(例えば 質問1 や 質問4 のような場合)は、別のThreadに分けて投稿して頂いた方が他の方からも回答が付きやすくなります。ご検討ください。承知しました。
September 17, 2020 at 2:49 pm #1714質問2について、使用用途について説明させてください。
●いただいたご回答
> SourceSelectorByDirectionは静止した話者方向のみを残すフィルタリングを目的としているため、フィルタリングする角度情報を動的に与えることは出来ません。HARK-Python等でSource情報を入力してフィルタ方向を決定するノードを実装する必要があります。
> 前回の図ではConstantLocalizationを使用されていますが、時間で動的に変化する音源を追跡するという事で宜しいでしょうか?その場合には、LocalizeMUSIC等の定位ノードで音源検出を行う必要があります。
> 動的に変化する音源であるが、音源方向が既知であるという場合についても考えましたがマイクアレイからの入力との事でしたので、お使いになる用途について確認させて頂ければと思います。●使用用途
質問が下手で、お手数おかけして申し訳ございません。
ConstantLocalizationは、harkが分かっていない状態でしたので、このノードでできそうかなぁと思って書いていました。やりたいことは、「動的に変化する音源で、音源方向が既知である(外部でプログラムが方向を知っているのでHARKに渡したい)が、音源方向が固定ではなく動的(時間で任意に変化)な場合のフィルタリングです」。音源の定位(方向の認識)は外部プログラム(自前のアルゴリズム)を使う想定です。
自作のプログラムで時間ごとに変わる位置を把握し、それをharkに渡すことでharkのbeamformingでフィルタリングしたいと考えています。
そのためには、どのような実現方法がありますでしょうか?よろしくお願いいたします。
September 18, 2020 at 2:56 pm #1718上記では、beamformingでフィルタリングしたいと書きましたが、
beamformingにこだわりはないので、外部から渡した指定方向の音声だけwaveで保存したいだけなので、例えば、以下のような感じで実現できるないかなぁと考えています。AudioStreamFromMic ↓ MatrixToMap ↓ MapSelectorBySource ← 独自ノード(動的にSOURCE情報を渡す) ↓ 他のMapSelectorの結果との結合 ← MapSelectorBySource ← 独自ノード(同様の機能) ↓ SaveWavePCM
September 23, 2020 at 7:44 pm #1797お問い合わせありがとうございます。
外部から音源方向を含むSOURCE情報を渡すのであれば、
その時点で音源定位が完了しているものとして処理できますので、
具体的には、以下のようなネットワーク構成になるかと思います。AudioStreamFromMic ↓ MultiFFT ↓ GHDSS ← 独自ノード(動的にSOURCE情報を渡す) ↓ Synthsize ↓ SaveWavePCM
以上、よろしくお願いいたします。
HARKサポートチームSeptember 23, 2020 at 10:20 pm #1813ご回答ありがとうございます。
1点わからないのですが、、今回、時間と角度でフィルタリングしますが、周波数領域でフィルタリングする必要ないと思っていました。SourceByDirectionの代わりとなる独自ノードで動的に角度を渡すようにして、音声を落としたりくっつけた方が計算コスト低そうに思ったのですが、ご回答いただいたように、FFTしてGHDSS後に逆FFTしないと難しいと考えた方がよいということでしょうか? HARK的には一度、周波数領域に変換しないと私が実現したいことおができない or 処理効率が悪い という理解でよいでしょうか?
または、HARKのデータ構造上、時間軸上での処理では、時間と角度でフィルタリングできないという理解でことでしょうか?
September 24, 2020 at 7:19 pm #1824お問い合わせありがとうございます。
HARKでは、音源分離を周波数領域で行うよう実装していますので、
変換せずに分離することはできません。
また、MapSelectorBySource
ノードへの入力は分離処理後の音源を想定していますので、
ご提示の構成ではフィルタリングできないかと思います。HARKに関しては、少し先になりますが無料の講習会がございます。
音響処理の理論を解説しながら、HARKの機能・技術を紹介する場となっておりますので
HARKをご理解いただくための一助となれば幸いです。以上、よろしくお願いいたします。
HARKサポートチームSeptember 24, 2020 at 8:28 pm #1831ご回答ありがとうございます。
> HARKでは、音源分離を周波数領域で行うよう実装していますので、変換せずに分離することはできません。
> また、MapSelectorBySourceノードへの入力は分離処理後の音源を想定していますので、ご提示の構成ではフィルタリングできないかと思います。
承知しました。> HARKに関しては、少し先になりますが無料の講習会がございます。
> 音響処理の理論を解説しながら、HARKの機能・技術を紹介する場となっておりますのでHARKをご理解いただくための一助となれば幸いです。
ありがとうございます。都合があえば是非参加させていただきたいと思います。September 29, 2020 at 5:19 pm #1853勘違いで動いていたように見えただけでした。1ファイルしか出力されなかったです。
MatrixToMapにすると8チャネルになるけど、、定位情報で分離にはMap<int,…. で渡す必要があると理解しました(やっと教えていただことを理解できました)。お手数おかけしてすみません….。> HARKでは、音源分離を周波数領域で行うよう実装していますので、変換せずに分離することはできません。
と教えていただきましたが、ドキュメントみていると、SaveRawPCMノードは、INPUTにSOURCESがなくドキュメントにもGHDSSが必須と書いてあるが、SaveWavePCMノードは、INPUTにSOURCESがあるので、実際に以下のネットワークで分離できそうかやってみたら、分離できていそうな感じです。やはり実際は分離できていないのでしょうか?どこの理解が間違っていますでしょうか?よろしくお願いいたします。
AudioStreamFromMic(SaveWavePCMのinputに接続)
↓
SaveWavePCM ← ConstantLocalizationで0,180度を指定しsourcesに接続(本来はhark-pythonで動的に渡す予定)
↓
sep_0.wav, sep_1.wav出力
-
AuthorPosts
- You must be logged in to reply to this topic.