天道酬勤,学无止境

没有第三方库的 Java 重采样 .wav 声音文件(Java resample .wav soundfile without third party library)

问题

是否可以在不使用任何第三方库的情况下在 java 中将.wav文件从 22050 khz 重新采样到 44100 khz?

也许使用AudioInputStream

编辑:因为似乎没有第三方库就不容易,所以存在哪些第三方库来完成重采样?

回答1

由于您现在接受第三方库,这是我的建议

有很多第三方库可以让你重新采样音频 wav 文件,对我来说,就我而言(我最近使用过),最用户友好的第三方库是 Jave,你需要做的就是包含 jar . 不再像其他库那样繁琐的安装

Jave 有一个名为的方法

public void setSamplingRate(java.lang.Integer bitRate)

这允许您使用给定的比特率重新采样音频。

回答2

它可能,快速和肮脏。 只需要在 javax.sound API 中进行一些挖掘:

import java.io.File;

import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import com.sun.media.sound.WaveFileReader;
import com.sun.media.sound.WaveFileWriter;

public class Resample {

public static void main(String[] argv) {
    try {
        File wavFile = new File("C:\\Temp\\test.wav");
        File dstFile = new File("C:\\Temp\\test_half.wav");
        WaveFileReader reader = new WaveFileReader();
        AudioInputStream audioIn = reader.getAudioInputStream(wavFile);
        AudioFormat srcFormat = audioIn.getFormat();

        AudioFormat dstFormat = new AudioFormat(srcFormat.getEncoding(),
                srcFormat.getSampleRate() / 2,
                srcFormat.getSampleSizeInBits(),
                srcFormat.getChannels(),
                srcFormat.getFrameSize(),
                srcFormat.getFrameRate() / 2,
                srcFormat.isBigEndian());

        AudioInputStream convertedIn = AudioSystem.getAudioInputStream(dstFormat, audioIn);

        WaveFileWriter writer = new WaveFileWriter();
        writer.write(convertedIn, Type.WAVE, dstFile);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

}

这个简短的黑客示例将创建一个副本,其中源中指定的文件的采样率减半。 我认为它非常不言自明。

回答3

无论您是否希望提高音频质量,无论哪种方式,您都需要使用原始文件的样本创建一个新的 .wav 文件。 如果要保持原始文件的质量,可以将每个样本写入两次。

然而,有一个相当简单的算法可以“提高”质量:读取三个连续的样本,我们现在将它们命名为 a、b 和 c。 令 z 为 a 和 b 之间的额外输出样本。

令 z=(a+b)/2。 现在将 b 替换为 (a + 2b + c)/4。 请记住使用 b 的旧值计算 z! 现在只将 a、z 和新的 b 写入输出。

再读一个样本,我们称它为 d。 使用 (b+c)/2 计算下一个额外的输出样本 y。 使用 b 的旧值。 重新计算 c,使其等于 (b + 2c + d)/4。 将 b 的新值和 y 写入输出。

您可以在 !EOF 中找出猜测、阅读和重复。 请记住使用旧值进行计算,但要输出新值。

回答4

不...您可以尝试编写新的 wav 文件,其中的新样本计算为相邻样本的平均值。 粗略,但也许它足以满足您的目的。

如果您接受第三方库,JSSRC 似乎是一个不错的选择。 但是,您需要自己构建 .jar。

回答5

是的,使用 AudioInputstream 有效。 您可以在此处捕获一些示例代码:

http://www.jsresources.org/examples/SampleRateConverter.html

不用担心 Tritonius,该信息不再与 Java 的较新版本相关。 只要您坚持使用 *.wav 文件,您就可以使用本机 Java 重新采样,而无需任何第三方库。

此外,此常见问题解答回答了 Java 中大多数与音频相关的问题。 它可能不是最新的,但大多数信息仍然是相关的。

http://www.jsresources.org/faq.html

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 下采样WAV音频文件(Downsampling wav audio file)
    问题 我必须将wav文件从44100Hz下采样到16000Hz,而无需使用任何外部Python库,因此最好是wave和/或audioop 。 我尝试通过使用setframerate函数将wav文件的帧速率更改为16000,但这只会减慢整个记录的速度。 如何将音频文件降采样为16kHz,并保持相同的音频长度? 回答1 您可以使用Librosa的load()函数, import librosa y, s = librosa.load('test.wav', sr=8000) # Downsample 44.1kHz to 8kHz 安装Librosa的额外工作可能值得您放心。 专家提示:在Anaconda上安装Librosa时,还需要安装ffmpeg,因此 pip install librosa conda install -c conda-forge ffmpeg 这样可以为您节省NoBackendError()错误。 回答2 要对信号进行降采样(也称为抽取)(意味着降低采样率),或者对信号进行升采样(提高采样率),则需要在数据之间进行插值。 这个想法是,您需要以某种方式在各点之间绘制一条曲线,然后以新的采样率从该曲线中获取值。 这是因为您想知道在未采样的某个时间的声波值,因此您必须以一种或另一种方式猜测该值。 唯一容易采样的情况是将采样率除以整数$ k $。 在这种情况下
  • 如何重新采样 wav 文件(How can I resample wav file)
    问题 目前我正在录制具有以下规格的音频信号: 频道:1 每秒采样数:8000 每样本位数:16 如何将此 .wav 文件转换为例如以下规范(首选纯 c#): 频道:1 每秒采样数:22050 每样本位数:16 回答1 用于重新采样音频的 Windows API(其中之一)是 Audio Resampler DSP。 这个转换类非常简单地设置输入和输出类型,然后推送输入数据和拉出输出。 您可能还需要处理的另一项任务是从文件中读取并写入新文件(尽管您没有在原始描述中指定它是否确实需要)。 您可能还想使用 NAudio 等第三方库。 也可以看看: C# 将音频从 8khz 重新采样到 44.1/48khz C#中的音频DSP 回答2 试试 Naudio - 它是一个免费的开源 .NET 库,提供了多种功能,包括重新采样 AFAIK 的能力。 根据要求重新采样的样本源 回答3 用于重采样的 AS3 功能。 您可以轻松更改将此代码转换为 C#: private function resampling(fromSampleRate:int, toSampleRate:int, quality:int = 10):void { var samples:Vector.<Number> = new Vector.<Number>; var srcLength:uint = this._samples
  • 重新采样一个numpy数组(Resample a numpy array)
    问题 对数组进行重新采样很容易 a = numpy.array([1,2,3,4,5,6,7,8,9,10]) 具有整数重采样因子。 例如,因数2: b = a[::2] # [1 3 5 7 9] 但是,由于使用了非整数重采样因子,因此操作起来并不容易: c = a[::1.5] # [1 2 3 4 5 6 7 8 9 10] => not what is needed... 应为(使用线性插值): [1 2.5 4 5.5 7 8.5 10] 或(通过获取数组中最近的邻居) [1 3 4 6 7 9 10] 如何使用非整数重采样因子对numpy数组进行重采样? 应用示例:音频信号重采样/重音调 回答1 NumPy具有numpy.interp,它可以进行线性插值: In [1]: numpy.interp(np.arange(0, len(a), 1.5), np.arange(0, len(a)), a) Out[1]: array([ 1. , 2.5, 4. , 5.5, 7. , 8.5, 10. ]) SciPy具有scipy.interpolate.interp1d,可以进行线性和最接近插值(尽管最接近的点可能并不明显): In [2]: from scipy.interpolate import interp1d In [3]: xp = np.arange(0
  • sox :音频文件转换命令
    在开发呼叫中心的过程中要播放语音,要把自己录制的语音的wav格式转换为gsm格式,asterisk中也支持wav格式,但是不清楚为什么wav文件大一些就无法播放,所以只有转换为gsm格式。 命令 :sox 00.wav -r 8000 -c 1 00.gsm resample -ql 下面的是在网上找到的一篇文章 文章来源 Sox是最为著名的Open Source声音文件格式转换工具。已经被广泛移植到Dos、windows、OS2、S un、Next、Unix、Linux等多个操作系统平台。 Sox项目是由Lance Norskog创立的,后来被众多的开发者逐步完善,现在已经能够支持很多种声 音文件格式和声音处理效果。基本上常见的声音格式都能够支持。更加有用的是,Sox能够进行 声音滤波、采样频率转换,这对那些从事声讯平台开发或维护的朋友非常有用。当然,Sox里面 也包括一些DSP算法,有兴趣的朋友可以下载回去研究。Sox可以用于任何用途。但是发布源代码 时必须包括版权声明,发布二进制代码必须声明作者。 首先来一个简单的命令,如下: sox file1.wav -v 0.6 file2.wav -v是调整音量的选项,0.6是参数,它是一种线性调整,并不是调整到原先的0.6,而是幅值调整,fi -le2.wav是输出文件。如果-v后面的数字比1大,则增加音量,反之则减少音量
  • 使用Python播放音频(Play audio with Python)
    问题 如何从Python脚本播放音频(听起来像1秒钟的声音)? 最好是独立于平台,但首先需要在Mac上运行。 我知道我可以在Python中执行afplay file.mp3命令,但是可以在原始Python中执行吗? 如果它不依赖外部库,我也会更好。 回答1 您可以在此处找到有关Python音频的信息:http://wiki.python.org/moin/Audio/ 没有外部库,它似乎无法播放.mp3文件。 您可以将.mp3文件转换为.wav或其他格式,也可以使用PyMedia之类的库。 回答2 最好的选择可能是使用pygame / SDL。 它是一个外部库,但在各个平台上都具有强大的支持。 pygame.mixer.init() pygame.mixer.music.load("file.mp3") pygame.mixer.music.play() 您可以在pygame.mixer.music文档中找到有关音频混音器支持的更多特定文档。 回答3 尝试playsound,它是一个纯Python,跨平台,单功能模块,没有播放声音的依赖项。 通过pip安装: $ pip install playsound 安装完成后,您可以像这样使用它: from playsound import playsound playsound('/path/to/a/sound/file/you
  • 如何从wav文件中提取声音数据?(How can I draw sound data from my wav file?)
    问题 首先,这是用于家庭作业或...项目。 我很难理解如何在Java项目中将声音数据波绘制到图形上的想法。 我必须使用UI完全从头开始进行此分配,因此基本上要做一个.wav文件编辑器。 我遇到的主要问题是将声音数据放入要绘制的图形中。 目前,我有一个随机生成的值数组,现在正在绘制。 到目前为止,我有一个微型程序正在运行并验证wav文件,使其实际上是wav文件。 我正在使用FileInputStream读取它并进行验证:RIFF字节(0-3),FileLength(4-7),WAVE字节(8-11),然后是格式块format(从RIFF块的末尾开始) ;然后将索引放置在索引的末尾,并给出格式0-3,格式块的长度4-7,然后是wave文件的所有规范的后16个字节,并将其存储在相应的命名变量中。 一旦到达DATA块及其长度,这就是我所有的声音数据,这就是我不确定如何存储每个字节的声音数据甚至将其转换为与振幅相关的值的原因。声音。 我以为验证是相似的,所以会是一样的,但事实并非如此……自从我盯着这几天以来,我要么一直在使超级简单的事情变得复杂。 任何帮助表示赞赏,谢谢。 回答1 我不是Java程序员,但是我对渲染音频有些了解,因此希望以下内容会有所帮助... 鉴于您几乎总是拥有比可用像素大得多的样本数量,因此明智的做法是从缓存的样本数据缩减或“摘要”中提取数据。 通常,这就是音频编辑器
  • 非常小的字典的Java语音识别(Java voice recognition for very small dictionary)
    问题 我有包含计算机留下的语音邮件的 MP3 音频文件。 消息内容始终采用相同的格式,由相同的计算机语音留下,内容仅略有不同: “您今天卖出了 4 辆汽车”(其中 4 可以是 0 到 9 之间的任何值)。 我一直在尝试设置 Sphinx,但开箱即用的模型效果不佳。 然后我尝试编写自己的声学模型,但还没有取得更大的成功(30% 未被识别是我最好的)。 我想知道语音识别是否可能对这项任务来说太过分了,因为我只有一个声音、一个预期的音频模式和一个非常有限的需要识别的字典。 我可以访问我需要在消息中搜索的十种声音(口语数字)中的每一种。 是否有非 VR 方法在音频文件中查找声音(如有必要,我可以将 MP3 转换为另一种格式)。 更新:我对此任务的解决方案如下 在直接与 Nikolay 合作后,我了解到我原来问题的答案是无关紧要的,因为使用 Sphinx4 和 JSGF 语法可以达到预期的结果(100% 准确率)。 1:由于我的 audo 文件中的语音非常有限,我创建了一个 JSGF 语法( salesreport.gram )来描述它。 创建以下语法所需的所有信息都可以在此 JSpeech Grammar Format 页面上找到。 #JSGF V1.0; grammar salesreport; public <salesreport> = (<intro> | <sales> |
  • Android音频开发(1):基础知识
    先来点闲言碎语,前段时间我有一段感悟:Android开发,本身并不是一个可以走得多远的方向,它只是一个平台,提供了许多封装好的API,让大家能够快速开发出针对特定业务的应用。真正有价值的地方就在于Android与具体的业务方向结合,比如:Android与音视频技术,Android与智能硬件交互,Android与前端技术的融合与探索,Android信息安全,Android源码深度定制等等。我一直比较看好音视频/多媒体方向,希望在此能够深入积累和探索,前段时间我发布了一款Android VoIP网络电话应用“飞鸽电话”,并写了一篇分析其整体架构的文章《PigeonCall:一款Android VoIP网络电话App架构分析》,欢迎有兴趣的小伙伴们先看一看。在这个应用的开发过程中学到的东西还蛮多的,因此想写一些文章分享分享,本文作为开篇,主要以问答的形式,介绍一些音频开发的基础常识,非常重要,因为不了解这些常识,很多Android API或者第三方库的参数,你都不知道该怎么配置。1. 音频开发的主要应用有哪些?音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱,等等。2. 音频开发的具体内容有哪些?(1)音频采集/播放(2)音频算法处理(去噪、静音检测、回声消除、音效处理、功放/增强、混音/分离,等等)(3)音频的编解码和格式转换(4
  • c# - 如何在C#中将midi转换为wav/mp3?(How can I convert between midi to wav/mp3 in c#?)
    问题 我开始了一个小项目,其中包括处理 MIDI 文件。 我一直在想,是否有任何 C# 或 VB.Net 代码可以在 MIDI 和 WAV 文件之间进行转换? 回答1 您可以尝试以某种方式与开放源代码的 Timidity 进行交互: TiMidity++ 是一个软件合成器。 它可以通过将MIDI文件转换为PCM波形数据来播放它们; 给它一个 MIDI 数据和数字乐器数据文件,然后实时合成它们并播放。 它不仅可以播放声音,还可以将生成的波形以各种音频文件格式保存到硬盘中。 FluidSynth 是最近更新的一个类似的开源项目: FluidSynth 是基于 SoundFont 2 规范的实时软件合成器。 您可以从该列表中的站点下载一些免费的 SoundFont(这些合成器用于“渲染”MIDI 文件的实际 PCM 数据)。 回答2 MIDI 文件只包含音符和控制器信息,不包含声音。 为了从 MIDI 文件中获取声音,您必须将文件通过音乐合成器或采样器,它将音符和控制器信息转换为实际声音。 实际上,这意味着任何给定的 MIDI 文件都没有特定的声音。 将 MIDI 文件转换为音频所产生的声音会因合成器或样本库的质量以及选择执行转换的声音而异。 许多声卡具有从 MIDI 文件产生声音的能力。 他们可以这样做是因为许多 MIDI 文件都遵循称为通用 MIDI 规范的标准。 通用 MIDI
  • 一次播放大量声音(Playing a Lot of Sounds at Once)
    问题 我试图在 python 中创建一个程序,当按下某个键时播放特定的大键琴音符。 我希望它保持响应,这样你就可以继续弹奏更多的音符(有点像普通的电钢琴。)但是,因为存储音符的 wav 文件大约有 7-10 秒长,我遇到了一些问题。 我每秒至少可以按下 10 个键。 因此,在一个音符的持续时间内,我可以同时播放大约 100 个不同的 wav 文件。 我尝试使用 winsound,但无法一次播放多个 wav 文件。 然后我转到 PyAudio 并且它有点工作。 我发现实现我想要的唯一方法是: from msvcrt import getch import pyaudio import wave import multiprocessing as mp #This function is just code for playing a sound in PyAudio def playNote(filename): CHUNK = 1024 wf = wave.open(filename, 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate()
  • 在 Java 中将声音 (.wav/.mp3) 显示为图形(Display sound (.wav/.mp3) as graph in Java)
    问题 我需要显示声音文件的图形 - 即音频编辑器(如 Audacity)显示的波形。 我应该怎么做? Java Sound API 中有什么可以帮助我的吗? 回答1 在 Java Sound API 中查看 AudioSystem.getAudioInputStream 它将返回 AudioInputStream ,它向您展示如何在 Java 中打开音频文件形式。 读取 .wav 文件已经足够了,但对于 mp3 则不然。 它可以让您直接一个一个地读取字节。 此外,getAudioFormat 将返回具有采样率、位/样本等的对象。读取波形后,您可以在屏幕上以您喜欢的方式绘制它(Swing、AWT、网络上的 png 文件等)。 回答2 最后,我在 Swing Hacks 一书的第 10 章中找到了完全按照我想要的代码。
  • Java AudioSystem:读取 32 位 Wav 文件(Java AudioSystem: Reading 32 Bit Wav Files)
    问题 我正在读取 16 位和 24 位采样位深度的音频文件,并毫无困难地解析它们以确定它们的长度。 但是,当读取 32 位文件时,我得到 javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170) ... 32 位测试文件以与其他文件(线性 PCM)相同的方式手动编码。 我想知道 AudioSystem 是否不支持 32 位 Wav,或者是否有解决方法。 作为参考,这是我的课程: import java.io.*; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; public class soundUtility { public static double getWavDuration(File filename) { AudioInputStream stream = null; try
  • 如何在Java应用程序中播放声音(警报)? [复制](How to play a sound (alert) in a java application? [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Java中以给定的采样率播放声音? (1个答案) 6年前关闭。 我正在使用基于Java的SMS处理软件,希望在收到消息时发出提示音/警报声音。 我尝试查看java.sound库,但找不到任何东西。 我不知道在Java应用程序中采用小程序播放声音的方式是否可以! 我们可以在应用程序中调用的所有Java库中是否都存在预定义的声音? 任何指针将不胜感激! 回答1 如果您只想发出哔哔声或快速警报,请尝试 Toolkit.getDefaultToolkit().beep(); 回答2 如果您想要的东西比没有外部声音文件的beep()乏味,则可以生成自己的声音。 import javax.sound.sampled.*; public class SoundUtils { public static float SAMPLE_RATE = 8000f; public static void tone(int hz, int msecs) throws LineUnavailableException { tone(hz, msecs, 1.0); } public static void tone(int hz, int msecs, double vol) throws LineUnavailableException { byte[] buf =
  • 从 8Khz 到 48Khz 重新采样/上采样声音帧(Java/Android)(resample / upsample sound frames from 8Khz to 48Khz (Java/Android))
    问题 我正在尝试为 andriod 开发的应用程序以 48Khz(PCM 16 位和单声道)记录帧并将它们发送到网络。 此外,还有一个 8Khz 的传入音频流。 因此,我接收 8Khz 采样帧并播放它们(我的 AudioTrack 对象设置为 8Khz),但是在播放它们时,一切正常,但延迟很大。 大约需要 3 秒钟,直到你听到什么。 我认为如果我将接收到的帧从 8Khz 上采样到 48Khz 并播放它们,就不会有这么大的播放延迟。 事实上,当我以相同的速率记录和播放帧时,延迟非常低。 不好的是,我被迫这样做:发送到 48Khz 并接收到 8Khz。 如前所述,我试图将声音帧(16 位 PCM)从 8Khz 上采样到 48Khz。 有没有人知道 Java 中执行此操作的任何例程/库/API? 我知道有关对谨慎信号进行上采样的基础知识,但我认为设计和实现我自己的 FIR 滤波器并将其与音频流进行卷积......太过分了。 此外,这超出了我的知识范围。 所以……有人能帮我解决这个问题吗?? 有人知道我可以使用的 Java 库/例程吗? 任何建议或替代方案? 回答1 一个快速而肮脏的解决方案是线性插值。 由于您总是以六倍的系数进行采样,因此这真的很容易做到: 它有点像这样(C 代码,未经测试,我没有正确处理最后一次迭代,但它显示了我认为的想法)。 void resample (short
  • 比较 android 中的语音 wav 或语音标签(语音命令)API(Compare voice wav in android or voice tag ( voice commands ) API)
    问题 我正在开发一个应用程序,我需要一些方法来比较 2 个声音是否匹配,我知道 Voice Recognizer 是一种方法,但是因为(我认为)它需要首先将声音翻译成字符串,它除了语音识别器支持的 lang 之外,不会那么适合其他语言......知道吗? 就像过去的电话一样,语音标签只是将语音输入与之前在设置过程中录制的语音进行比较 回答1 一个相对简单的方法是使用 FFT(快速傅立叶变换)将原始 WAV 文件的时域数据转换为频域数据(其中变换数组中的每个值代表一个的相对幅度/强度)特定频段)。 如果同一个人两次说同一个词,则生成的时域数据在两个 WAV 文件中的数值仍然会有很大差异。 将两个 WAV 文件转换为频域(使用相同大小的 FFT 窗口,即使这两个文件的长度略有不同)将产生比原始 WAV 文件更相似的频率数组。 不幸的是,我还没有找到任何专门针对 Android 的 FFT 库。 这是一个引用一些基于 Java 的库的问题: Java中的信号处理库? 回答2 一个想法是比较声谱图中声音的相似性。 频谱图的特点是鲁棒性强,抗噪声能力强,为分析两种语音提供了很好的参考。 如果你采用这种方法,你应该首先找出声音的特征,然后你需要知道如何比较两个频谱图中的特征,它指的是模式识别。 这个api http://code.google.com/p/musicg-sound-api/
  • 通过 Flutter 从 C++ 插件访问资产(Accessing assets from C++ plugin through Flutter)
    问题 由于延迟低,我正在尝试将 Google Oboe 用于 3D 音频处理应用程序。 该应用程序将有一个 C++ 后端,它进行处理,前端使用 Flutter 完成。 我正在运行一些测试以查看它是否会起作用,但是我在将资产从 Flutter 加载到双簧管时遇到了问题。 我检查了 Oboe 的 repo 中的示例 RhythmGame,用 Java 完成,但无法安静地找到一种直接从 Dart 到 C++ 的方法。 前后端的连接是通过dart::ffi 这是我迄今为止尝试过的。 根据 Richard Heap 在此处发布的示例,我将noise变量从正弦波更改为 wav 文件中歌曲的一小段: class _MyAppState extends State<MyApp> { final stream = OboeStream(); var noise = Float32List(512); Timer t; @override void initState() { super.initState(); // for (var i = 0; i < noise.length; i++) { // noise[i] = sin(8 * pi * i / noise.length); // } _loadSound(); } void _loadSound() async { final
  • WAV至Midi转换(wav-to-midi conversion)
    问题 我是该领域的新手,但我需要在Java中执行WAV到MIDI转换。 是否有办法知道WAV到MIDI转换中确切涉及哪些步骤? 我有一个很粗略的主意,因为您需要这样做; 对wav文件进行采样,过滤,使用FFT进行频谱分析,特征提取,然后将提取的特征写入MIDI。 但是我找不到可靠的资源或论文,因为该怎么做? 有人可以为我提供有关如何以及从何处开始的线索吗? WAV到MIDI转换过程是否有可用的开源API? 预先感谢 回答1 这个过程比您想象的要复杂得多。 这个研究问题通常被称为音乐转录:将音乐(例如,波形)的低级表示转换成MIDI或什至乐谱之类的高级表示的行为。 解决方案的复杂程度将取决于输入数据的复杂性。 大量的研究论文仅针对单声道钢琴或架子鼓上的音乐转录……因为它们易于转录。 (相对。)小提琴要硬一些。 声音更难听。 小提琴加声音加钢琴要难得多。 交响乐几乎是不可能的。 您得到图片。 音乐转录的基本元素涉及以下任何重叠领域: (多)音高估算乐器识别,音色建模节奏检测音符开始/偏移检测表格/结构建模 在Google学术搜索或ISMIR程序中搜索有关“音乐转录”的论文:http://www.ismir.net。 如果您对以上子主题之一更感兴趣,那么我可以进一步指出。 祝你好运。 编辑:话虽这么说,现有的解决方案我们都可以在网上找到。 随时尝试。 但是,当您这样做时
  • 语音信号处理基础(三)——基于MATLAB的语音采集与读写
    语音信号处理基础(三) 文章目录 语音信号处理基础(三)语音采集与读写1.语音信号的特点2.语音信号采集的基本原理3.基于MATLAB的语音信号采集与读写4.实例 有关语音信号处理的发展请阅读前两篇博客 语音信号处理基础(一) 语音信号处理基础(二) 语音采集与读写 通过对大量语音信号的观察和分析发现,语音信号主要有下面两个特点 1.语音信号的特点 (1) 在频域内,语音信号的频谱分量主要集中在300-3400Hz的范围内。 利用这个特点,可以用一个防混叠的带通滤波器将此范围内的语音信号频率分出,然后按8kHz的采样 (2) 在时域内,语音信号具有“短时性”的特点 即在总体上,语音信号的特征是随着时间而变化的,但在一段较短时间间隔内,语音信号保持平稳。在浊音段表现出周期信号的特征,在轻音端表现出随机噪声的特征 2.语音信号采集的基本原理 将模拟信号变为数字信号,必须经过采样和量化,得到时间和幅度上均为离散的数字信号语音。采样时, 采样频率必须以高于受测信号的最高频率两倍以上的速度进行取样,才能正确地重建信号。 3.基于MATLAB的语音信号采集与读写 (1)wavrecord()函数:用来录制语音和音频信号。 基本语法: y=waverecord(n,Fs,ch,'dtype') n为采样点数,Fs为采样频率,ch为音频设备通道数(1或2表示单声道或立体声)'dtype
  • 在WAV文件和FFT的Matlab中进行音频读取(Audioread in matlab of wav file and FFT)
    问题 我正在研究Matlab,我想对之前在Matlab上记录的wav文件执行FFT。 fs = 44100; % Hz t = 0:1/fs:1; % seconds f = 600; % Hz y = sin(2.*pi.*f.*t); audiowrite('600freq.wav',y,fs) 这就是我在wav文件中录制的方式。 现在到阅读和FFT部分: [y,Fs] = audioread('600freq.wav'); sound(y) plot(fft(y)) 这是我得到的FFT图: 也许我缺少有关FFT的一些知识,但是我希望有两个垂直的棒棒糖。 我注意到的另一件事是错误的,当我从文件中读取声音后播放声音时,声音变长了,而且音调明显降低了。 我的猜测是采样率问题,但是我真的不知道该怎么办。 感谢您的任何帮助。 回答1 那是因为您没有绘制幅度。 您要绘制的是系数,但是这些系数的值是复数。 因此,水平轴是实数分量,垂直轴是虚数分量。 同样,当您单独使用声音时,默认的采样频率是8 kHz(准确的说是8192 Hz),这解释了为什么声音的音调较低。 您需要将采样频率用作sound的第二个参数,它由audioread的第二个输出提供给您。 因此,请尝试在fft通话之后放置abs并在sound使用Fs : [y,Fs] = audioread('600freq.wav')
  • 如何在 Java 媒体框架工作中学习 .wav 持续时间?(How to learn .wav duration in Java media frame work?)
    问题 我很想使用 java 媒体框架将 .mov 文件与 .wav 文件合并,因此我需要知道它们的持续时间。 我怎样才能做到这一点? 任何想法,将不胜感激.. 回答1 您可以使用这种方式学习声音文件的持续时间(这是 VitalyVal 的第二种方式): import java.net.URL; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.DataLine; public class SoundUtils { public static double getLength(String path) throws Exception { AudioInputStream stream; stream = AudioSystem.getAudioInputStream(new URL(path)); AudioFormat format = stream.getFormat(); if (format.getEncoding() != AudioFormat