基于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中Collections模块的Counter容器类使用教程
May 31 Python
如何利用Fabric自动化你的任务
Oct 20 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python谱减法语音降噪实例
Dec 18 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
python 批量将中文名转换为拼音
Feb 07 Python
Python关于OS文件目录处理的实例分享
May 23 Python
Pandas加速代码之避免使用for循环
May 30 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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
javascript,php获取函数参数对象的代码
2011/02/03 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
js html实现计算器功能
2018/11/13 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
实例讲解React 组件
2020/07/07 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python创造虚拟环境方法总结
2019/03/04 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
车间班组长的职责
2013/12/13 职场文书
四好少年事迹材料
2014/01/12 职场文书
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python
Python何绘制带有背景色块的折线图
2022/04/23 Python
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android