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

質問編集履歴

7

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

2019/04/09 02:59

投稿

slimat
slimat

スコア57

title CHANGED
File without changes
body CHANGED
@@ -21,7 +21,7 @@
21
21
  intData = struct.unpack("h", data)
22
22
  struct.error: unpack requires a string argument of length 2
23
23
  ```
24
- 下はコード全体です。
24
+ 下はコード全体です。(古いコード)
25
25
  ```Python
26
26
  #coding: utf-8
27
27
  import pyaudio as pyaudio

6

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

2019/04/09 02:59

投稿

slimat
slimat

スコア57

title CHANGED
File without changes
body CHANGED
@@ -127,7 +127,7 @@
127
127
  wavOut(filename)
128
128
 
129
129
  ```
130
- 新しいコード
130
+ 修正したコード(新しいコード)
131
131
  ```Python
132
132
  #coding: utf-8
133
133
  import pyaudio as pyaudio

5

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

2019/04/06 08:45

投稿

slimat
slimat

スコア57

title CHANGED
File without changes
body CHANGED
@@ -127,5 +127,126 @@
127
127
  wavOut(filename)
128
128
 
129
129
  ```
130
+ 新しいコード
131
+ ```Python
132
+ #coding: utf-8
133
+ import pyaudio as pyaudio
134
+ import wave
135
+ import time
136
+ import numpy as np
137
+ import matplotlib.pyplot as plt
138
+ import struct
130
139
 
140
+ fs = 16000 # サンプリング周波数 [Hz]
141
+ channel = 1 # チャンネル数
142
+
143
+ ####### wavファイル保存関数
144
+ def wavOut(filename):
145
+ # 書き出し用オブジェクトの生成(ファイル名の決定)
146
+ out = wave.Wave_write(filename)
147
+
148
+ out.setnchannels(channel) # チャンネル数を設定
149
+ out.setsampwidth(2) # 量子化ビット数16bits(2byte)を設定
150
+ out.setframerate(fs) # サンプリング周波数を設定
151
+
152
+ global packed
153
+ packed = b''.join(data)
154
+ print u"type(packed): " + str(type(packed)) # str
155
+ print packed
156
+ print type()
157
+ # intData = struct.unpack("h", packed)
158
+
159
+
160
+
161
+ for i in intData:
162
+ if i > 10000:
163
+ print i
164
+ if i < 10000:
165
+ print u"10000未満:" + i
166
+
167
+ # dataを結合してwrite
168
+ out.writeframes(packed) # dataはbytes型
169
+ out.close()
170
+
171
+ ####### プロット関数
172
+ def plotOut(plot_data):
173
+
174
+ plt.clf()
175
+ plt.ylim(-1*2**15, 2**15) # 上下15bit分を表示
176
+ plt.plot(plot_data)
177
+ plt.pause(0.01) # plotして0.01秒pause
178
+
179
+ ####### 録音用コーバック関数(別スレッドで動作)
180
+ def adCallback(in_data, frame_count, time_info, status):
181
+
182
+ # print u"type(in_data): " + str(type(in_data)) # str
183
+ data.append(in_data) # 文字列のリスト型オブジェクト
184
+ print data # \xb6\xff\xba\xff\xb6\xff\xb7の形の出力が得られる
185
+
186
+ # 代入する前にグローバル変数であることを宣言
187
+ global buf
188
+
189
+ # 取得した録音バッファ(in_data)をint16に変換
190
+ # bufはリスト型なので、リストのインデックス0番にndarrayが入るということ?
191
+ # 4文字の一つの数字に変換していく
192
+ buf = np.frombuffer(in_data, dtype="int16") # bufはndarrayで、extendsは使えない。
193
+ # print u"type(buf): " + str(type(buf)) # 再代入してるからndarrayに変化
194
+
195
+ return (None, pyaudio.paContinue)
196
+
197
+ ####### ここからメイン
198
+ if __name__ == '__main__':
199
+ # バッファのサイズ
200
+ size = 2**10
201
+ audio = pyaudio.PyAudio()
202
+ # オーディオストリームstreamをopen
203
+ stream = audio.open(format=pyaudio.paInt16, # 量子化ビット数16bit
204
+ channels=int(channel), # チャンネル数
205
+ rate=int(fs), # サンプリング周波数
206
+ input=True, # 録音のときは input=True
207
+ frames_per_buffer=size, # バッファのサイズを設定
208
+ stream_callback = adCallback) # コールバック関数の設定
209
+
210
+ # 初期化
211
+ data = []
212
+ packed = 1
213
+ buf = False
214
+ print u"初期化時はtype(buf): " + str(type(buf)) # list
215
+ start_time = ''
216
+ flag = True
217
+ s = 2
218
+
219
+ # 録音の開始
220
+ stream.start_stream() # 別スレッドで録音を開始
221
+ print "Recording."
222
+
223
+ # メインスレッド処理
224
+ while flag == True:
225
+ plotOut(buf) # プロット
226
+
227
+ # buf中振幅の絶対値が 10000 を超えたら
228
+ if np.max(np.absolute(buf)) > 10000:
229
+ start_time = time.time() # その時刻を取得
230
+ flag = False # このwhileループを抜け出し
231
+
232
+ while flag == False: # そして、このループに入る
233
+ plotOut(buf) # プロット
234
+ if time.time() - start_time > s: # 検知してからs秒以上経っていたら
235
+ print "Finished."
236
+ stream.close()
237
+ audio.terminate()
238
+ flag = True # 録音終了
239
+
240
+ else: # 停止までの残りの秒数をメッセージング
241
+ print "Remaining time [s]: " + str(5 - int(time.time() - start_time))
242
+
243
+ # ファイルに保存
244
+ filename = "record.wav" # 保存ファイル名
245
+ print "Write down wav format: " + filename
246
+ print u"type(data): " + str(type(data)) # list
247
+ wavOut(filename)
248
+ ```
249
+ 文字化けした出力の画像
250
+ ![イメージ説明](aacb6867663ff23faa10bdd2fd068614.png)
251
+
131
252
  よろしくお願い致します。

4

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

2019/04/06 08:41

投稿

slimat
slimat

スコア57

title CHANGED
File without changes
body CHANGED
@@ -21,5 +21,111 @@
21
21
  intData = struct.unpack("h", data)
22
22
  struct.error: unpack requires a string argument of length 2
23
23
  ```
24
+ 下はコード全体です。
25
+ ```Python
26
+ #coding: utf-8
27
+ import pyaudio as pyaudio
28
+ import wave
29
+ import time
30
+ import numpy as np
31
+ import matplotlib.pyplot as plt
32
+ import struct
24
33
 
34
+ fs = 16000 # サンプリング周波数 [Hz]
35
+ channel = 1 # チャンネル数
36
+
37
+ ####### wavファイル保存関数
38
+ def wavOut(filename):
39
+ # 書き出し用オブジェクトの生成(ファイル名の決定)
40
+ out = wave.Wave_write(filename)
41
+
42
+ out.setnchannels(channel) # チャンネル数を設定
43
+ out.setsampwidth(2) # 量子化ビット数16bits(2byte)を設定
44
+ out.setframerate(fs) # サンプリング周波数を設定
45
+
46
+ print data
47
+ intData = struct.unpack("h", data)
48
+ for i in intData:
49
+ if i > 10000:
50
+ print i
51
+ if i < 10000:
52
+ print u"10000未満:" + i
53
+
54
+ # dataを結合してwrite
55
+ out.writeframes(b''.join(data)) # dataはbytes型
56
+ out.close()
57
+
58
+ ####### プロット関数
59
+ def plotOut(plot_data):
60
+
61
+ plt.clf()
62
+ plt.ylim(-1*2**15, 2**15) # 上下15bit分を表示
63
+ plt.plot(plot_data)
64
+ plt.pause(0.01) # plotして0.01秒pause
65
+
66
+ ####### 録音用コーバック関数(別スレッドで動作)
67
+ def adCallback(in_data, frame_count, time_info, status):
68
+ # dataに録音バッファ(in_data)を追加
69
+ data.append(in_data) # in_dataは何型?
70
+
71
+ # 代入する前にグローバル変数であることを宣言
72
+ global buf
73
+ # 取得した録音バッファ(in_data)をint16に変換
74
+ buf = np.frombuffer(in_data, dtype="int16")
75
+
76
+ return (None, pyaudio.paContinue)
77
+
78
+
79
+ ####### ここからメイン
80
+ if __name__ == '__main__':
81
+ # バッファのサイズ
82
+ size = 2**10
83
+ audio = pyaudio.PyAudio()
84
+ # オーディオストリームstreamをopen
85
+ stream = audio.open(format=pyaudio.paInt16, # 量子化ビット数16bit
86
+ channels=int(channel), # チャンネル数
87
+ rate=int(fs), # サンプリング周波数
88
+ input=True, # 録音のときは input=True
89
+ frames_per_buffer=size, # バッファのサイズを設定
90
+ stream_callback = adCallback) # コールバック関数の設定
91
+
92
+ # 初期化
93
+ data = []
94
+ buf = []
95
+ start_time = ''
96
+ flag = True
97
+
98
+ # 録音の開始
99
+ stream.start_stream() # 別スレッドで録音を開始
100
+ print ("Recording.")
101
+
102
+ # メインスレッド処理
103
+ while flag == True:
104
+ # プロット
105
+ plotOut(buf) # プロット
106
+
107
+ # buf中振幅の絶対値が 10000 を超えたら
108
+ if np.max(np.absolute(buf)) > 10000:
109
+ start_time = time.time() # 音圧が10000を超えた時刻を取得
110
+ print ("Time reset.") # 10000を超えたことをメッセージング
111
+ flag = False
112
+
113
+ while flag == False: # 音圧が10000を超えたら
114
+ plotOut(buf)
115
+ if time.time() - start_time > 2: # 録音を停止する
116
+ print ("Finished.")
117
+ stream.close()
118
+ audio.terminate()
119
+ flag = True
120
+
121
+ else: # 停止までの残りの秒数をメッセージング
122
+ print ("Remaining time [s]: " + str(5 - int(time.time() - start_time)))
123
+
124
+ # ファイルに保存
125
+ filename = "record.wav" # 保存ファイル名
126
+ print ("Write: " + filename)
127
+ wavOut(filename)
128
+
129
+ ```
130
+
25
131
  よろしくお願い致します。

3

質問文を修正

2019/04/03 08:43

投稿

slimat
slimat

スコア57

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

2

質問文を修正

2019/04/03 08:28

投稿

slimat
slimat

スコア57

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

1

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

2019/04/03 08:26

投稿

slimat
slimat

スコア57

title CHANGED
File without changes
body CHANGED
@@ -1,12 +1,12 @@
1
1
  こんにちは。
2
2
 
3
3
  MacOS Mojave・Python2.7環境で下のコードを実行すると画像のように、dataにはBytes型?のオブジェクトが入っているようなのですけど、その次の行で以下のようなエラーが発生しました。これを適切に整数型に変換してfor文などで要素を一つづつ取り出すなどの処理をしたいのですが、どのように書き直したら上手くいくでしょうか。
4
- ```Python2.7
4
+ ```Python
5
5
  print data
6
6
  intData = struct.unpack("h", data)
7
7
  ```
8
8
  ![イメージ説明](5b352c54cebf5a6432b7776f81a14ae6.png)
9
- ```bash?
9
+ ```bash
10
10
  Traceback (most recent call last):
11
11
  File "5-4.py", line 103, in <module>
12
12
  wavOut(filename)