質問するログイン新規登録

質問編集履歴

1

修正中

2019/08/19 02:24

投稿

sigoto
sigoto

スコア11

title CHANGED
File without changes
body CHANGED
@@ -1,198 +1,3 @@
1
1
  ### 前提・実現したいこと
2
- - C#
3
- - NAudio
4
- - CAPIO API
5
-
6
- マイク入力した音声をNAudioで取得し、
7
- ストリーミングでテキスト変換したい
8
-
9
- ### 発生している問題・エラーメッセージ
10
- API側から変換結果が ””空で返ってきます。
11
- ステップ実行すると、下記のソースの”SourceStreamDataAvailable”で
12
- ループしてしまうのですが、
13
- 原因がよくわかりません。
14
-
15
- C# は普段使わない言語のため、四苦八苦しております。
16
-
17
- ### 教えていただきたいこと
18
- - ”SourceStreamDataAvailable”でループしなくなる方法
19
- - ストリーミングWAVファイルを一定時間(5秒など)で区切ってリクエストする方法
20
-
21
- どなたかご教示いただけませんでしょうか。
22
-
23
2
  ### 該当のソースコード
24
-
25
- ```C#
26
- public partial class Main : Form
27
- {
28
- private void btnStartRealTimeConvert_Click(object sender, EventArgs e)
29
- {
30
- StartRecording();
31
- }
32
-
33
- public void StartRecording()
34
- {
35
- this.isStoped = false;
36
-
37
- myAPIClient = new myAPIClient(this, this.txtSourceVoiceFiles.Text, iReadBytes, 0);
38
-
39
- this.inputWaveIn = new WaveIn
40
- {
41
- DeviceNumber = iSelectedDeviceNumber,
42
- WaveFormat = new WaveFormat(16000, 16, WaveIn.GetCapabilities(iSelectedDeviceNumber).Channels)
43
- };
44
-
45
-
46
- this.inputWaveIn.DataAvailable += this.SourceStreamDataAvailable;
47
- this.inputWaveIn.StartRecording();
48
- }
49
-
50
- public void SourceStreamDataAvailable(object sender, WaveInEventArgs e)
51
- {
52
- if (this.isStoped) return;
53
-
54
- if (e.BytesRecorded > 0)
55
- {
56
- this.threadRealTime = new Thread(() => myAPIClient.ExecuteWebSocketRequestForRealTime(e.Buffer, e.BytesRecorded));
57
- this.threadRealTime.Start();
58
- }
59
- }
60
- }
61
-
62
- public sealed class MyAPIClient : IDisposable
63
- {
64
- public MyAPIClient(Main mainForm, string audioPath, int readBytes, int inputDeviceIndex)
65
- {
66
- this.apiKey = ConfigurationManager.AppSettings["apiKey"];
67
-
68
- this.objMainForm = mainForm;
69
- this.AudioPath = audioPath;
70
- this.AudioFileName = Path.GetFileName(audioPath);
71
- this.iReadBytes = readBytes;
72
- this.isAbort = false;
73
- }
74
-
75
-
76
- public void ExecuteWebSocketRequestForRealTime(byte[] buffer, int burrerLength)
77
- {
78
- if (this.isAbort)
79
- {
80
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), "Abort!!");
81
- objMainForm.RefreshStatusText(msg);
82
-
83
- return;
84
- }
85
- var ctx = new JObject
86
- {
87
- {"apiKey", apiKey},
88
- {"partial", true},
89
- {"autostop", false},
90
- {"nbest", 1},
91
- {"heatbeat",true},
92
- {"raw",true},
93
- }.ToString();
94
-
95
- var context = new JObject
96
- {
97
- {"context", ctx }
98
- };
99
-
100
- var disconnect = new JObject
101
- {
102
- {"disconnect", true }
103
- };
104
-
105
- var options = new IO.Options { Transports = ImmutableList.Create("websocket") };
106
-
107
- ManualResetEvent resetEvent = new ManualResetEvent(false);
108
-
109
- mySocket = IO.Socket("XXXXXXXXXXXXXXXXX", options);
110
-
111
- mySocket.On(Socket.EVENT_CONNECT, () =>
112
- {
113
- mySocket.Send(context);
114
-
115
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), context.ToString());
116
- objMainForm.RefreshSendDataText(msg);
117
-
118
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), "send : context data for connect");
119
- objMainForm.RefreshStatusText(msg);
120
-
121
- try
3
+ 修正中
122
- {
123
- var audio = new JObject
124
- {
125
- {"audio", buffer.Take(burrerLength).ToArray()}
126
- };
127
-
128
- mySocket.Send(audio);
129
-
130
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), audio.ToString());
131
- objMainForm.RefreshSendDataText(msg);
132
-
133
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), "send : audio data");
134
- objMainForm.RefreshStatusText(msg);
135
- }
136
- finally
137
- {
138
- //mySocket.Send(disconnect);
139
-
140
- //msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), disconnect.ToString());
141
- //objMainForm.RefreshSendDataText(msg);
142
-
143
- //msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), "send : data for disconnect");
144
- //objMainForm.RefreshStatusText(msg);
145
- }
146
- });
147
-
148
- mySocket.On(Socket.EVENT_MESSAGE, data =>
149
- {
150
- Console.WriteLine(data);
151
-
152
- string strGetRawDate = data.ToString();
153
-
154
- objMainForm.RefreshConvertedText_L(GetTranscriptFromJson(strGetRawDate, 0));
155
- objMainForm.RefreshConvertedText_R(GetTranscriptFromJson(strGetRawDate, 1));
156
-
157
- objMainForm.RefreshReceiveDataText(strGetRawDate);
158
- });
159
-
160
- mySocket.On(Socket.EVENT_CONNECT_ERROR, (err) =>
161
- {
162
- Console.WriteLine(err);
163
-
164
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), err.ToString());
165
- objMainForm.RefreshStatusText(msg);
166
- });
167
-
168
- mySocket.On(Socket.EVENT_CONNECT_TIMEOUT, (err) =>
169
- {
170
- Console.WriteLine(err);
171
-
172
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), err.ToString());
173
- objMainForm.RefreshStatusText(msg);
174
- });
175
-
176
- mySocket.On(Socket.EVENT_DISCONNECT, (err) =>
177
- {
178
- Console.WriteLine(err);
179
-
180
- msg = string.Format("[{0}] : [{1}]", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"), err.ToString());
181
- objMainForm.RefreshStatusText(msg);
182
- });
183
-
184
- resetEvent.WaitOne();
185
-
186
- mySocket.Close();
187
- }
188
- }
189
- ```
190
-
191
- ### 試したこと
192
- - Sleep処理
193
-   APIサーバと切断されてしまい、空の結果すら返ってこなくなる(500エラー)
194
-
195
- - NAudioのWaveFileWriter
196
- 下記のサイトを参考にWaveFileWriterをつかってみるも、うまくいかない。
197
- https://codeday.me/jp/qa/20190621/1063224.html
198
-   1秒のWavファイルは生成された。。。