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

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (pxua216mb-exp-vzNqSFa7-py3.10) (2)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/pxua216mb-exp.iml" filepath="$PROJECT_DIR$/.idea/pxua216mb-exp.iml" />
</modules>
</component>
</project>

10
.idea/pxua216mb-exp.iml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Python 3.10 (pxua216mb-exp-vzNqSFa7-py3.10) (2)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

17
README.md Normal file
View File

@@ -0,0 +1,17 @@
# PXUA216MB-DL2-M Python例程
## 安装
本项目通过poetry实现包管理
关于poetry的安装及使用方法[poetry](https://python-poetry.org/docs/)
本项目依赖于开源项目 [sounddevice](https://python-sounddevice.readthedocs.io/en/0.4.4/installation.html)
安装poetry后简单使用```poetry install```即可安装依赖
## 使用
###寻找一个格式的子类型:
```
>>> import soundfile as sf
>>> sf.available_subtypes('RAW')
```

BIN
recorded_audio/testfile.raw Normal file

Binary file not shown.

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

Binary file not shown.

Binary file not shown.

Binary file not shown.