Kinectで音声を録音・再生するサンプル
前ページからの続きです。
音声を録音するプロシージャ
変数recordingLengthに、録音時間を表す変数noに16KHz/2Bitを乗算した値を格納しておきます。
バッファを1023確保します。
録音されたwaveファイル(recordedFileName)を作成モード(FileMode.Create)で初期化した、新しいFileStreamのインスタンスmyfileStreamオブジェクトを作成します。
AudioRecord.KinectAudioRecord名前空間から、音声を書き出すWriteWavHeaderメソッドを呼び出します。書式は下記。
WriteWavHeader(書き出すストリーム, 書き出されるデータの長さ)
mykinectSensor.AudioSource.Start()メソッドでオーディオのキャプチャリングを開始し、ストリームからデータ ファイルをコピーします。
Stream.Readメソッドで、現在のストリームからバイト シーケンスを読み取り、読み取ったバイト数の分だけストリームの位置を進めます。書式は下記。
Stream.Read(バイト配列,バッファ内のバイトオフセット(通常0),読み取る最大バイト数)
読み取ったバイト数が0より大きく、かつ、バイト数と共に加算されるtotalCount変数の値が、recordingLengthより小さい間、Stream.Writeメソッドで、現在のストリームにバイト シーケンスを書き込みます。
書き込んだバイト数の分だけストリームの現在位置を進めます。書式は下記。
Stream.Write(バイト配列,バッファ内のバイトオフセット(通常0),ストリームに書き込むバイト数)
音声記録の終了するFinishedRecordingプロシージャを呼び出します。
Private Sub RecordAudioGo(ByVal mykinectSensor As KinectSensor) If mykinectSensor Is Nothing Then Return End If Dim recordingLength As Integer = CInt(Fix(no)) * 2 * 16000 Dim buffer(1023) As Byte Using myfileStream As New FileStream(recordedFileName, FileMode.Create) WriteWavHeader(myfileStream, recordingLength) Using audioStream As Stream = mykinectSensor.AudioSource.Start() Dim count As Integer Dim totalCount As Integer = 0 count = audioStream.Read(buffer, 0, buffer.Length) Do While count > 0 AndAlso totalCount < recordingLength myfileStream.Write(buffer, 0, count) totalCount += count count = audioStream.Read(buffer, 0, buffer.Length) Loop End Using End Using FinishedRecording() End Sub
音声記録が終了した時に呼び出されるメソッド
非UI スレッドのデータをUI スレッド上で処理するため、Dispatcher クラスを使います。Dispatcherクラスの詳細については下記URLを参照してください。
→参照:Dispatcher クラス/クラス詳細(msdn)
[録音開始]ボタンの使用を不可とし、[再生]ボタンの使用を可能にします。変数noは0で初期化し、TextBlock1の中も消去します。
Private Sub FinishedRecording() Dispatcher.BeginInvoke(Sub() recordButton.IsEnabled = False playButton.IsEnabled = True no = 0 TextBlock1.Text = String.Empty End Sub) End Sub
[再生]ボタンがクリックされた時の処理
タイマーを停止します。
[再生]ボタンの使用を不可とします。
wavファイルがNothingまたは空ではなく、存在している場合は、MediaElementのSourceプロパティにwavファイルを指定します。
メディアの読み込み時の動作を設定する MediaStateのLoadBehaviorプロパティにPlayを指定し、メディアのアンロード時の動作 を設定するMediaStateのUnloadedBehaviorプロパティにはCloseと指定します。これで、MediaElementが読み込まれた時に再生され、アンロード時にMediaElementが閉じられます。
TextBlock1に「再生中・・・・」と表示します。
Private Sub playButton_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles playButton.Click myTimer.Stop() playButton.IsEnabled = False If (Not String.IsNullOrEmpty(recordedFileName)) AndAlso File.Exists(recordedFileName) Then MediaElement1.Source = New Uri(recordedFileName, UriKind.RelativeOrAbsolute) MediaElement1.LoadedBehavior = MediaState.Play MediaElement1.UnloadedBehavior = MediaState.Close TextBlock1.Text = "再生中・・・・" End If End Sub
再生が終了した時の処理
[再生]ボタンと[記録開始]ボタンの使用を不可とし、TextBlock1の中も消去します。タイマーを停止し、noの値を0で初期化します。
Private Sub MediaElement1_MediaEnded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MediaElement1.MediaEnded recordButton.IsEnabled = False playButton.IsEnabled = False TextBlock1.Text = String.Empty myTimer.Stop() myTimer = Nothing no = 0 End Sub
Kinectとオーディオを停止させる処理
Kinect センサーが動作している場合は停止させ、オーディオが動作している場合はこれも停止させます。
Kinect センサーのリソースを解放します。
Private Sub StopKinect(ByVal sensor As KinectSensor) If sensor Is Nothing = False Then If sensor.IsRunning Then sensor.Stop() If sensor.AudioSource Is Nothing = False Then sensor.AudioSource.Stop() sensor.Dispose() End If End If End If End Sub
ウィンドウが閉じられた時の処理
動作しているKinectセンサーを引数に、Kinect センサーとオーディオを停止させるStopKinectプロシージャを実行します。
Private Sub MainWindow_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Closing StopKinect(KinectSensorChooser1.Kinect) End Sub End Class
今回のサンプルは以上で終了です。
Kinectで音声を録音・再生するサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- キャラクターが音声で応援してくれる脳トレーニングアプリを作ってみよう
- 制限時間内に指定した画像を見つけ出す脳トレーニングアプリを作ろう
- センサーの範囲内にいる人間を見つけて撮影・保存するKinectサンプル
- Windows Phone マイクからオーディオ入力を取得する
- 時刻とともに、その日の出来事をキャラクターが音声で教えてくれるアプリを作る
- 指定した秒数で音声を録音して、その音声を再生するサンプルアプリ
- Kinectによる深度データの取得・表示と、モーターを動かすサンプル
- Windows Phoneで自宅の様子をリモート監視するKinectプログラムを作ってみる
- 音声を録音してライブラリに保存するプログラムを作る
- KinectButtonを動的に作成して、ジェスチャーで文字を表示させるサンプル