用 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 ...
随机推荐
- Linux上天之路(十五)之文件查找
主要内容 精确查找 模糊查找 1. 精确查找 find - search for files in a directory hierarchy 递归地在层次目录中处理文件 查找方式: 按文件属性查找 ...
- Go语言实战爬虫项目
Go语言爬虫框架之Colly和Goquery Python爬虫框架比较多有requests.urllib, pyquery,scrapy等,解析库有BeautifulSoup.pyquery.Scra ...
- 记一次异步处理导致Jetty Request对象泄漏
最近排查一个bug,发现了一系列有意思的东西,对「自定义线程池」.「Jetty线程模型」都有了一些新的认识. 本文预计阅读时间10分钟,包括: 问题表现 常见原因筛查 根因与源码分析 最佳实践 一些小 ...
- 读《疯狂Java讲义》笔记总结二
1.变量分类图 2.通过实例访问静态变量(类变量) 3.静态导入 4.构造器 5.创建对象内存过程
- VirtualBox 安装 Ubuntu 20.04 全流程
VirtualBox 安装 Ubuntu 20.04 全流程 内容概要 这个作业属于哪个课程 2022面向对象程序设计 这个作业要求在哪里 2022面向对象程序设计寒假作业1 这个作业的目标 在虚拟机 ...
- 《剑指offer》面试题28. 对称的二叉树
问题描述 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 ...
- 从容器镜像的选择-alpine 说起
在 容器崛起之前,Alpine 还是个无名之辈,可能是因为大家并不是很关心操作系统本身的大小,毕竟大家只关心业务数据和文档,程序.库文件和系统本身的大小通常可以忽略不计. 容器技术席卷整个软件产业之后 ...
- 什么是Listener监听器
什么是Listener监听器 1,Listener 监听器它是JavaWeb的三大组件之一.JavaWeb的三大组件:Servlet程序,Filter过滤器,Listener监听器. 2,Listen ...
- Qt中添加静态库.lb,.a和动态库.dll,.so,头文件和.cpp文件
添加步骤 1.-Qt Creator中,"项目"------"添加库"2.把静态库和动态库文件放到项目文件夹中3.在.pro文件中会添加如下代码: - 添加动态 ...
- python -m详解
温馨提示: 本篇演示环境是Python 3.8 先python --help看下python -m参数的解释: -m mod : run library module as a script (ter ...