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 波形声音文件的更多相关文章

  1. MmSystem播放Wav格式声音

    //MmSystem播放Wav格式声音 //MmSystem 支持 *.wav声音格式 snd ->SoundRecorderuses MmSystem; //引用MmSystem//播放系统声 ...

  2. 解析WAV音频文件----》生成WAV音频文件头

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i WAV音频文件介绍: WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统 ...

  3. Python中生成(写入数据到)Excel文件

      转自http://www.crifan.com/export_data_to_excel_file_in_python/ 在Python中,如何将数据,导出为Excel,即把数据写入到新生成的ex ...

  4. myeclipse(2015)中创建简单的Maven项目的步骤(用于生成可执行jar文件)------》myeclipse2015

    利用MyEclipse的引导,可以很方便的创建简单的.用于生成可执行jar文件的Maven项目: 1.New -> Project... 选择 Maven Project, 点击Next > ...

  5. python使用简单http协议来传送文件

    python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServ ...

  6. 从用python自动生成.h的头文件集合和类声明集合到用python读写文件

    最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...

  7. 利用Python 脚本生成 .h5 文件 代码

    利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...

  8. pcm数据生成wav文件

    Qt由pcm数据生成wav文件 void AudioGrabber::saveWave(const QString &fileName, const QByteArray &raw, ...

  9. 图文介绍MyEclipse (2015) 中创建简单的Maven项目的步骤(用于生成可运行jar文件)

    利用MyEclipse的引导,能够非常方便的创建简单的.用于生成可运行jar文件的Maven项目: (原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/cl ...

随机推荐

  1. 经典定长指令-修改EIP

    1.0x70~0x7F EIP无法像通用寄存器那样用mov来修改,只能通过类似于jz,JNB,JNE JBE,call等的跳转指令来进行修改 条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节. ...

  2. 【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布

    本期是Istio技术实践专题的最后一个模块,主题是Istio的路由控制与灰度发布.上一期我们讲到,虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Isti ...

  3. UML 有关类图知识及类间关系

    原文链接:https://blog.csdn.net/mj_ww/article/details/53020346 1. 类的含义 类图(Class diagram)显示了系统的静态结构,而系统的静态 ...

  4. 【测试数据】android下CPU核与线程数的关系

    测试方法 24MB的一张4K图片,连续计算5次直方图. 小米mix2s, 高通骁龙 845.4大核,4小核. 数据表格 线程数 绝对时间(s) 累计CPU时间(s) 每线程平均耗时(us) 每线程最大 ...

  5. java-异常-原理异常对象的抛出throw

    1 class Demo { 2 public static int method(int[] arr,int index) { 3 4 // System.out.println(arr[index ...

  6. python内置re模块全面实战

    目录 一:取消转义 二:python内置模块之re模块 三:常用方法 findall search match 简便 四:常用方法 finditer 匹配文件多情况 五:切割 替换 内置模块 六:分组 ...

  7. 前缀函数与Z函数介绍

    字符串算法果然玄学=_= 参考资料: OI Wiki:前缀函数与KMP算法 OI Wiki:Z函数(扩展KMP) 0. 约定 字符串的下标从 \(0\) 开始.\(|s|\) 表示字符串 \(s\) ...

  8. Linux 配置常用工具?

    常用的软件在linux上进行配置: 修改HOSTANME vi /etc/sysconfig/network 修改HOSTNAME和IP的映射 vi /etc/hosts 关闭防火墙 service ...

  9. C++读写图片文件

    1.C方式 string sourcefilename = "D:\\Logo.jpg"; string destfilename="D:\\Logo1.jpg" ...

  10. markdown介绍和使用(超全建议收藏)

    Markdown介绍 Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了.Markdown编辑器使用一套格式标记 ...