回答編集履歴

2

補足を追加

2019/06/27 09:01

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -83,6 +83,7 @@
83
83
  l_data = data[0::2]
84
84
  r_data = data[1::2]
85
85
 
86
+ # 0~1 秒のデータを表示
86
87
  t = np.arange(0, 1., 1/sample_rate)
87
88
  fig, axs = plt.subplots(2,1)
88
89
  axs[0].plot(t, l_data[:len(t)])

1

実データを元に追記

2019/06/27 09:01

投稿

magichan
magichan

スコア15898

answer CHANGED
@@ -24,4 +24,69 @@
24
24
  R = data[1::2]
25
25
  ```
26
26
 
27
- で良いかと思います。
27
+ で良いかと思います。
28
+
29
+ ---
30
+ ##【追記】
31
+ > データを提示していただいたので。
32
+
33
+ とりあえず以下のようにWAVのデータ部のみをfloat32にて読み込み、int16 に変換してみたところ問題なく再生できているようです。
34
+ (データの開始位置 (0x58) は実データをバイナリエディタで解析した値を直打ちしております。)
35
+
36
+ ```Python
37
+ import pyaudio
38
+ import struct
39
+ import numpy as np
40
+
41
+ with open('faucet_1.wav', 'rb') as f:
42
+ buf = f.read()[0x58:]
43
+
44
+ channel_num = 2
45
+ sample_rate = 44100
46
+
47
+ data = np.frombuffer(buf, dtype='float32')
48
+
49
+ # 2バイトデータに変換して再生してみる
50
+ sample_width = 2
51
+ data = [int(d * 32767.0) for d in data]
52
+ data = struct.pack('h' * len(data), *data)
53
+
54
+ audio = pyaudio.PyAudio()
55
+ stream = audio.open(format=audio.get_format_from_width(sample_width),
56
+ channels=channel_num,
57
+ rate=sample_rate,
58
+ output=True)
59
+
60
+ chunk = 1024
61
+ pos = 0
62
+ while data != '':
63
+ stream.write(data[pos:pos+chunk])
64
+ pos += chunk
65
+ stream.close()
66
+
67
+ audio.terminate()
68
+ ```
69
+
70
+ 今回の質問はデータを読み込みたいということでしたので、データを表示するとなるとこんな感じになるかと思います。
71
+
72
+ ```Python
73
+ import numpy as np
74
+ import matplotlib.pyplot as plt
75
+
76
+ with open('faucet_1.wav', 'rb') as f:
77
+ buf = f.read()[0x58:]
78
+
79
+ channel_num = 2
80
+ sample_rate = 44100
81
+
82
+ data = np.frombuffer(buf, dtype='float32')
83
+ l_data = data[0::2]
84
+ r_data = data[1::2]
85
+
86
+ t = np.arange(0, 1., 1/sample_rate)
87
+ fig, axs = plt.subplots(2,1)
88
+ axs[0].plot(t, l_data[:len(t)])
89
+ axs[1].plot(t, r_data[:len(t)])
90
+ plt.show()
91
+
92
+ ```