if stop_or_rec_confirm:
try:
sd.stop()
st.info("正在停止录音") #这里的写法是不对的
audio_data[:] = [item for item in audio_data if not isinstance(item, bool)]
combined_array = np.vstack(audio_data)
sf.write(filename, combined_array, fs, subtype='PCM_16')
print("录音完成!已保存为 {}".format(filename))
except:
print("保存出错")
finally:
mutex.release() # 释放互斥锁
这里的st.info("正在停止录音")是不对的,会导致以下问题:
Thread ‘Thread-14 (record_audio_thread)’: missing ScriptRunContext
因此,想要停止录音线程,只能使用全局变量(上面代码中的stop\_or\_rec)。
## 第二坑:不限制录音时长,随时结束录音。
我使用的是sounddevice库,但是它有个问题,就是需要将录制的数据长度作为参数输入,才可以记录数据。比如这段代码:
with sd.InputStream(fs, channels=1) as stream:
global duration
audio_data.extend(stream.read(int(duration * fs))) # 读取一定数量的音频数据
time.sleep(0.001) # 等待一小段时间,避免过快的循环
读取音频流时,需要定义好duration(时长,秒)和fs(采样率),由此计算出读取的样本点数。但是问题来了,如果我并不确定需要录制多久,而是想随时停止录制,这该怎么办呢?
目前采用的方法是将duration设置为5s,每录制5秒就向总的录音数据变量audio\_data中添加一次。这引出了另一个问题,就是当我点击停止录制的按钮时,可能刚好在读取新一轮5秒片段中的第2秒,此时如果立即停止就会导致这最后读的2秒数据没能加入到audio\_data中。
因此,我有设置了一个局部变量stop\_or\_rec\_confirm,当stop\_or\_rec变量被置为True时(即停止录音信号),此时继续让程序把正在读的这5秒数据读完,之后再将stop\_or\_rec\_confirm置为True。当检测到stop\_or\_rec\_confirm为True时,便不再录音,而是保存数据,接收录音。下面是录音线程的完整代码:
def record_audio_thread(fs, filename):
mutex.acquire()
global stop_or_rec, audio_data
stop_or_rec_confirm = False
try:
while stop_or_rec is False or stop_or_rec_confirm is False:
with sd.InputStream(fs, channels=1) as stream:
global duration
audio_data.extend(stream.read(int(duration * fs))) # 读取一定数量的音频数据
time.sleep(0.001) # 等待一小段时间,避免过快的循环
if stop_or_rec:
stop_or_rec_confirm = True
if stop_or_rec_confirm:
try:
sd.stop()
print(“正在停止录音”)
audio_data[:] = [item for item in audio_data if not isinstance(item, bool)]
combined_array = np.vstack(audio_data)
sf.write(filename, combined_array, fs, subtype=‘PCM_16’)
print(“录音完成!已保存为 {}”.format(filename))
except:
print(“保存出错”)
finally:
mutex.release() # 释放互斥锁
目前来看,还有一个问题未能解决。尽管录音线程能够将每个5秒片段拼接在一起,形成完整的录音,但是在每个5秒片段的开头,由于录音设备启动时延,导致开头的近半秒钟录不进去声音。这个问题一直困扰着我。还请各位大佬指点。
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/3dbee60453f0ceedec203cccdc8ced54.png)
![img](https://img-blog.csdnimg.cn/img_convert/c1a2311e87650661dae629271f9fbbae.png)
![img](https://img-blog.csdnimg.cn/img_convert/46506ae54be168b93cf63939786134ca.png)
![img](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />