基于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爬虫框架Scrapy安装使用步骤
Apr 01 Python
python统计cpu利用率的方法
Jun 02 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
python用plt画图时,cmp设置方法
Dec 13 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Python搭建Spark分布式集群环境
Jul 05 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python爬虫--selenium模块
Mar 31 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 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
php include类文件超时问题处理
2015/02/06 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
基于wxpython实现的windows GUI程序实例
2015/05/30 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
简历的自荐信
2013/12/19 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
工商干部先进事迹
2014/05/14 职场文书
法人委托书范本
2014/09/15 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
财产分割协议书范本
2014/11/03 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android