Accord.NETを使用して音声入力をする方法を記載します。
USB接続カメラなどについている 音声入力デバイスの音声を、入力信号として取得します。
- Accord.Video
- Accord.DirectSound
- Accord.Audio.Formats
をインポートします。
音声入力データを取得する
以下のコードは、音声入力を取得して、MemoryStreamにデータを蓄えます。その音声データを SoundPlayerで再生します。
・フォーム上には、[録音開始][録音停止][再生]のボタンを配置します。
Private player As System.Media.SoundPlayer = Nothing
Dim _Stream As MemoryStream
Dim _Encoder As WaveEncoder
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'音声入力デバイスを取得して、ComboBoxに設定
Dim audioDevices = New AudioDeviceCollection(AudioDeviceCategory.Capture)
ComboBox1.Items.Clear()
If AudioDevices.Count <> 0 Then
For Each device As AudioDeviceInfo In audioDevices
ComboBox1.Items.Add(device)
Next
ComboBox1.SelectedIndex = 0
End If
End Sub
Dim _AudioSource As IAudioSource
'音声入力開始
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
If ComboBox1.Items.Count = 0 Then
Return
End If
Dim info As AudioDeviceInfo = ComboBox1.SelectedItem()
_Stream = New MemoryStream() '音声データ出力用ストリーム作成
_Encoder = New WaveEncoder(_Stream)
'音声入力デバイスを作成して、22050Hzに設定
_AudioSource = New AudioCaptureDevice(info)
_AudioSource.DesiredFrameSize = 2048
_AudioSource.SampleRate = 22050
AddHandler _AudioSource.NewFrame, AddressOf Me.Audio_NewFrame
AddHandler _AudioSource.AudioSourceError, AddressOf Me.Audio_SourceError
_AudioSource.Start() '音声入力開始
End Sub
'音声入力停止
Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
If _AudioSource Is Nothing Then
Return
End If
If _AudioSource.IsRunning Then
_AudioSource.SignalToStop() 'Audioデバイスの停止
_AudioSource.WaitForStop() '完全に停止するまで待つ
_AudioSource = Nothing
End If
End Sub
'入力デバイスのデータを取得する
Private Sub Audio_NewFrame(sender As Object, eventArgs As Accord.Audio.NewFrameEventArgs)
_Encoder.Encode(eventArgs.Signal) 'エンコーダーに音声信号を追加する
End Sub
'このコールバックは、オーディオに何らかのエラーがあるときに呼び出されます。
Private Sub Audio_SourceError(sender As Object, e As AudioSourceErrorEventArgs)
Throw New Exception(e.Description)
End Sub
Private player As System.Media.SoundPlayer = Nothing
'入力された音声を再生する
Private Sub PlayerButton_Click(sender As Object, e As EventArgs) Handles Button1.Click
_Stream.Seek(0, SeekOrigin.Begin) 'ストリームのオフセットを開始位置に設定する
'読み込む
Using player = New System.Media.SoundPlayer(_Stream)
player.Play() '非同期再生する
End Using
End Sub
