基于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之使用Python查询更新数据库
Nov 25 Python
python读写二进制文件的方法
May 09 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
Python实现各种排序算法的代码示例总结
Dec 11 Python
Python常用模块之requests模块用法分析
May 15 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
Python 实现向word(docx)中输出
Feb 13 Python
利用python实现逐步回归
Feb 24 Python
python小白切忌乱用表达式
May 29 Python
python爬取招聘要求等信息实例
Nov 20 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 全文搜索和替换的实现代码
2008/07/29 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
js如何获取网页所有图片
2017/05/12 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python已协程方式处理任务实现过程
2019/12/27 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
python 实现Harris角点检测算法
2020/12/11 Python
HTML5 Web 存储详解
2016/09/16 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
医药专业推荐信
2013/11/15 职场文书
父母寄语大全
2014/04/12 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书