基于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实现控制台进度条功能
Jan 04 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
Python中最大递归深度值的探讨
Mar 05 Python
Python 转换文本编码实现解析
Aug 27 Python
python模块常用用法实例详解
Oct 17 Python
Python调用Windows命令打印文件
Feb 07 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
Python 绘制多因子柱状图
May 11 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
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
7个JS基础知识总结
2014/03/05 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
js中this用法实例详解
2015/05/05 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
python encode和decode的妙用
2009/09/02 Python
python列表操作实例
2015/01/14 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
python os.path模块常用方法实例详解
2018/09/16 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python ChainMap的使用和说明详解
2019/06/11 Python
python列表返回重复数据的下标
2020/02/10 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
个人公司授权委托书范本
2014/10/12 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python