質問編集履歴

7

"(古いコード)"という文字列を質問文のコード説明文に追加

2019/04/09 02:59

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  ```
46
46
 
47
- 下はコード全体です。
47
+ 下はコード全体です。(古いコード)
48
48
 
49
49
  ```Python
50
50
 

6

"修正したコード"と追記

2019/04/09 02:59

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -256,7 +256,7 @@
256
256
 
257
257
  ```
258
258
 
259
- 新しいコード
259
+ 修正したコード(新しいコード)
260
260
 
261
261
  ```Python
262
262
 

5

画像のアップロードと質問文に新規コードを埋め込み

2019/04/06 08:45

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -256,6 +256,248 @@
256
256
 
257
257
  ```
258
258
 
259
+ 新しいコード
260
+
261
+ ```Python
262
+
263
+ #coding: utf-8
264
+
265
+ import pyaudio as pyaudio
266
+
267
+ import wave
268
+
269
+ import time
270
+
271
+ import numpy as np
272
+
273
+ import matplotlib.pyplot as plt
274
+
275
+ import struct
276
+
277
+
278
+
279
+ fs = 16000 # サンプリング周波数 [Hz]
280
+
281
+ channel = 1 # チャンネル数
282
+
283
+
284
+
285
+ ####### wavファイル保存関数
286
+
287
+ def wavOut(filename):
288
+
289
+ # 書き出し用オブジェクトの生成(ファイル名の決定)
290
+
291
+ out = wave.Wave_write(filename)
292
+
293
+
294
+
295
+ out.setnchannels(channel) # チャンネル数を設定
296
+
297
+ out.setsampwidth(2) # 量子化ビット数16bits(2byte)を設定
298
+
299
+ out.setframerate(fs) # サンプリング周波数を設定
300
+
301
+
302
+
303
+ global packed
304
+
305
+ packed = b''.join(data)
306
+
307
+ print u"type(packed): " + str(type(packed)) # str
308
+
309
+ print packed
310
+
311
+ print type()
312
+
313
+ # intData = struct.unpack("h", packed)
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+ for i in intData:
322
+
323
+ if i > 10000:
324
+
325
+ print i
326
+
327
+ if i < 10000:
328
+
329
+ print u"10000未満:" + i
330
+
331
+
332
+
333
+ # dataを結合してwrite
334
+
335
+ out.writeframes(packed) # dataはbytes型
336
+
337
+ out.close()
338
+
339
+
340
+
341
+ ####### プロット関数
342
+
343
+ def plotOut(plot_data):
344
+
345
+
346
+
347
+ plt.clf()
348
+
349
+ plt.ylim(-1*2**15, 2**15) # 上下15bit分を表示
350
+
351
+ plt.plot(plot_data)
352
+
353
+ plt.pause(0.01) # plotして0.01秒pause
354
+
355
+
356
+
357
+ ####### 録音用コーバック関数(別スレッドで動作)
358
+
359
+ def adCallback(in_data, frame_count, time_info, status):
360
+
361
+
362
+
363
+ # print u"type(in_data): " + str(type(in_data)) # str
364
+
365
+ data.append(in_data) # 文字列のリスト型オブジェクト
366
+
367
+ print data # \xb6\xff\xba\xff\xb6\xff\xb7の形の出力が得られる
368
+
369
+
370
+
371
+ # 代入する前にグローバル変数であることを宣言
372
+
373
+ global buf
374
+
375
+
376
+
377
+ # 取得した録音バッファ(in_data)をint16に変換
378
+
379
+ # bufはリスト型なので、リストのインデックス0番にndarrayが入るということ?
380
+
381
+ # 4文字の一つの数字に変換していく
382
+
383
+ buf = np.frombuffer(in_data, dtype="int16") # bufはndarrayで、extendsは使えない。
384
+
385
+ # print u"type(buf): " + str(type(buf)) # 再代入してるからndarrayに変化
386
+
387
+
388
+
389
+ return (None, pyaudio.paContinue)
390
+
391
+
392
+
393
+ ####### ここからメイン
394
+
395
+ if __name__ == '__main__':
396
+
397
+ # バッファのサイズ
398
+
399
+ size = 2**10
400
+
401
+ audio = pyaudio.PyAudio()
402
+
403
+ # オーディオストリームstreamをopen
404
+
405
+ stream = audio.open(format=pyaudio.paInt16, # 量子化ビット数16bit
406
+
407
+ channels=int(channel), # チャンネル数
408
+
409
+ rate=int(fs), # サンプリング周波数
410
+
411
+ input=True, # 録音のときは input=True
412
+
413
+ frames_per_buffer=size, # バッファのサイズを設定
414
+
415
+ stream_callback = adCallback) # コールバック関数の設定
416
+
417
+
418
+
419
+ # 初期化
420
+
421
+ data = []
422
+
423
+ packed = 1
424
+
425
+ buf = False
426
+
427
+ print u"初期化時はtype(buf): " + str(type(buf)) # list
428
+
429
+ start_time = ''
430
+
431
+ flag = True
432
+
433
+ s = 2
434
+
435
+
436
+
437
+ # 録音の開始
438
+
439
+ stream.start_stream() # 別スレッドで録音を開始
440
+
441
+ print "Recording."
442
+
443
+
444
+
445
+ # メインスレッド処理
446
+
447
+ while flag == True:
448
+
449
+ plotOut(buf) # プロット
450
+
451
+
452
+
453
+ # buf中振幅の絶対値が 10000 を超えたら
454
+
455
+ if np.max(np.absolute(buf)) > 10000:
456
+
457
+ start_time = time.time() # その時刻を取得
458
+
459
+ flag = False # このwhileループを抜け出し
460
+
461
+
462
+
463
+ while flag == False: # そして、このループに入る
464
+
465
+ plotOut(buf) # プロット
466
+
467
+ if time.time() - start_time > s: # 検知してからs秒以上経っていたら
468
+
469
+ print "Finished."
470
+
471
+ stream.close()
472
+
473
+ audio.terminate()
474
+
475
+ flag = True # 録音終了
476
+
477
+
478
+
479
+ else: # 停止までの残りの秒数をメッセージング
480
+
481
+ print "Remaining time [s]: " + str(5 - int(time.time() - start_time))
482
+
483
+
484
+
485
+ # ファイルに保存
486
+
487
+ filename = "record.wav" # 保存ファイル名
488
+
489
+ print "Write down wav format: " + filename
490
+
491
+ print u"type(data): " + str(type(data)) # list
492
+
493
+ wavOut(filename)
494
+
495
+ ```
496
+
497
+ 文字化けした出力の画像
498
+
499
+ ![イメージ説明](aacb6867663ff23faa10bdd2fd068614.png)
500
+
259
501
 
260
502
 
261
503
  よろしくお願い致します。

4

コード全体を追記いたしました。

2019/04/06 08:41

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -44,6 +44,218 @@
44
44
 
45
45
  ```
46
46
 
47
+ 下はコード全体です。
48
+
49
+ ```Python
50
+
51
+ #coding: utf-8
52
+
53
+ import pyaudio as pyaudio
54
+
55
+ import wave
56
+
57
+ import time
58
+
59
+ import numpy as np
60
+
61
+ import matplotlib.pyplot as plt
62
+
63
+ import struct
64
+
65
+
66
+
67
+ fs = 16000 # サンプリング周波数 [Hz]
68
+
69
+ channel = 1 # チャンネル数
70
+
71
+
72
+
73
+ ####### wavファイル保存関数
74
+
75
+ def wavOut(filename):
76
+
77
+ # 書き出し用オブジェクトの生成(ファイル名の決定)
78
+
79
+ out = wave.Wave_write(filename)
80
+
81
+
82
+
83
+ out.setnchannels(channel) # チャンネル数を設定
84
+
85
+ out.setsampwidth(2) # 量子化ビット数16bits(2byte)を設定
86
+
87
+ out.setframerate(fs) # サンプリング周波数を設定
88
+
89
+
90
+
91
+ print data
92
+
93
+ intData = struct.unpack("h", data)
94
+
95
+ for i in intData:
96
+
97
+ if i > 10000:
98
+
99
+ print i
100
+
101
+ if i < 10000:
102
+
103
+ print u"10000未満:" + i
104
+
105
+
106
+
107
+ # dataを結合してwrite
108
+
109
+ out.writeframes(b''.join(data)) # dataはbytes型
110
+
111
+ out.close()
112
+
113
+
114
+
115
+ ####### プロット関数
116
+
117
+ def plotOut(plot_data):
118
+
119
+
120
+
121
+ plt.clf()
122
+
123
+ plt.ylim(-1*2**15, 2**15) # 上下15bit分を表示
124
+
125
+ plt.plot(plot_data)
126
+
127
+ plt.pause(0.01) # plotして0.01秒pause
128
+
129
+
130
+
131
+ ####### 録音用コーバック関数(別スレッドで動作)
132
+
133
+ def adCallback(in_data, frame_count, time_info, status):
134
+
135
+ # dataに録音バッファ(in_data)を追加
136
+
137
+ data.append(in_data) # in_dataは何型?
138
+
139
+
140
+
141
+ # 代入する前にグローバル変数であることを宣言
142
+
143
+ global buf
144
+
145
+ # 取得した録音バッファ(in_data)をint16に変換
146
+
147
+ buf = np.frombuffer(in_data, dtype="int16")
148
+
149
+
150
+
151
+ return (None, pyaudio.paContinue)
152
+
153
+
154
+
155
+
156
+
157
+ ####### ここからメイン
158
+
159
+ if __name__ == '__main__':
160
+
161
+ # バッファのサイズ
162
+
163
+ size = 2**10
164
+
165
+ audio = pyaudio.PyAudio()
166
+
167
+ # オーディオストリームstreamをopen
168
+
169
+ stream = audio.open(format=pyaudio.paInt16, # 量子化ビット数16bit
170
+
171
+ channels=int(channel), # チャンネル数
172
+
173
+ rate=int(fs), # サンプリング周波数
174
+
175
+ input=True, # 録音のときは input=True
176
+
177
+ frames_per_buffer=size, # バッファのサイズを設定
178
+
179
+ stream_callback = adCallback) # コールバック関数の設定
180
+
181
+
182
+
183
+ # 初期化
184
+
185
+ data = []
186
+
187
+ buf = []
188
+
189
+ start_time = ''
190
+
191
+ flag = True
192
+
193
+
194
+
195
+ # 録音の開始
196
+
197
+ stream.start_stream() # 別スレッドで録音を開始
198
+
199
+ print ("Recording.")
200
+
201
+
202
+
203
+ # メインスレッド処理
204
+
205
+ while flag == True:
206
+
207
+ # プロット
208
+
209
+ plotOut(buf) # プロット
210
+
211
+
212
+
213
+ # buf中振幅の絶対値が 10000 を超えたら
214
+
215
+ if np.max(np.absolute(buf)) > 10000:
216
+
217
+ start_time = time.time() # 音圧が10000を超えた時刻を取得
218
+
219
+ print ("Time reset.") # 10000を超えたことをメッセージング
220
+
221
+ flag = False
222
+
223
+
224
+
225
+ while flag == False: # 音圧が10000を超えたら
226
+
227
+ plotOut(buf)
228
+
229
+ if time.time() - start_time > 2: # 録音を停止する
230
+
231
+ print ("Finished.")
232
+
233
+ stream.close()
234
+
235
+ audio.terminate()
236
+
237
+ flag = True
238
+
239
+
240
+
241
+ else: # 停止までの残りの秒数をメッセージング
242
+
243
+ print ("Remaining time [s]: " + str(5 - int(time.time() - start_time)))
244
+
245
+
246
+
247
+ # ファイルに保存
248
+
249
+ filename = "record.wav" # 保存ファイル名
250
+
251
+ print ("Write: " + filename)
252
+
253
+ wavOut(filename)
254
+
255
+
256
+
257
+ ```
258
+
47
259
 
48
260
 
49
261
  よろしくお願い致します。

3

質問文を修正

2019/04/03 08:43

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- MacOS Mojave・Python2.7環境でマイクから音を拾って、拾った音をwavファイルに書き込むというプログラムを書こうとしてる途中です。下のコードを実行すると画像のように、dataにはBytes型?のオブジェクトが入っているようなのですけど、その次の行で以下のようなエラーが発生しました。これを適切に整数型に変換してfor文などで要素を一つづつ取り出すなどの処理をしたいのですが、どのように書き直したら上手くいくでしょうか。なお、下記のようにpyaudioでは16bitで収録するようにしています。
5
+ MacOS Mojave・Python2.7環境でマイクから音を拾って、拾った音をwavファイルに書き込むというプログラムを書こうとしてる途中です。下のコードを実行すると画像のように、dataにはBytes型?のオブジェクトが入っているようなのですけど、その次の行で以下のようなエラーが発生しました。これを適切に整数型に変換してfor文などで要素を一つづつ取り出すなどの処理をしたいのですが、どのように書き直したら上手くいくでしょうか。なお、下記のようにしてpyaudioでは16bitで収録するようにしています。
6
6
 
7
7
  ```Python
8
8
 

2

質問文を修正

2019/04/03 08:28

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -2,9 +2,23 @@
2
2
 
3
3
 
4
4
 
5
- MacOS Mojave・Python2.7環境で下のコードを実行すると画像のように、dataにはBytes型?のオブジェクトが入っているようなのですけど、その次の行で以下のようなエラーが発生しました。これを適切に整数型に変換してfor文などで要素を一つづつ取り出すなどの処理をしたいのですが、どのように書き直したら上手くいくでしょうか。
5
+ MacOS Mojave・Python2.7環境でマイクから音を拾って、拾った音をwavファイルに書き込むというプログラムを書こうとしてる途中です。下のコードを実行すると画像のように、dataにはBytes型?のオブジェクトが入っているようなのですけど、その次の行で以下のようなエラーが発生しました。これを適切に整数型に変換してfor文などで要素を一つづつ取り出すなどの処理をしたいのですが、どのように書き直したら上手くいくでしょうか。なお、下記のようにpyaudioでは16bitで収録するようにしています。
6
6
 
7
7
  ```Python
8
+
9
+ stream = audio.open(format=pyaudio.paInt16, # 量子化ビット数16bit
10
+
11
+ channels=int(channel), # チャンネル数
12
+
13
+ rate=int(fs), # サンプリング周波数
14
+
15
+ input=True, # 録音のときは input=True
16
+
17
+ frames_per_buffer=size, # バッファのサイズを設定
18
+
19
+ stream_callback = adCallback) # コールバック関数の設定
20
+
21
+
8
22
 
9
23
  print data
10
24
 

1

コード埋め込み機能に使うプログラミング言語の名称部分を修正

2019/04/03 08:26

投稿

slimat
slimat

スコア57

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  MacOS Mojave・Python2.7環境で下のコードを実行すると画像のように、dataにはBytes型?のオブジェクトが入っているようなのですけど、その次の行で以下のようなエラーが発生しました。これを適切に整数型に変換してfor文などで要素を一つづつ取り出すなどの処理をしたいのですが、どのように書き直したら上手くいくでしょうか。
6
6
 
7
- ```Python2.7
7
+ ```Python
8
8
 
9
9
  print data
10
10
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  ![イメージ説明](5b352c54cebf5a6432b7776f81a14ae6.png)
16
16
 
17
- ```bash?
17
+ ```bash
18
18
 
19
19
  Traceback (most recent call last):
20
20