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