用 Python 简单生成 WAV 波形声音文件
Python 简单生成 WAV 波形声音文件
让机器发出声响,本身就是一件充满魔法的事情。有没有想过,用一段简单的代码,生成一个最简单的声音呢?
Python 这门脚本语言的库十分丰富,借助于其中的三个内置模块就能完成这件神奇的事情:
math 模块提供了圆周率常量 pi 和正弦函数 sin, 这些使得我们无需掌握高等数学就可以完成今天的任务;
wave 模块提供了读取和写入波形文件数据的功能,使得我们无需操心 wave 文件的技术细节,就可以把波形数据写入到其中;
struct 可以将数据打包成二进制数据,这方便了我们可以把计算到的数据封装成二进制数据写入 wave 文件
此外,我们还需要对声音的本质以及三角函数有一定的认识。
下面是我拙劣的代码,希望大佬们勿喷。
"""产生正弦波形的音频文件。"""
from ast import Str
import math
import struct
import wave
def sinewave(limit: int, a: int, omega: float):
"""正弦波样本生成器。
limit 指定生成的总样本数
a 指定振幅大小
omega 指定角转速
"""
for n in range(limit):
yield int(a*math.sin(omega*n))
def generateSineWaveFile(file: Str, sampleRate: int, frequency: int, duration: float):
"""生成一个特定正弦波的音频文件。
file 指定文件名
sampleRate 指定采样频率(单位:赫兹)
frequency 指定频率(单位: 赫兹)
duration 指定时常(单位:秒)
"""
# 振幅。
amplitude = 10000
# 每周期样本数。
samplesPerCycle = sampleRate // frequency
# 总样本数。
totalSamples = int(duration*sampleRate)
# 使最后一次的样本值与第一次样本值相同,都为 0,因此需要保证 totalSamples 是 samplesPerCycle 的倍数 + 1。
if rem := totalSamples % samplesPerCycle:
totalSamples = totalSamples+(samplesPerCycle - rem)
totalSamples = totalSamples+1
# 创建波形文件并循环写入采样数据。
with wave.open(file, 'wb') as wf:
# 设置为单声道。
wf.setnchannels(1)
# 设置采样量化位数为双字节16位。
wf.setsampwidth(2)
# 设置采样率。
wf.setframerate(sampleRate)
# 样本间隔角旋转量。
omega = 2*math.pi/(sampleRate/frequency)
# 遍历每一个采样点。
for s in sinewave(totalSamples, amplitude, omega):
# 将采样数据打包成字节数据写入波形文件。
data = struct.pack('<h', int(s))
wf.writeframes(data)
# 以脚本运行时根据用户提示生成一个示例文件。
if __name__ == "__main__":
print('简易波形生成器')
filename = input('请输入用于保存波形的文件名: ')
frequency = int(input('正弦波的声音频率(单位:赫兹):'))
duration = float(input('持续时间()单位:秒: '))
generateSineWaveFile(filename, 48000, frequency, duration)
用 Python 简单生成 WAV 波形声音文件的更多相关文章
- MmSystem播放Wav格式声音
//MmSystem播放Wav格式声音 //MmSystem 支持 *.wav声音格式 snd ->SoundRecorderuses MmSystem; //引用MmSystem//播放系统声 ...
- 解析WAV音频文件----》生成WAV音频文件头
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i WAV音频文件介绍: WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统 ...
- Python中生成(写入数据到)Excel文件
转自http://www.crifan.com/export_data_to_excel_file_in_python/ 在Python中,如何将数据,导出为Excel,即把数据写入到新生成的ex ...
- myeclipse(2015)中创建简单的Maven项目的步骤(用于生成可执行jar文件)------》myeclipse2015
利用MyEclipse的引导,可以很方便的创建简单的.用于生成可执行jar文件的Maven项目: 1.New -> Project... 选择 Maven Project, 点击Next > ...
- python使用简单http协议来传送文件
python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServ ...
- 从用python自动生成.h的头文件集合和类声明集合到用python读写文件
最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...
- 利用Python 脚本生成 .h5 文件 代码
利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...
- pcm数据生成wav文件
Qt由pcm数据生成wav文件 void AudioGrabber::saveWave(const QString &fileName, const QByteArray &raw, ...
- 图文介绍MyEclipse (2015) 中创建简单的Maven项目的步骤(用于生成可运行jar文件)
利用MyEclipse的引导,能够非常方便的创建简单的.用于生成可运行jar文件的Maven项目: (原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/cl ...
随机推荐
- git 那些事儿 —— 基于 Learn Git Branching
前言 推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观.本文可以看作是它的文字版 ...
- c++智能指针的使用,shared_ptr,unique_ptr,weak_ptr
c++智能指针的使用 官方参考 普通指针的烦恼:内存泄漏,多次释放,提前释放 智能指针 负责自动释放所指向的对象. 三种智能指针 shared_ptr,unique_ptr,weak_ptr: 将sh ...
- 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?
1. XSS(Cross Site Script,跨站脚本攻击) 是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式. 1.1跨站脚本攻击分有两种形式: 反射型攻击(诱使用户点 ...
- 实习之bii--源码安装bind9
刚学习linux时安装过fctix小企鹅输入法,那个比这个安装还要复杂,不过在这里也写一写,还是用的./configure make makeinstall这套命令.不像fctix有些高版本开始用cm ...
- 常见Web服务器
常见Web服务器
- 使用内联的 CSS 变量技巧,提高灵巧布局效率!
作者:Ahmad shaded 译者:前端小智 来源:sitepoint 点赞再看,微信搜索**[大迁世界]**关注这个没有大厂背景,但有着一股向上积极心态人.本文 GitHub github.com ...
- 通过kubeadm工具部署k8s集群
1.概述 kubeadm是一工具箱,通过kubeadm工具,可以快速的创建一个最小的.可用的,并且符合最佳实践的k8s集群. 本文档介绍如何通过kubeadm工具快速部署一个k8s集群. 2.主机规划 ...
- python24day
内容回顾 命名空间 组合 一个类的对象是另一个类对象的属性 两个类之间有 什么有什么二点关系:例:班级有学生 学生和课程.圆形和圆环.班级和课程 计算器 from functools import r ...
- 学习Java第15天
今天所做的工作: 学习了HTML的基本标签,vs code的基本使用 明天工作安排: 继续学习html 目前所遇到的大都是HTML标签数量多,较复杂的问题,继续找规律记忆吧.
- FastDFS文件同步
FastDFS同步相关文件: a)10.100.66.82_23000.mark 内容如下: binlog_index=0 binlog_offset=1334 need_sync_old=1 syn ...