基于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 import自定义模块方法
Feb 12 Python
使用Python脚本对Linux服务器进行监控的教程
Apr 02 Python
python访问类中docstring注释的实现方法
May 04 Python
python实现linux下使用xcopy的方法
Jun 28 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
python实现石头剪刀布程序
Jan 20 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
python画蝴蝶曲线图的实例
Nov 21 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
Pandas数据结构之Series的使用
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中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
PHP常用数组函数介绍
2014/07/28 PHP
php实现无限级分类
2014/12/24 PHP
PHP培训要多少钱
2017/06/06 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
javascript每日必学之多态
2016/02/23 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
在Python中编写数据库模块的教程
2015/04/29 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
如何卸载python插件
2020/07/08 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
python 调整图片亮度的示例
2020/12/03 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
就业自荐书
2013/12/05 职场文书
求职自荐信
2013/12/14 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
python 实现德洛内三角剖分的操作
2021/04/22 Python