我有一个名为"file.wav"的wav文件,我想用C程序读取该文件的一些规范.我在这里找到了wav文件的结构.根据这个文档,在普通的wav文件中,AudioFormat字节应该是0x1和0x0,或者NumChannels字节应该是(如果是单声道)0x1和0x0; 有很多类似的部分应该看起来像这些.
现在,我的C程序非常简单:我以二进制模式打开文件,我寻找AudioFormat部分(第20个字节),我读取两个字节,然后将它们放入缓冲区; 然后我打印到stdin缓冲区内容.
#include <stdio.h>
main()
{
void *buf[2];
FILE *f;
f=fopen("file.wav", "rb");
fseek(f, 20, SEEK_SET);
fread(buf, 1, 2, f);
printf("example: %#hx %#hx\n", buf[0], buf[1]);
/*the '#' flag stands for the 0x[···] format output,
the 'h' says that the number is a short integer (2 bytes).*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是第二个字节而不是0x0总是0x4e0,这对于每个应该为0的字节(例如对于NumChannels或BitPerSamples字节也是如此).问题是什么?
可能重复:
比较两个音频文件的波形
我找到了一个PHP函数,它从wav文件生成波形,我修改了它,现在它符合我的需要,它运行良好.
波形对于每个wav文件似乎都是如此独特,所以也许可以使用它们的波形比较两个音频文件,看看b.wav与a.wav有多接近?这根本不是一个好主意吗?
我写了一些php函数来逐个像素地比较两个波形(JPG).经过一些测试我得到以下结果:对于两个不同的音频文件,平均差异是〜97%的结果如预期,但我不知道它将如何在实际代码中工作.
有人可以就这个想法发表意见,也许还有一些有用的提示:)
我想比较两个音频文件,看看b.wav与a.wav有多接近.
PS:我的wav文件几乎相同,唯一的区别就是声音.
1)JavaFX是否支持.wav格式?(不清楚Oracle的页面)
2)如果不是,为什么呢?
Swing是AWT和JavaFX for Swing的重新放置,我们也说它很容易.wav在Java中播放文件格式,那么为什么 Media和MediaPlayerJavaFX类不支持.wav格式呢?任何问题?
当我尝试播放.wav文件时,它会给我错误
更新2:
SSCCE:
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Platform;
import javafx.beans.value.*;
import javafx.embed.swing.JFXPanel;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.media.*;
import javafx.util.Duration;
import javax.swing.*;
/** Example of playing all mp3 audio files in a given directory
* using a JavaFX MediaView launched from Swing
*/
public class NewFXMain {
private static void initAndShowGUI() {
// …Run Code Online (Sandbox Code Playgroud) 有谁知道如何获得AMR文件的持续时间?真诚地,我不知道很多关于AMR编码的事情.
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Run Code Online (Sandbox Code Playgroud)
我希望在录制停止后获取文件的持续时间而不创建任何MediaPlayer并从中获取持续时间.对于常规的Wav文件,我只需这样做:
fileLength / byteRate
Run Code Online (Sandbox Code Playgroud)
但是对于AMR,我不知道byteRate,我不确定这是否可以,因为WAV是原始PCM数据(未压缩)并且AMR被压缩.
好的,因此我正在尝试制作一个可处理.wav文件的程序,并且已经看到了此问题/答案,但是我不确定是标题中的每个数据指的是什么。例如,“块”指的是什么?那是特定数量的位/字节吗?
如果有人能至少以本问题中使用的格式告诉我,除了常量String Literals和“数据”数组之外,每个引用到.wav的数据是什么?特别是,我特别想知道什么是“块”,以及所有通道的采样率,字节率,每个采样的字节和每个采样的字节有何关系?(我怀疑字节速率是采样率*每个采样的字节,但是“针对所有渠道”呢?)
任何帮助表示赞赏。
我使用 AudioRecord 类录制了声音。但它无法通过音乐播放器播放。所以我在音频文件中添加了一些标题信息。虽然它现在可以通过音乐播放器播放,但它滞后且嘈杂,并且无法播放准确的声音。任何帮助,将不胜感激 。我的代码如下
private void rawToWave(final File rawFile, final File waveFile) throws IOException {
byte[] rawData = new byte[(int) rawFile.length()];
DataInputStream input = null;
try {
input = new DataInputStream(new FileInputStream(rawFile));
input.read(rawData);
} finally {
if (input != null) {
input.close();
}
}
DataOutputStream output = null;
try {
int myBitsPerSample= 2;
int myFormat = 1;
long myChannels = 1;
long mySampleRate = 8000 ;
long myByteRate = mySampleRate * myChannels * myBitsPerSample/8;
int myBlockAlign = (int) (myChannels * …Run Code Online (Sandbox Code Playgroud) 嗨,我有这个代码,假设将 csv 文件转换为 wav 文件。它创建了一个 wav 文件,但我们什么也没听到。如果我在 csv 文件中放入 10 行,它会生成一个大约 1 分钟的 wav 文件!所以根本不成正比。
我的 csv 看起来像:
0.000785,0.30886552
0.00157,0.587527526
0.002355,0.808736061
0.00314,0.950859461
0.003925,0.999999683
0.00471,0.951351376
0.005495,0.809671788
0.00628,0.588815562
0.007065,0.31037991
0.00785,0.001592653
0.008635,-0.307350347
0.00942,-0.586237999
0.010205,-0.807798281
0.01099,-0.950365133
0.011775,-0.999997146
0.01256,-0.951840879
0.013345,-0.810605462
0.01413,-0.590102105
0.014915,-0.311893512
0.0157,-0.003185302
0.016485,0.305834394
0.01727,0.584946986
0.018055,0.806858453
0.01884,0.949868395
0.019625,0.999992073
0.02041,0.952327967
0.021195,0.81153708
0.02198,0.591387151
0.022765,0.313406323
Run Code Online (Sandbox Code Playgroud)
和这里的代码:
#!/usr/bin/python
import wave
import numpy
import struct
import sys
import csv
import resampy
def write_wav(data, filename, framerate, amplitude):
wavfile = wave.open(filename, "w")
nchannels = 1
sampwidth = 2
framerate = framerate
nframes …Run Code Online (Sandbox Code Playgroud) 我想将Facebook Messenger的录音转换为文本.以下是使用Facebook的API发送.mp4文件的示例:https://cdn.fbsbx.com/v/t59.3654-21/15720510_10211855778255994_5430581267814940672_n.mp4/audioclip-1484407992000-3392.mp4?oh=a78286aa96c9dea29e5d07854194801c&oe =587C3833
所以这个文件只包含音频(不是视频),我想将其转换为文本.
此外,我想尽快做到这一点,因为我将在几乎实时的应用程序中使用生成的文本(即用户发送.mp4文件,脚本将其转换为文本并显示回来).
我找到了这个例子https://github.com/Uberi/speech_recognition/blob/master/examples/audio_transcribe.py ,这里是我使用的代码:
import requests
import speech_recognition as sr
url = 'https://cdn.fbsbx.com/v/t59.3654-21/15720510_10211855778255994_5430581267814940672_n.mp4/audioclip-1484407992000-3392.mp4?oh=a78286aa96c9dea29e5d07854194801c&oe=587C3833'
r = requests.get(url)
with open("test.mp4", "wb") as handle:
for data in r.iter_content():
handle.write(data)
r = sr.Recognizer()
with sr.AudioFile('test.mp4') as source:
audio = r.record(source)
command = r.recognize_google(audio)
print command
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Asterios\Anaconda2\lib\site-packages\speech_recognition\__init__.py", line 200, in __enter__
self.audio_reader = aifc.open(aiff_file, "rb")
File "C:\Users\Asterios\Anaconda2\lib\aifc.py", line 952, in open
return Aifc_read(f)
File "C:\Users\Asterios\Anaconda2\lib\aifc.py", line …Run Code Online (Sandbox Code Playgroud) public TargetDataLine targetDataLine;
private static AudioFormat getAudioFormat()
{
return new AudioFormat(16000, 16, 2, true, false);
}
AudioFormat a = getAudioFormat();
DataLine.Info info = new DataLine.Info(TargetDataLine.class, a);
targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(a);
targetDataLine.start();
AudioInputStream ais = new AudioInputStream(targetDataLine);
AudioSystem.write(ais, AudioFileFormat.Type.WAVE, new File("record.wav"));
Run Code Online (Sandbox Code Playgroud)
我正在训练一个名为 DeWave ( https://github.com/chaodengusc/DeWave )的 Python 音频源分离模型包。它在单通道 .wav 文件上进行了训练。训练模型后,我对 .wav 样本进行了推理(以分离单声道音频测试文件中的两个扬声器源)。这工作正常,除非我剪切 .wav 文件,在这种情况下,我从 librosa 收到一个错误,指出音频缓冲区在任何地方都不是有限的。
我尝试对不同的音频文件进行推理,只有在使用外部软件剪切 .wav 文件时才会出现错误(我尝试使用 sox 和 Zamzar 进行剪切)。我成功推断的音频文件具有所有不同的长度,并且不是给定长度的倍数,所以我不认为这是长度问题。我想知道文件切割是否会擦除缓冲区,但我一般不熟悉缓冲区,因此对于如何解决此问题的任何见解都将不胜感激。
用 librosa 编写的主要代码是来自https://github.com/chaodengusc/DeWave/blob/master/DeWave/infer.py 的这些行
## restore the original audio
len1 = len(out_audio1) // 3
len2 = len(out_audio2) // 3
source1 = out_audio1[len1:2*len1]
source2 = out_audio2[len2:2*len2]
librosa.output.write_wav(input_file[0:-4]+"_source1.wav", source1, SAMPLING_RATE)
librosa.output.write_wav(input_file[0:-4]+"_source2.wav", source2, SAMPLING_RATE)
return [(source1, SAMPLING_RATE), (source2, SAMPLING_RATE)]
Run Code Online (Sandbox Code Playgroud)
预期的输出将是两个长度相同的独立 .wav 文件,每个文件中有一个扬声器,另一个扬声器正在说话时静音。但是,我收到此错误:
Traceback (most recent call last):
File "/home/<me>/anaconda3/bin/dewave-infer", line 11, in <module>
sys.exit(infer())
File "/home/<me>/anaconda3/lib/python3.6/site-packages/DeWave/cmdinfer.py", line …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Uint8* 制作 Uint8 向量,但由于某些原因某些值不相同。这是我的代码。
std::vector<Uint8> wav_vector = {};
Uint8* wav_buffer_;
for (unsigned int i = 0; i < wav_length_; i++) {
wav_vector.push_back(wav_buffer_[i]);
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试验证这些值:
for (unsigned int i = 0; i < wav_length_; i++){
if (wav_buffer_[i]!=wav_vector[i]){
cout<<i<<endl;
printf("Orignal Buffer %u\n", wav_buffer_[i]);
printf("Vector Buffer %u\n", wav_vector[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我的示例输出:
Index: 0
Orignal Buffer 208
Vector Buffer 40
Index: 1
Orignal Buffer 72
Vector Buffer 3
Index: 2
Orignal Buffer 111
Vector Buffer 183
Index: 3
Orignal Buffer 1
Vector Buffer …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建代码以将wav文件放入数组列表,然后让arraylist播放文件.为什么这段代码不起作用?谢谢.
public class trackList {
public void tracklist(){
ArrayList<String> songs = new ArrayList();
songs.add("c:\\01.wav");
songs.add("c:\\02.wav");
byte[] buffer = new byte[4096];
for(int x = 0; x < songs.size(); x++){
try{
AudioInputStream ais = AudioSystem.getAudioInputStream(songs(x));
AudioFormat format = ais.getFormat();
SourceDataLine line = AudioSystem.getSourceDataLine(format);
line.open(format);
line.start();
while (ais.available() > 0) {
int len = ais.read(buffer);
line.write(buffer, 0, len);
}
line.drain();
line.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)