C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: マイクから入力した音声を「無音」で区切る方法


(過去ログ 115 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■67742 / inTopicNo.1)  マイクから入力した音声を「無音」で区切る方法
  
□投稿者/ sim (1回)-(2013/08/29(Thu) 18:40:13)

分類:[C/C++] 

Windows上で、マイクから入力した音声を保存するプログラムを作っています。
このとき、一定期間、音声が「無音」だったら、それまで入力された音声を、
一まとまりの文章として扱いたいと考えています。


Javaで上記処理を行いたいと考えていたのですが、
取得したbyteデータを解析しないと無音かどうか判定できないようです。
(「TargetDataLine」クラスを調べました。調査不足だったら申し訳ありません。)
残念ながら、音声データについての知識がないため、実装が難しいです。


以前、ActionScriptを使ったときには、マイクの「無音」レベルをセットすることにより、
一まとまりの文章を取得することができたため、他の言語でもできるのではと考えています。


C言語系(C, C++またはC#)で、このようなことを可能とする関数が用意されたAPIはないでしょうか。
DirectSoundなどを調べているのですが、なかなか方法が見つかりません。
もちろん、Javaでも可能でしたら、ご指摘いただけるとありがたいです。


ご教授よろしくお願いいたします。

引用返信 編集キー/
■67763 / inTopicNo.2)  Re[1]: マイクから入力した音声を「無音」で区切る方法
□投稿者/ オショウ (85回)-(2013/08/31(Sat) 10:26:07)
> 以前、ActionScriptを使ったときには、マイクの「無音」レベルをセットすることにより、
> 一まとまりの文章を取得することができたため、他の言語でもできるのではと考えています。

  そういう機能を搭載したものだったのでしょう。
  一般的には、そうそう無いですネ!

> C言語系(C, C++またはC#)で、このようなことを可能とする関数が用意されたAPIはないでしょうか。
> DirectSoundなどを調べているのですが、なかなか方法が見つかりません。
> もちろん、Javaでも可能でしたら、ご指摘いただけるとありがたいです。

  無いです。
  リアルタイムに取得されたマイク入力データのバイト配列から
  無音と思われる部位をサーチして。検出するしかありません。

※ 無音の定義がどうなんか・・・
  ホワイトノイズと言うか、バックグランドでの騒音(ノイズ)の音量が大きい場合
  無音と検出するのは、結構難しくなります。
  簡単に・・・と言うと取得されたバイト配列のデータを単純に足し算して、結果が
  ある閾値を下回ったら無音とすることでしょう。
  移動平均的方法になると思います。要は、どの程度の時間、閾値を下回るかと言う
  検出をしなければなりませんので。

  ノイズが多い(音量が大きい)となると、通常はFFTを使うのですが・・・
  これも簡単にと言うと、標準偏差でよいかもしれません。
  音声があると、変化が激しいので、無音部分(ホワイトノイズであれば)は逆に
  変化が無い(少ない)と言うことになりますので、検出は可能です。

以上。参考まで
引用返信 編集キー/
■67765 / inTopicNo.3)  Re[2]: マイクから入力した音声を「無音」で区切る方法
□投稿者/ オショウ (86回)-(2013/08/31(Sat) 10:33:15)
追伸

取得したバイトデータなりを、そのままグラフにすれば、理解が進むかと。
X軸をデータ個数(時間になりますネ!)
Y軸が音声データになります。

以上。
引用返信 編集キー/
■67792 / inTopicNo.4)  Re[3]: マイクから入力した音声を「無音」で区切る方法
□投稿者/ sim (2回)-(2013/09/02(Mon) 18:12:48)
No67765 (オショウ さん) に返信
> 追伸
>
> 取得したバイトデータなりを、そのままグラフにすれば、理解が進むかと。
> X軸をデータ個数(時間になりますネ!)
> Y軸が音声データになります。
>
> 以上。

オショウさん


> リアルタイムに取得されたマイク入力データのバイト配列から
> 無音と思われる部位をサーチして。検出するしかありません。

そうですか…簡単にはできないのですね;甘かったです。
バイトデータを検証するのでしたら、Javaで実装したほうが早いかもしれませんね。
FFTは、正直難しそうです。

しかし、方法を具体的に挙げていただき、まったく縁のない技術ではないとわかりました。
残念ながら、時間が限られているため、今回は秒指定で入力音を区切る方法ですませます。。。

お力を貸していただき、どうもありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -