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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

9988閲覧

C# 音声認識 波形を出したい

syosinsyapurogu

総合スコア64

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2016/07/28 09:07

編集2016/07/30 06:34

いつもお世話になっております。
Visual Studio2015 Windows Desktopを使いマイクで喋ったことを波形にして表示する物作成しているのですが

今はこのような感じです。
イメージ説明

Form上にPlotViewを置いてデバックしてマイクに向かって喋ってもなにも表示されない状態です。

http://wildpie.hatenablog.com/entry/2014/09/24/000900
上記サイトを参考にさせて頂き制作していたのですがここでいきずまってしまい質問させていただきました。

ソースコードはこのような感じです。

using NAudio.Wave; using OxyPlot; using OxyPlot.Axes; using OxyPlot.Series; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace sound_wave_test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < WaveIn.DeviceCount; i++) { var deviceInfo = WaveIn.GetCapabilities(i); this.label1.Text = String.Format("Device {0}: {1}, {2} channels", i, deviceInfo.ProductName, deviceInfo.Channels); } var waveIn = new WaveIn() { DeviceNumber = 0, // Default }; EventHandler<WaveInEventArgs> WaveIn_DataAvailable = null; waveIn.DataAvailable += WaveIn_DataAvailable; waveIn.WaveFormat = new WaveFormat(sampleRate: 8000, channels: 1); waveIn.StartRecording(); } private PlotModel _plotmodel = new PlotModel(); private LinearAxis _linearaxis1 = new LinearAxis { Position = AxisPosition.Bottom }; private LinearAxis _linearaxis2 = new LinearAxis { Minimum = -1.0, Maximum = 1.0, Position = AxisPosition.Left }; private LineSeries _lineSeries = new LineSeries(); List<float> _recorded = new List<float>(); // 音声データ private void InitPlot() { _plotmodel.Axes.Add(_linearaxis1); _plotmodel.Axes.Add(_linearaxis2); _plotmodel.Series.Add(_lineSeries); this.plotView1.Model = _plotmodel; } private void ProcessSample(float sample) { _recorded.Add(sample); if (_recorded.Count == 1024) { var points = _recorded.Select((v, index) => new DataPoint((double)index, v) ).ToList(); _lineSeries.Points.Clear(); _lineSeries.Points.AddRange(points); this.plotView1.InvalidatePlot(true); _recorded.Clear(); } } } }

エラーはでないのですが喋ってもなにも表示されない状態です。
何か足りないところがございますでしょうか?

ご教授お願い致します。

※追加
EventHandler<WaveInEventArgs> WaveIn_DataAvailable = null;
を消し、ProcessSampleにブレイクポイントを置いたら下記画像の内容が
表示されました。
イメージ説明

※追加2
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

参照元のサイトも見てみましたが、コードが微妙に違いますね。

ご質問で提示されたコードでは、Form1_Load内に

EventHandler<WaveInEventArgs> WaveIn_DataAvailable = null;
waveIn.DataAvailable += WaveIn_DataAvailable;

というコードが書いてありますが、波形データを取得したときに応答するイベントに実在のメソッドではなく、なぜかnullを設定してしまっています。波形データを取得しても何もしないという処理をしていることになります。

参照元のコードをよく見て、とりあえず正確にコピペしてください。WaveIn_DataAvailableというメソッドを実装し、それを、waveIn.DataAvailableに設定しないと、ProcessSampleメソッドが呼ばれないので、いつまでたっても_recordedにデータが格納されません。

投稿2016/07/29 09:28

catsforepaw

総合スコア5944

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

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

syosinsyapurogu

2016/07/30 05:30

catsforepawさん ご回答ありがとうございます。 はいサイトのコードを少々いじってしまいました。 ご指摘頂いた通りに正確にコピペしてエラーはでていないのですが、 まだPlotViewに波形データがでない状態でございます。 私の使用しているPlotViewが悪いのでしょうか? ご教授くださいませ。
catsforepaw

2016/07/30 05:51

エラーが出なければ間違いはないということはありません。何かを間違えているから正しく動かないのです。 > EventHandler<WaveInEventArgs> WaveIn_DataAvailable = null; この行を削除しましたか? これがあると正しく波形データが取れません。 また、`ProcessSample`メソッドの中にブレークポイントを置いて、ちゃんと実行されているかどうかを確認してください。最終的に`this.plotView1.InvalidatePlot(true);`が実行されれば何か表示されるはずです。
syosinsyapurogu

2016/07/30 06:12

catsforepawさん > EventHandler<WaveInEventArgs> WaveIn_DataAvailable = null; を消し `ProcessSample`にブレイクポイントを置いて実行をしたら上記追加画像の内容が 表示されたのですがこれは何か実行されているのでしょうか?? よろしくお願いいたします。
catsforepaw

2016/07/30 06:21

ProcessSampleメソッドの中(77行目)で止まったということです。ブレークポイントとはその名の通り、指定した位置で止めるためのものです。注目しているコードがちゃんと実行されているのかを確認するときによく使います。 どうやら、ProcessSampleメソッドがちゃんと実行されているようです。ブレークポイントを外して実行してみてください。何か表示されると思うのですが。
syosinsyapurogu

2016/07/30 06:38

catsforepawさん 何度も何度もお手数掛けさせ大変申し訳ありません。 ブレークポイントを外し実行したのですがやはり表示されません、、、 一つ疑問に思ったことがあるのですが、私の使用環境はWindows10なのですが 上記追加画像のように実行したときに生成されるファイルNAudio.1.7.3の中を見てみるとWindows8とでているのですがこれはなにか関係があるのでしょうか? 宜しくお願いいたします。
syosinsyapurogu

2016/07/30 06:46

あと私の使っているPlotはGitHubのoxyplot-masterを使用していて ツールボックスにアイテムを追加する手順が参照→\oxyplot-master\oxyplot-master\Output\NET45\Examples\WindowsForms\WindowsFormsDemoの手順でOxyPlot.WindowsForms.dllを追加しているのですが、このやり方にも問題があるのでしょうか? お願い致します。
catsforepaw

2016/07/30 07:08

Windows8というフォルダーについては、NAudioがどういう決まりでその名前にしているのか判らないのでなんとも言えませんが、あまり気にしなくて良いと思います。 コンポーネントの追加手順については、その方法を試したことがないのでなんとも言えません。私は基本的にはNuGetで取得できるパッケージはNuGetを使うようにしています。参照設定やDLLのコピーの設定などを自動でやってくれて便利だからです。
catsforepaw

2016/07/30 07:41

今一度ソースを見て気づいたのですが、`InitPlot`メソッドがどこからも呼ばれていません。PlotViewに何も設定していないので表示されないのではないでしょうか。 Loadイベントの中で`InitPlot`を呼んでみてください。
syosinsyapurogu

2016/07/30 08:15

catsforepawさん ご指摘頂いた通り`InitPlot`を呼び出したら表示されました!! 出てきた瞬間、脳汁がでまくりました!(笑) 長きに渡り付き合わせてしまい申し訳ございませんでした。 それでも事細かにご説明して頂き誠にありがとうございました。 また何か問題が起きた時などは色々ご教授ください。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問