Init example project 0.1.0

This commit is contained in:
VergilWang15
2022-03-23 15:52:49 +08:00
parent 3d618eb43a
commit 454b9dcc6f
13 changed files with 120 additions and 0 deletions

Binary file not shown.

66
src/example.py Normal file
View File

@@ -0,0 +1,66 @@
import sounddevice as sd
import soundfile as sf
import settings
import numpy as np
def select_device(device_type='output'):
i = 0
for device in device_list: # 选择设备
host_name = sd.query_hostapis(device['hostapi'])['name']
if device_type == 'input' and 'PawPaw Microphone Array' in device['name'] and host_api in host_name \
and input_channel == device['max_input_channels']:
print("找到一个PawPaw输入设备: " + str(i) + " " + device['name'])
sd.default.device = i # 设置输入设备
if device_type == 'output' and 'PawPaw Microphone Array' in device['name'] and host_api in host_name \
and output_channels == device['max_output_channels']:
print("找到一个PawPaw输出设备: " + str(i) + " " + device['name'])
sd.default.device = i # 设置输出设备
i = i + 1
def play_pcm_raw():
# path = '../test_audio/test_audio_48k.raw'
path = '../recorded_audio/testfile.raw' # 此处的.raw文件即为pcm格式音频
# 解析pcm文件并存放到数据流中
# 需要4个变量文件路径音频通道数采样率音频子类型
# 此处的音频位深为16位故选用PCM_16关于如何寻找音频的子类型参考README.md
select_device(device_type='output')
data, fs = sf.read(path, channels=2, samplerate=48000, subtype='PCM_16')
sd.play(data, fs)
sd.wait()
def recording():
duration = 3 # 录制时间
fs = 48000 # 采样率
select_device(device_type='input')
my_recording = sd.rec(int(duration * fs), samplerate=fs, channels=18) # 将音频写入输入流
sd.wait()
# 提取前两个通道的音频保存为raw文件供测试播放
stereo_array = np.empty((len(my_recording), 2))
flag = 0
for frame in my_recording:
stereo_array[flag][0] = frame[0]
stereo_array[flag][1] = frame[1]
flag = flag + 1
print(stereo_array)
sf.write('../recorded_audio/testfile.raw', data=stereo_array, subtype='PCM_16', samplerate=fs)
if __name__ == '__main__':
host_api = settings.HOST_API # 不同平台的音频接口不同例如windows可用WASAPI
input_channel = settings.MAX_INPUT_CHANNEL
output_channels = settings.MAX_OUTPUT_CHANNEL
device_list = sd.query_devices() # 获取电脑上的所有音频设备
recording()
while True:
play_pcm_raw()
user_input = input("输入1继续播放输入2退出测试")
if user_input == '1':
continue
if user_input == '2':
break
print("结束")

3
src/settings.py Normal file
View File

@@ -0,0 +1,3 @@
HOST_API = 'WASAPI'
MAX_INPUT_CHANNEL = 18
MAX_OUTPUT_CHANNEL = 2