質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3334閲覧

C#で音声データストリームをキャプチャしたい

kei101

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/08/04 03:14

前提・実現したいこと

ここに質問の内容を詳しく書いてください。

windows10 C#2012やC#2019の.フレームとUSBマイクを使って、音声入力をADCの様に、リアルタイムに使いたい。
つまり、メインformの処理に関係なく、マイクデータのbufferをキャプチャしたい。
bufferのキャプチャをメインformのコントロールでON/OFFしたい。
マイク入力のサンプリングは、例えば8kHz、bufferは、1600バイト、チャンネルは1chで、
リーズナブルな設定範囲をもつ。取りこぼしたbufferデータは捨てる。
キャプチャ中は、メインformのコントロールを邪魔しない。

例えば、マイク入力でリアルタイム100ms以下でFFTを実行し、その結果をグラフィックに表示する。これを間欠なく実行するような処理です。

試したこと

NAudioのサンプルコードで試したが、音楽ファイルを作る訳ではないので、バイトストリームbufferが覗けるコードを見つからなかった。USBマイクはADCの代用のつもりです。
メインのコントールを実行できない。
Windows10の更新やC#の更新、更にNAudioのパッケージ更新で、今まで動作していたコードが動かない。大問題。私の使い方が悪いのかも知れませんが...
Nauidoである必要はないです。

どなたか、ご指導お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/08/04 03:51

「NAudio FFT」で検索したらいろいろ参考になりそうなHPが出てきますが・・・
gentaro

2021/08/04 06:50

表面的な起こった事象だけ書かれても、コードやエラーについての詳細な内容の提示がなければ何が問題なのかは第三者に全くわからず「ちゃんとサンプルやドキュメント読んで作れば?」で終わる話。 質問したい事が何なのか、具体的にしないと回答できるわけがない。
tor4kichi

2021/08/04 11:29

前提とする実行クライアント環境を示してもらえたら、NAudioに限らず選択できそうなライブラリ等を回答してもらえるんじゃないかなと。
kei101

2021/08/20 03:45

時間がかかり失礼しました。 とりあえず簡単なテストを試しました。コードをアップしましたので、ご指摘お願いします。
guest

回答1

0

自己解決

namespace MicB19201tmp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) { Init1(); } void Init1() { EntryBtn.Enabled = false; TestBtn.Text = "テスト待ち"; testSts = false; } static bool testSts = false; private void TestBtn_Click(object sender, EventArgs e) { if (TestBtn.Text == "テスト待ち") { TestBtn.Text = "テスト中"; testSts = true; } else { TestBtn.Text = "テスト待ち"; testSts = false; } } WaveIn waveIn; private void MicBtn_Click(object sender, EventArgs e) { for (int i = 0; i < WaveIn.DeviceCount; i++) { var deviceInfo = WaveIn.GetCapabilities(i); textBox1.AppendText(String.Format("Device {0}: {1}, {2} channels", i, deviceInfo.ProductName, deviceInfo.Channels)); textBox1.AppendText("が接続\r\n"); } icount = 0; stsStop = false; if (WaveIn.DeviceCount == 0) { textBox1.Text = "マイクを接続して下さい!"; return; } icount = 0; waveIn = new WaveIn(); int n = waveIn.NumberOfBuffers; waveIn.DataAvailable += waveIn_DataAvailable; BufferedWaveProvider bufferedWaveProvider; waveIn.WaveFormat = new WaveFormat(16000, 1); // fs=16kHz, 1ch bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat); bufferedWaveProvider.BufferLength = 3200; waveIn.StartRecording(); textBox1.AppendText("\r\nfs=16kHz, 1chでキャプチャ開始!\r\n"); } byte[] b = new byte[3200]; int icount = 0; Stopwatch sw = new Stopwatch(); static int len = 1600; static int[] indt = new int[len]; static int len32 = len * 2; static double[] hpfOut = new double[len]; static double[] hpfOut10 = new double[len * 10]; static int[] MvOut = new int[len]; static int[] MvOut10 = new int[len * 10]; static double[] in64 = new double[64]; static double[] Out64 = new double[64]; static int offs = 0; // offset is added by 64. static int cn64 = 0; static int[] dat64 = new int[64]; static int[] AnsMV64 = new int[64]; static int pavrSum = 0; private void waveIn_DataAvailable(object sender, WaveInEventArgs e) { double mi = sw.ElapsedMilliseconds; sw.Reset(); sw.Start(); for (int index = 0; index < e.BytesRecorded; index += 2) { short sample = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]); } b = new byte[len32]; // len32 = 3200; if (stsStop) { waveIn.StopRecording(); } else { Array.Copy(e.Buffer, b, len32); ByteToInt(b, out indt); do { Array.Copy(indt, offs, in64, 0, 64); filter.dcCutHPF(in64, Out64); Array.Copy(Out64, 0, hpfOut, offs + cn64, 64); for (int i = 0; i < 64; i++) { } move64(AnsMV64, dat64); Array.Copy(AnsMV64, 0, MvOut, offs, 64); offs += 64; } while (offs < len); offs = 0; } IsaoProc(); if (testSts) { if (icount > 9) { waveIn.StopRecording(); MicOffBtn_Click(null, null); } else if (stsStop == true) { MicOffBtn_Click(null, null); waveIn.StopRecording(); } else { Array.Copy(hpfOut, 0, hpfOut10, icount * 1600, 1600); Array.Copy(MvOut, 0, MvOut10, icount * 1600, 1600); icount++; sw.Stop(); mi = sw.ElapsedMilliseconds; textBox1.AppendText(mi.ToString() + "msec\t" + icount.ToString() + "\r\n"); } } else { sw.Stop(); mi = sw.ElapsedMilliseconds; textBox1.AppendText(mi.ToString() + "msec\t" + icount.ToString() + "\r\n"); } } static public int[] avr64 = new int[64]; static public int avrSum = 0; void move64(int[] ans64, int[] dat64) { avrSum = pavrSum; for (int i = 0; i < 64; i++) { } pavrSum = avrSum; } void ByteToInt(byte[] byt, out int[] indt) { int ln32 = byt.Length; indt = new int[ln32 / 2]; for (int i = 0; i < ln32; i += 2) { } } void IsaoProc() { } private void WriteBtn_Click(object sender, EventArgs e) { if (!EntryDone) { WriteABtn.Enabled = false; textBox1.AppendText("\r\nIIR HPFと64段移動平均の実行が終了しました!\r\n"); File fi = new File(); fi.FileWriteDbl("HPFOUT", hpfOut10); fi.FileWriteInt("MVOUT", MvOut10); WriteABtn.Enabled = true; } } private void CloseBtn_Click(object sender, EventArgs e) { Application.Exit(); } static string[] entryBuff = new string[1024]; public static bool editAgain = false; static bool EntryDone = false; private void EditBtn_Click(object sender, EventArgs e) { EditString frm2 = new EditString(); string sk = entryBuff[0]; int c = 0; while (sk != null) { frm2.textBox1.AppendText(sk); c++; sk = entryBuff[c]; } frm2.ShowDialog(); string st = frm2.textBox1.Text; string outS; DataInOut(ref st, out outS); } string str1 = "0"; public void DataInOut(ref string inS, out string outS) { if (inS == null) { } else { } outS = str1; } private void EntryBtn_Click(object sender, EventArgs e) { string s = textBox2.Text; textBox3.AppendText(s + "\r\n"); EditBtn.Enabled = true; EntryDone = true; } private void ReadText() { //ファイルを開くダイアログのオプションを設定する openFileDialog1.AutoUpgradeEnabled = false; //自動アップグレードを禁止 // 終了処理 //sr1.Close(); //fs1.Close(); } private void WriteABtn_Click(object sender, EventArgs e) { string sd = textBox3.Text; FileWriteA(sd); EntryDone = false; } void FileWriteA(string saveData) { } private void ReadFileBtn_Click(object sender, EventArgs e) { ReadText(); } static bool stsStop = false; private void MicOffBtn_Click(object sender, EventArgs e) { textBox1.AppendText("キャプチャ停止!\r\n"); stsStop = true; }

}

class filter
{
static public double d0 = 0.0;
static public double prevLasth0 = 0.0;
static public double prevLasth1 = 0.0;
static public void dcCutHPF(double[] indat, double[] calOut)
{
int len64 = indat.Length;
for (int i = 0; i < len64; i++)
{

} //prevLasth1 = h1; // prevLasth0 = h0; }

}// class Filter end

class File
{
public void FileWriteDbl(string s, double[] dat)
{
string saveFileName = s + ".dat";
// FileStream fs;
}

public void FileWriteInt(string s, int[] dat) { }

}
}

投稿2021/08/20 00:50

kei101

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問