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

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

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

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

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Q&A

解決済

1回答

6226閲覧

C# wave 出力方法について

ahi

総合スコア7

C#

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

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

0グッド

0クリップ

投稿2017/04/24 10:55

###前提・実現したいこと
C# kinect等の音声機器で取得した音声データを,「○○.wav」のファイルに保存したいです.
###発生している問題・エラーメッセージ

`` ###該当のソースコード audioBuffer =new byte[kinect.AudioSource.SubFrameLengthInBytes]; if ( audioFrame == null ) { return; } var subFrame = audioFrame[0].SubFrames[0]; subFrame.CopyFrameDataToArray( audioBuffer ); waveFile.Write( audioBuffer ); float audioData1 = BitConverter.ToSingle( audioBuffer, 0 ); float audioData2 = BitConverter.ToSingle( audioBuffer, 4 ); float audioData3 = BitConverter.ToSingle( audioBuffer, 8 ); //この後の保存処理がわかりません. ###試したこと 課題に対してアプローチしたことを記載してください サイトなどを検索しても,一時ファイルに保存方法などの記載はありますが,ファイルとして保存する方法が見つからず困っております. ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

.NETにWav(RIFF)フォーマットで出力するためのライブラリーがないか探してみましたが自分には見つけられませんでした。どうも存在してない気がします。

stackoverflowにもWAVフォーマットを自前で書きこむような話題しか見当たりません。音声処理に関するオープンソースはいくつかありますがPCM前提のものが多くIEEE 32bit float前提のものが見つかりません。

WAVフォーマットはそれほど複雑ではないのでそれを参照して書き込み処理を作ってみるのが案外早いかも知れません。パラメータ決め打ちのサンプルページがありますが、大抵が16bit PCM前提かつフォーマットについての解説皆無なのでやはりWAVフォーマットそのものを解説したサイトを参考にするとよいと思います。個人的にはこのサイトが必要充分な情報が載っているように思えました。

kinectからの波形データはIEEE 32bitモノラルだと思います。よって、上記サイトの波形フォーマットのWAVE_FORMAT_IEEE_FLOATでチャネル数=1で出力することになると思いまs。

float->short(符号付16bit)に変換してやればWAVE_FORMAT_PCMで出力することも可能だと思います。(floatの波形データ範囲は-1.0~1.0であり、shortへ変換する際には-32768~32767の範囲へ変換するという点に注意してください。)


追記:PCM形式(16bit signed integer)のWAVファイルはよく見ますが、IEEE floatを試したことがなかったのでやってみました。結果Windows 10で再生できましたのでサンプルコードを載せておきます。この例では波形は計算で求めたもの(440Hz,正弦波)で、0.5秒分の波形データとしています。

C#

1using System; 2using System.IO; 3using System.Text; 4 5class MainClass { 6 public static void Main() { 7 SaveRiff("a.wav"); 8 Console.WriteLine("Save done"); 9 } 10 11 static ushort WAVE_FORMAT_PCM = (ushort)0x0001;//未使用 12 static ushort WAVE_FORMAT_IEEE_FLOAT = (ushort)0x0003; 13 static uint BYTES_PER_SAMPLE_IEEE_FLOAT = 4U; 14 15 static void SaveRiff(string path) { 16 uint sampleRate = 44100; // 44.1 KHz 17 ushort numChannels = 1; // モノラル 18 uint numSamples = 22050; // 0.5 sec 19 ushort waveFormat = WAVE_FORMAT_IEEE_FLOAT; 20 uint bytesPerSample = BYTES_PER_SAMPLE_IEEE_FLOAT; 21 22 using (var fs = new FileStream(path, FileMode.Create)) 23 using (var wr = new BinaryWriter(fs)) { 24 // RIFF header 25 wr.Write(MagicToBytes("RIFF")); //+00 26 wr.Write(36U + bytesPerSample * numChannels * numSamples); //+04 27 wr.Write(MagicToBytes("WAVE")); //+08 28 // fmt chunk 29 wr.Write(MagicToBytes("fmt ")); //+0C 30 wr.Write(16U); //+10: chunk length 31 wr.Write((ushort)waveFormat); //+14 32 wr.Write((ushort)numChannels); //+16 33 wr.Write(sampleRate); //+18 34 wr.Write(bytesPerSample * numChannels * sampleRate); //+1C 35 wr.Write((ushort)(bytesPerSample * numChannels)); //+20 36 wr.Write((ushort)(8U * bytesPerSample)); //+22 37 // data chunk 38 wr.Write(MagicToBytes("data")); //+24 39 wr.Write(bytesPerSample * numSamples); //+28 40 //+2C 41 // 以降は波形データ。(この例では440Hzの正弦波) 42 float amplitude = (float)0.25; 43 float freq = 440; 44 45 for (uint i = 0; i < numSamples; i++) { 46 double th = i * Math.PI * freq / sampleRate; 47 double w = amplitude * Math.Sin(th); 48 wr.Write((float)w); 49 } 50 } 51 } 52 53 static byte[] MagicToBytes(string magic) { 54 return Encoding.ASCII.GetBytes(magic); 55 } 56}

投稿2017/04/25 04:13

編集2017/04/25 12:25
KSwordOfHaste

総合スコア18392

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

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

ahi

2017/04/27 05:37

迅速かつご丁寧な回答,誠にありがとうございます. 無事,kinect等のデバイスから取得した音声をwavファイル形式で保存することができました. ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問