例如,我如何在 Windows(32 位和 64 位,最高为 Windows 7)上以给定的幅度和给定的频率构成(例如,由 2 kHz 和 3 kHz 的频率组成)播放声音?
(本机我的意思是不使用外部库。)
我相信这需要waveOutWrite方法,但我不知道它是如何工作的。
第一次在这里发帖,让我们看看这是怎么回事。
我试图用 python 编写一个脚本,它会在 wav 文件的开头添加一秒钟的静音,但到目前为止没有成功。
我试图做的是在 wav 标头中读取,然后使用 wave 模块在开头添加一个 \0 ,但这并不能很好地工作。这是基于这里的代码http://andrewslotnick.com/posts/audio-delay-with-python.html
import wave
from audioop import add
def input_wave(filename,frames=10000000): #10000000 is an arbitrary large number of frames
wave_file = wave.open(filename,'rb')
params=wave_file.getparams()
audio=wave_file.readframes(frames)
wave_file.close()
return params, audio
#output to file so we can use ipython notebook's Audio widget
def output_wave(audio, params, stem, suffix):
#dynamically format the filename by passing in data
filename=stem.replace('.wav','_{}.wav'.format(suffix))
wave_file = wave.open(filename,'wb')
wave_file.setparams(params)
wave_file.writeframes(audio)
# delay the audio
def delay(audio_bytes,params,offset_ms):
"""version 1: delay after 'offset_ms' …Run Code Online (Sandbox Code Playgroud) 我正在尝试将WAV文件(PCM,48kHz,4通道,16位)转换为单通道WAV文件.
我尝试将WAV文件拆分成4个字节数组,就像这个答案一样,并创建了一个WaveMemoryStream,如下所示,但不起作用.
byte[] chan1ByteArray = new byte[channel1Buffer.Length];
Buffer.BlockCopy(channel1Buffer, 0, chan1ByteArray, 0, chan1ByteArray.Length);
WaveMemoryStream chan1 = new WaveMemoryStream(chan1ByteArray, sampleRate, (ushort)bitsPerSample, 1);
Run Code Online (Sandbox Code Playgroud)
我在创建WAVE标题时遗漏了什么?或者更多的是将WAV分成单声道WAV文件?
我一直在尝试在 Matlab 中绘制平面波动方程。我试图绘制 $(1/R)E^i(kR+wT)$ 的实部,即 $(1/R)cos(kR+wT)$。所以我在 Matlab 中使用了以下代码(对于一个瞬间,比如 t=5),
x=-5:0.1:5;
y=-5:0.1:5;
t=5;
w=1.3;
k=1.3;
[X,Y]=meshgrid(x,y);
R=(X.^2+Y.^2)^1/2;
u=20*cos(k*R+w*t);
surf(X,Y,u);
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到以下曲面图:
正如人们所期望的那样,我认为这看起来不错。但是如果我将波数和角频率因子增加到 15,我会得到以下结果:
它似乎是一种干扰模式,但我不知道为什么我会得到这个,因为我没有加入干扰效果。谁能解释这里发生了什么?
我真正想做的是绘制一个函数,用于径向向外移动的球面波(在表面上,如水面),以便在我的课堂上进行演示。我怎样才能把它变成一个动画,显示波浪从点源移出?
谢谢你的帮助
我也问过这个位置 上的音响设计论坛,但问题是沉重的计算机科学/数学所以它可能实际上属于在这个论坛:
因此,通过读取文件中的二进制文件(不幸的是,这正是我正在寻找的内容),我能够成功找到有关 WAV 文件的所有信息,但大罪函数的幅度和频率(赫兹)除外。只是为了验证我在说什么,该文件仅使用以下方程生成一个波:
F(s) = A * sin(T * s)
其中 s 是当前样本,A 是幅度,T 是周期。现在 T(周期)的方程是:
T = (2? * Hz) /(? * ?)
其中Hz是以赫兹为单位的频率,?是每秒采样数,而 ? 是频道数量。
现在我知道要解决振幅,我可以简单地找到 F(s) 的值,其中
s = (?/2)/T
因为那时正弦函数的值将是 1,最终值将等于 A。问题是要除以 T,我必须知道赫兹(或赫兹)。
有什么方法可以读取 WAV 文件以从数据中发现赫兹,假设文件只包含一个波。
我正在尝试实现 Karplus-Strong 算法。
当我播放(通过 Jupyter Notebook 使用Audio(y,rate=Fs))收集的 numpy 数组(代表吉他协奏曲)时,一切看起来都很好。
不幸的是,使用 WAVE 模块将 numpy 数组:y写入 wav 文件是不正确的(使用下一个 python 代码):
noise_output = wave.open('k-s.wav', 'w')
noise_output.setparams((1, 4, Fs, 0, 'NONE', 'not compressed'))
for i in range(0, len(y)):
value = y[i]
packed_value = struct.pack('f', value)
noise_output.writeframes(packed_value)
noise_output.close()
Run Code Online (Sandbox Code Playgroud)
y的每个元素是
<type 'numpy.float64'>
Run Code Online (Sandbox Code Playgroud)
我应该如何修改写入循环才能正确写入WAV文件?
有关该问题的更多信息。在写入 WAV 之前,y 数组的第一个元素是:
[ 0.33659756 0.33659756 -0.43915295 -0.87036152 1.40708988 0.32123558
-0.6889402 1.9739982 -1.29587159 -0.12299964 2.18381762 0.82228042
0.24593503 -1.28067426 -0.67568838 -0.01843234 -1.830472 1.2729578
-0.56575346 0.55410736]
Run Code Online (Sandbox Code Playgroud)
将元素写入 WAV 文件后,关闭 WAV …
我在python中使用wave库试图将音频速度降低50%.我成功了,但只有在正确的渠道.在左声道中,它是一大堆静态的.
import wave,os,math
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\aha.wav","r")
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\ahaout.wav","w")
frames=r.readframes(r.getnframes())
newframes=bytearray()
w.setparams(r.getparams())
for i in range(0,len(frames)-1):
newframes.append(frames[i])
newframes.append(frames[i])
w.writeframesraw(newframes)
Run Code Online (Sandbox Code Playgroud)
为什么是这样?既然我只是复制和粘贴原始数据,我肯定无法生成静态?编辑:我一直在寻找年龄,我终于找到了一个有用的波形格式资源:http://soundfile.sapp.org/doc/WaveFormat/ 如果我想保留立体声,看起来我需要复制实际样本宽度为4倍.这是因为有两个通道,它们占用4个字节而不是2个.
`import wave
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\aha.wav","r")
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\ahaout.wav","w")
frames=r.readframes(r.getnframes())
newframes=bytearray()
w.setparams(r.getparams())
w.setframerate(r.getframerate())
print(r.getsampwidth())
for i in range(0,len(frames)-4,4):
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i+2])
newframes.append(frames[i+3])
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i+2])
newframes.append(frames[i+3])
w.writeframesraw(newframes)`
Run Code Online (Sandbox Code Playgroud)
编辑2:好吧我不知道是什么驱使我这样做但我已经享受它给我的自由了.我选择将wav文件复制到内存中,直接编辑副本,然后将其写入输出文件.我对结果非常满意.我可以导入一个wav,重复一次音频,并将其写入输出文件,仅需0.2秒.使用wav插件,使用我的旧代码将速度降低一半现在只需要9秒而不是30秒以上这里是代码,仍然有点未优化我想但它比它更好.
import struct
import time as t
t.clock()
r=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing
software/main/aha.wav","rb")
w=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing
software/main/output.wav","wb")
rbuff=bytearray(r.read())
def replacebytes(array,bites,stop):
length=len(bites)
start=stop-length
for …Run Code Online (Sandbox Code Playgroud) 我正在使用 Python 从我的笔记本电脑流式传输麦克风输入。我目前正在使用 PyAudio 和 .wav 创建 2 秒批次(代码如下),然后在循环中读出新创建的 .wav 文件的帧表示。
不过,我真的只想np.ndarray在代码中用“信号”表示,即 .wav 文件的 Int16 表示形式。有没有办法完全绕过写入 .wav 并使我的应用程序看起来是“实时”而不是微批处理?
import pyaudio
import wave
#AUDIO INPUT
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 2
WAVE_OUTPUT_FILENAME = "output.wav"
audio = pyaudio.PyAudio()
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
while(1):
print "recording"
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb') …Run Code Online (Sandbox Code Playgroud) 我有一个二进制格式的 .wav 文件列表(它们来自 websocket),我想将其加入单个二进制 .wav 文件中,然后用它进行语音识别。我已经能够使用以下代码使其工作:
audio = [binary_wav1, binary_wav2,..., binary_wavN] # a list of .wav binary files coming from a socket
audio = [io.BytesIO(x) for x in audio]
# Join wav files
with wave.open('/tmp/input.wav', 'wb') as temp_input:
params_set = False
for audio_file in audio:
with wave.open(audio_file, 'rb') as w:
if not params_set:
temp_input.setparams(w.getparams())
params_set = True
temp_input.writeframes(w.readframes(w.getnframes()))
# Do speech recognition
binary_audio = open('/tmp/input.wav', 'rb').read())
ASR(binary_audio)
Run Code Online (Sandbox Code Playgroud)
问题是我不想将文件写入'/tmp/input.wav'磁盘。有没有办法在不向磁盘写入任何文件的情况下做到这一点?
谢谢。
我正在尝试将数据附加到声音文件而不加载其内容(因为它可能有千兆字节的数据),我目前正在使用 pysoundfile 库,我已经找到了一种方法来为 wave64 做到这一点,但是在 wav 中,由于某种原因它抛出一个错误。
根据 pysoundfile 文档,当使用文件描述符打开 SoundFile 时,它应该在不截断的情况下写入,所以这就是我当前正在做的事情
fd = open('foo.wav',mode='ab')
with sf.SoundFile(fd, mode = 'w', samplerate = self._samplerate,channels = self._channels, format = 'wav') as wfile:
wfile.seek(0,sf.SEEK_END)
wfile.write(self._samples)
wfile.close()
fd.close()
Run Code Online (Sandbox Code Playgroud)
当我使用 Wave 文件类型时,出现以下错误:
RuntimeError: Error opening <_io.BufferedWriter name='../datasets/emddf_clean/qcoisa.wav'>: Unspecified internal error.
Run Code Online (Sandbox Code Playgroud)
但是对于 w64 格式的文件来说,它可以以某种方式工作...如果有人可以阐明我,那将是惊人的,提前致谢!