forked from xszyou/Fay
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_record.py
84 lines (70 loc) · 2.63 KB
/
test_record.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import wave
import numpy as np
import pyaudio
def save_audio_to_wav(data, sample_rate, filename):
# 确保数据类型为 int16
if data.dtype != np.int16:
data = data.astype(np.int16)
# 打开 WAV 文件
with wave.open(filename, 'wb') as wf:
# 设置音频参数
n_channels = 1 # 单声道
sampwidth = 2 # 16 位音频,每个采样点 2 字节
wf.setnchannels(n_channels)
wf.setsampwidth(sampwidth)
wf.setframerate(sample_rate)
wf.writeframes(data.tobytes())
def process_audio_data(audio_data_list, channels):
# 将累积的音频数据块连接起来
data = b''.join(audio_data_list)
# 将字节数据转换为 numpy 数组
data = np.frombuffer(data, dtype=np.int16)
# 重塑数组,将数据分离成多个声道
data = np.reshape(data, (-1, channels))
# 对所有声道的数据进行平均,生成单声道
mono_data = np.mean(data, axis=1).astype(np.int16)
return mono_data
# 示例使用
def main():
# 音频参数
sample_rate = 44100 # 采样率
channels = 1 # 声道数(根据您的实际情况)
chunk_size = 1024 # 每次读取的帧数
record_seconds = 5 # 录音时长
output_filename = 'output.wav' # 输出文件名
# 初始化 PyAudio
p = pyaudio.PyAudio()
device_info = p.get_device_info_by_index(0)
# channels = device_info.get('maxInputChannels', 1)
print(channels)
sample_rate = int(device_info.get('defaultSampleRate', 44100))
stream = p.open(format=pyaudio.paInt16,
channels=channels,
rate=sample_rate,
input=True,
frames_per_buffer=chunk_size)
print("开始录音...")
audio_data_list = []
# 录音循环
for _ in range(int(sample_rate / chunk_size * record_seconds)):
data = stream.read(chunk_size)
data = np.frombuffer(data, dtype=np.int16)
# 重塑数组,将数据分离成多个声道
data = np.reshape(data, (-1, channels))
# 对所有声道的数据进行平均,生成单声道
mono = np.mean(data, axis=1).astype(np.int16)
# 转换回字节格式
data = mono.tobytes()
audio_data_list.append(data)
print("录音结束。")
# 停止并关闭流
stream.stop_stream()
stream.close()
p.terminate()
# 处理音频数据
mono_data = process_audio_data(audio_data_list, channels)
# 保存为 WAV 文件
save_audio_to_wav(mono_data, sample_rate, output_filename)
print(f"音频已保存为 {output_filename}")
if __name__ == '__main__':
main()