基于Python 的语音重采样函数解析


Posted in Python onJuly 06, 2020

因为工作中会经常遇到不同采样率的声音文件的问题,特意写了一下重采样的程序。

原理就是把采样点转换到时间刻度之后再进行插值,经过测试,是没有问题的。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 17-7-21 下午2:32
# @Author : Lei.Jinggui
# @Site : http://blog.csdn.net/lccever
# @File : Resample.py
# @Software: PyCharm Community Edition
# @contact: lccever@126.com
import numpy as np
def Resample(input_signal,src_fs,tar_fs):
 '''
 :param input_signal:输入信号
 :param src_fs:输入信号采样率
 :param tar_fs:输出信号采样率
 :return:输出信号
 '''
 dtype = input_signal.dtype
 audio_len = len(input_signal)
 audio_time_max = 1.0*(audio_len-1) / src_fs
 src_time = 1.0 * np.linspace(0,audio_len,audio_len) / src_fs
 tar_time = 1.0 * np.linspace(0,np.int(audio_time_max*tar_fs),np.int(audio_time_max*tar_fs)) / tar_fs
 output_signal = np.interp(tar_time,src_time,input_signal).astype(dtype)
 return output_signal

if __name__ == '__main__':
 import wave
 import pyaudio
 def playSound(audio_data_short, framerate=16000, channels=1):
  preply = pyaudio.PyAudio()
  # 播放声音
  streamreply = preply.open(format=pyaudio.paInt16,
         channels=channels,
         rate=framerate,
         output=True)
  data = audio_data_short.tostring()
  streamreply.write(data)
  streamreply.close()
  preply.terminate()
 wave_file = 'test.wav'
 audio_file = wave.open(wave_file, 'rb')
 audio_data = audio_file.readframes(audio_file.getnframes())
 audio_data_short = np.fromstring(audio_data, np.short)
 src_fs = audio_file.getframerate()
 src_chanels = audio_file.getnchannels()
 if src_chanels > 1:
  audio_data_short = audio_data_short[::src_chanels]
 tar_fs = np.int(src_fs * 0.5)

 playSound(audio_data_short,framerate=src_fs)
 audio_data_short0 = Resample(audio_data_short,src_fs,tar_fs)
 playSound(audio_data_short0,framerate=tar_fs)

补充知识:Python 多线程的退出/停止的一种是实现思路

在使用多线程的过程中,我们知道,python的线程是没有stop/terminate方法的,也就是说它被启动后,你无法再主动去退出它,除非主进程退出了,注意,是主进程,不是线程的父进程.

一个比较合理的方式就是把原因需要放到threading.Thread的target中的线程函数,改写到一个继承类中,下面是一个实现例子

import threading
import time
import os
 
# 原本需要用来启动的无线循环的函数
def print_thread():
 pid = os.getpid()
 counts = 0
 while True:
  print(f'threading pid: {pid} ran: {counts:04d} s')
  counts += 1
  time.sleep(1)
 
# 把函数放到改写到类的run方法中,便可以通过调用类方法,实现线程的终止
class StoppableThread(threading.Thread):
 
 def __init__(self, daemon=None):
  super(StoppableThread, self).__init__(daemon=daemon)
  self.__is_running = True
  self.daemon = daemon
 
 def terminate(self):
  self.__is_running = False
 
 def run(self):
  pid = os.getpid()
  counts = 0
  while self.__is_running:
   print(f'threading running: {pid} ran: {counts:04d} s')
   counts += 1
   time.sleep(1)
 
def call_thread():
 thread = StoppableThread()
 thread.daemon = True
 thread.start()
 
 pid = os.getpid()
 counts = 0
 for i in range(5):
  print(f'0 call threading pid: {pid} ran: {counts:04d} s')
  counts += 2
  time.sleep(2)
 # 主动把线程退出
 thread.terminate()
 
if __name__ == '__main__':
 call_thread()
 print(f'==========call_thread finish===========')
 counts = 0
 for i in range(5):
  counts += 1
  time.sleep(1)
  print(f'main thread:{counts:04d} s')

以上这篇基于Python 的语音重采样函数解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中运行并行任务技巧
Feb 26 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
简单讲解Python中的数字类型及基本的数学计算
Mar 11 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
Python字符串格式化f-string多种功能实现
May 07 Python
Python库安装速度过慢解决方案
Jul 14 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 Python
python interpolate插值实例
Jul 06 #Python
基于Python实现2种反转链表方法代码实例
Jul 06 #Python
简单了解Django项目应用创建过程
Jul 06 #Python
如何在mac下配置python虚拟环境
Jul 06 #Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 #Python
使用TensorBoard进行超参数优化的实现
Jul 06 #Python
Django中F函数的使用示例代码详解
Jul 06 #Python
You might like
解析php中curl_multi的应用
2013/07/17 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
jquery遍历checkbox介绍
2014/02/21 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
详解JavaScript中操作符和表达式
2018/09/12 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
python 文件和路径操作函数小结
2009/11/23 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python算法应用实战之栈详解
2017/02/04 Python
Python学习思维导图(必看篇)
2017/06/26 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
Python实现FM算法解析
2019/06/18 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
python中@contextmanager实例用法
2021/02/07 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
活动策划求职信模板
2014/04/21 职场文书
公司捐款倡议书
2014/05/14 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
golang import自定义包方式
2021/04/29 Golang
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers