Init example project 0.1.0
This commit is contained in:
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal 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
4
.idea/misc.xml
generated
Normal 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
8
.idea/modules.xml
generated
Normal 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
10
.idea/pxua216mb-exp.iml
generated
Normal 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
6
.idea/vcs.xml
generated
Normal 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
17
README.md
Normal 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
BIN
recorded_audio/testfile.raw
Normal file
Binary file not shown.
BIN
src/__pycache__/settings.cpython-310.pyc
Normal file
BIN
src/__pycache__/settings.cpython-310.pyc
Normal file
Binary file not shown.
66
src/example.py
Normal file
66
src/example.py
Normal 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
3
src/settings.py
Normal file
@@ -0,0 +1,3 @@
|
||||
HOST_API = 'WASAPI'
|
||||
MAX_INPUT_CHANNEL = 18
|
||||
MAX_OUTPUT_CHANNEL = 2
|
||||
BIN
test_audio/Digital Presentation_48000.wav
Normal file
BIN
test_audio/Digital Presentation_48000.wav
Normal file
Binary file not shown.
BIN
test_audio/test_audio_16k.raw
Normal file
BIN
test_audio/test_audio_16k.raw
Normal file
Binary file not shown.
BIN
test_audio/test_audio_48k.raw
Normal file
BIN
test_audio/test_audio_48k.raw
Normal file
Binary file not shown.
Reference in New Issue
Block a user