基于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实现文本文件合并
Dec 29 Python
Python定时器实例代码
Nov 01 Python
Python入门必须知道的11个知识点
Mar 21 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
pyQt5实时刷新界面的示例
Jun 25 Python
python中while和for的区别总结
Jun 28 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 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
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
JS验证不重复验证码
2017/02/10 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
Jquery Datatables的使用详解
2020/01/30 jQuery
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
普通员工辞职信
2014/01/17 职场文书
阳光体育活动方案
2014/02/16 职场文书
社区党员公开承诺书
2014/08/30 职场文书
离婚案件上诉状
2015/05/23 职场文书
独生子女证明范本
2015/06/19 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python