基于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 相关文章推荐
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
Python配置mysql的教程(推荐)
Oct 13 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
python 多线程重启方法
Feb 18 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 Python
django列表筛选功能的实现代码
Mar 27 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python必学知识之文件操作(建议收藏)
May 30 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 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 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
PHP中overload与override的区别
2017/02/13 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
node.js require() 源码解读
2015/12/13 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
Python内置函数的用法实例教程
2014/09/08 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
Django model class Meta原理解析
2020/11/14 Python
python中的列表和元组区别分析
2020/12/30 Python
学生党员思想汇报范文
2014/01/09 职场文书
平民服装店创业计划书
2014/01/17 职场文书
一夜的工作教学反思
2014/02/08 职场文书
电子商务专业求职信
2014/07/10 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
小学生思想品德评语
2014/12/31 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书