Python音频处理(一)音频基础知识-周振洋
1.声音音频基础知识
(1)声音是由震动产生,表现为波的形式。波有频率,振幅等参数。对于声波而言:频率越大,音调越高,反之越低。振幅越大,声音越大,反之越小。
(2)采样率,帧率:波是连续(无穷)的,计算机存储是离散(有限)的。要想用有限存储无限,几乎不可能。因此,要每隔一段时间对波进行一次采样。每秒采样次数采样率。长用采样率是44.1kHz(这里的1k不是1024,是1000!!!切记。)。
(3)采样大小,采样宽度:波每一个时刻都有一个对应的能量值,在计算机中用整数存储。通常使用16bit有符号整数存储,采样大小是16bit。
(4)声道:这个不好解释,引用百度百科上的一句话。声道(Sound Channel) 是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
(5)人耳能听到的声波频率范围是20Hz ~20000Hz,人耳对160Hz~2500Hz的声音比较敏感。
(6)音色:不同物体发音有所不同,这些不同表现在音色上。音色在音频曲线级别的表现是频率的特定变化,振幅的特定变化
2.python读取.wav音频
下面是python3读取音频代码,详细说明都在注释里。
import wave
import struct
wave_file=wave.open("./sound111.wav", 'r')
channels=wave_file.getnchannels()#声道数
samp_width=wave_file.getsampwidth()#采样大小
frame_rate=wave_file.getframerate()#帧率
numframes=wave_file.getnframes()#总帧数
print("channel",channels)#声道数
print('samp_width',samp_width)#采样大小2B 16bit
print('frame_rate',frame_rate)#8000 帧率8000fps
print('numframes',numframes)#总帧数=帧率*时间=8000fps*10s=80000f
#输出
#channel 1
#samp_width 2
#frame_rate 8000
#numframes 80000
for i in range(500):
frame=wave_file.readframes(1)#读取1帧音频数据,可能包含多个声道信息
print(frame,struct.unpack("h",frame[0:2])[0])#struct.unpack("h",frame[0:2])将二进制数据转化成10进制(16bit有符号整数)因为这里采样大小是16bit
#输出
#b'\xd4\xfc' -812
#...
#b'\x07\xff' -249
#b'\x05\xff' -251
#b'X\xff' -168
#b'\xf2\xff' -14
#b'0\x00' 48
#b'#\x00' 35
wave_file.close()
3.python写.wav音频文件
下面是python3写音频代码,详细说明都在注释里。这里需要用到中学的简单三角函数知识,忘记的话可以复习一下。下面是一首两只老虎,尽情欣赏吧。注意:下面的代码中使用的频率是从网上找的,并不准确。国际标准A:440Hz
import wave
import struct
import math
def write_frame(time,freq,framerate,file,wave=0.4,sampwidth=2):
#time 持续时间 freq 音频频率 framerate采样频率 file 音频文件 wave 音量 sampwidth 采样深度
t=0#时刻
step=1.0/framerate #每帧间隔时长
fw=2.0*math.pi*freq #频率控制参数
wave=wave*(math.pow(2,sampwidth*8-1)-1)#音量控制
while t<=time:
v=int(math.sin(t*fw)*wave)#对波采样 math.sin(t*fw)产生freq频率的正弦波
t+=step#更新时刻
#最后这里是与sampwidth的值有关的,下面语句当前仅当sampwidth=2时成立,详细信息参考struct.pack()
file.writeframesraw(struct.pack("h",v))#写入文件 struct.pack("h",v)将有符号整数v转化成16比特2进制
tw=wave.open("./two_tigers.wav","w") #打开或创建./two_tigers.wav
tw.setnchannels(1) #设置声道数 1
tw.setframerate(8000)#设置帧率 8000
tw.setsampwidth(2)#设置采样宽度2B 16bit
#写入声音
#1 2 3 1 1 2 3 1
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
#3 4 5 - 3 4 5 -
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2)
#56 54 3 1 - 56 54 3 1 -
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=426.67, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=426.67, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=384, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=341.33, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=320, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2)
#2 6(低音) 1 - 2 6(低音) 1 -
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=144, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.25, freq=0, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=288, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=144, framerate=8000, file=tw, wave=0.4, sampwidth=2)
write_frame(time=0.5, freq=256, framerate=8000, file=tw, wave=0.4, sampwidth=2)
tw.close()
# C 1 do 256
# D 2 re 288
# E 3 mi 320
# F 4 fa 341又1/3
# G 5 so 384
# A 6 la 426又2/3
# B 7 si 480
# C 1 (上面一个点)do 512
# C:D=8:9
# D:E=9:10
# E:F=15:16
# F:G=8;9
# G:A=9:10
# A:B=15:16
---------------------
作者:Moluth
来源:CSDN
原文:https://blog.csdn.net/Moluth/article/details/79793903
版权声明:本文为博主原创文章,转载请附上博文链接!
Python音频处理(一)音频基础知识-周振洋的更多相关文章
- Python专题三字符串的基础知识
Python专题三字符串的基础知识 在Python中最重要的数据类型包括字符串.列表.元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础 字符串指一有序的字符序列集合,用单引号. ...
- python爬虫之Beautiful Soup基础知识+实例
python爬虫之Beautiful Soup基础知识 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库.它能通过你喜欢的转换器实现惯用的文档导航,查找,修改文档 ...
- 1 python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
- Python 插件(add-in)基础知识
1) Python插件为何物 一个插件(add-in)就是一个客户化,比如嵌入到ArcGIS应用程序中的工具条上的一系列工具,这些工具作为ArcGIS标准程序的补充可以为客户完成特殊任务. ArcG ...
- Python 爬虫(1)基础知识和简单爬虫
Python上手很容易,免费开源,跨平台不受限制,面向对象,框架和库很丰富. Python :Monty Python's Flying Circus (Python的名字来源,和蟒蛇其实无关). 通 ...
- python学习(一) 基础知识
开始学习<Python基础教程> 1.2 交互式解释器 按照书上的例子敲了个最简单的print函数,居然报错: >>> print "fsdfs"Sy ...
- python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
- Python全栈day10(基础知识练习题)
一,执行python的两种方式 1,写在脚本里面调用python执行,例如python test.py 2, 输入python在命令行交互执行,例如 python >>> pri ...
- python学习第一天 计算机基础知识
目录 什么是编程语言 什么是编程? 为什么要编程? 计算机5大组成分别有什么作用? qq启动的流程? 建议相关学习 课外 什么是编程语言 什么是编程语言? python和中文.英语一样,都是一门语言, ...
随机推荐
- 【luogu P3389 高斯消元法】 模板
题目链接: gauss消元求线性方程组的解. 这道题对于多解和无解都输出No solution #include <algorithm> #include <cstdio> # ...
- (转)HTML5之渐变
<!DOCTYPE> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta h ...
- 简单实用的.htaccess文件配置
.htaccess 文件 (Hypertext Access file) 是Apache Web服务器的一个非常强大的配置文件,对于这个文件,Apache有一堆参数可以让你配置出几乎随心所欲的功能.. ...
- mysql 复制A表 到B表;insert into select * from table
情况一: INSERT INTO tb1 (a,b,c) select a1,b1,c1, from tb2 where .... -- 案例 百度云 INSERT INTO l_biz_car_o ...
- 微信小程序流量主如何开通
2018年7月09日,微信小程序流量主全面开通,开通条件如下: 累计独立访客(UV)不低于1000 # 一共一千个人访问你的小程序就可以申请(不限时间) 有严重违规记录的小程序不予申 ...
- 浅谈Java 8的新特性和使用场景
一.default方法: 通过default方法,可以在接口(Interface interface_name)中添加实例化方法: 代码如下: public interface TestDef ...
- Vue--- VueX基础 (Vuex结构图数据流向)1.1
Vuex基础 https://vuex.vuejs.org/zh-cn state --> view --> action -> state 多组件共享状态, 之前操作方式,由父组件 ...
- flexible.js在华某为手机上使用rem时,页面宽度超出手机屏幕宽度
问题:手机端项目在华为的某款手机上显示时页面内容没有自适应手机宽度,出现横向滚动条 原因:手机获取手机屏幕宽度并计算出rem时出现偏差,明显宽余真实手机屏宽度 解决方案一:在页面里获取页面最外层dom ...
- Linux入门-第三周
1.总结vim命令行模式常见快捷方式,以及vim查找,替换的方法 vim [options] [file ..] +# 打开文件后,让光标处于第#行的行首,(默认行尾) 举例vim +10 /etc/ ...
- jQuery(三)HTML
获得内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 <html> < ...