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. Linux上天之路(十五)之文件查找

    主要内容 精确查找 模糊查找 1. 精确查找 find - search for files in a directory hierarchy 递归地在层次目录中处理文件 查找方式: 按文件属性查找 ...

  2. Go语言实战爬虫项目

    Go语言爬虫框架之Colly和Goquery Python爬虫框架比较多有requests.urllib, pyquery,scrapy等,解析库有BeautifulSoup.pyquery.Scra ...

  3. 记一次异步处理导致Jetty Request对象泄漏

    最近排查一个bug,发现了一系列有意思的东西,对「自定义线程池」.「Jetty线程模型」都有了一些新的认识. 本文预计阅读时间10分钟,包括: 问题表现 常见原因筛查 根因与源码分析 最佳实践 一些小 ...

  4. 读《疯狂Java讲义》笔记总结二

    1.变量分类图 2.通过实例访问静态变量(类变量) 3.静态导入 4.构造器 5.创建对象内存过程

  5. VirtualBox 安装 Ubuntu 20.04 全流程

    VirtualBox 安装 Ubuntu 20.04 全流程 内容概要 这个作业属于哪个课程 2022面向对象程序设计 这个作业要求在哪里 2022面向对象程序设计寒假作业1 这个作业的目标 在虚拟机 ...

  6. 《剑指offer》面试题28. 对称的二叉树

    问题描述 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的.     1    / \   2   ...

  7. 从容器镜像的选择-alpine 说起

    在 容器崛起之前,Alpine 还是个无名之辈,可能是因为大家并不是很关心操作系统本身的大小,毕竟大家只关心业务数据和文档,程序.库文件和系统本身的大小通常可以忽略不计. 容器技术席卷整个软件产业之后 ...

  8. 什么是Listener监听器

    什么是Listener监听器 1,Listener 监听器它是JavaWeb的三大组件之一.JavaWeb的三大组件:Servlet程序,Filter过滤器,Listener监听器. 2,Listen ...

  9. Qt中添加静态库.lb,.a和动态库.dll,.so,头文件和.cpp文件

    添加步骤 1.-Qt Creator中,"项目"------"添加库"2.把静态库和动态库文件放到项目文件夹中3.在.pro文件中会添加如下代码: - 添加动态 ...

  10. python -m详解

    温馨提示: 本篇演示环境是Python 3.8 先python --help看下python -m参数的解释: -m mod : run library module as a script (ter ...