SoundTouch实现音频变速变调

介绍

SoundTouch

是一个用C++编写的开源的音频处理库,可以改变音频文件或实时音频流的节拍(Tempo)、音调(Pitch)、回放率(Playback Rates),还支持估算音轨的稳定节拍率(BPM rate)。ST的3个效果互相独立,也可以一起使用。这些效果通过采样率转换时间拉伸结合实现。

  • Tempo节拍 :通过拉伸时间,改变声音的播放速率而不影响音调。
  • Playback Rate回放率 : 以不同的转率播放唱片(DJ打碟?),通过采样率转换实现。
  • Pitch音调 :在保持节拍不变的前提下改变声音的音调,结合采样率转换+时间拉伸实现。如:增高音调的处理过程是:将原音频拉伸时长,再通过采样率转换,同时减少时长与增高音调变为原时长。

处理对象

ST处理的对象是PCM(Pulse Code Modulation,脉冲编码调制),.wav文件中主要是这种格式,因此ST的示例都是处理wav音频。mp3等格式经过了压缩,需转换为PCM后再用ST处理。

主要特性

  • 易于实现:ST为所有支持gcc编译器或者visual Studio的处理器或操作系统进行了编译,支持Windows、Mac OS、Linux、Android、Apple iOS等。
  • 完全开源:ST库与示例工程完全开源可下载
  • 容易使用:编程接口使用单一的C++类
  • 支持16位整型或32位浮点型的单声道、立体声、多通道的音频格式
  • 可实现实时音频流处理
    • 输入/输出延迟约为100ms
    • 实时处理44.1kHz/16bit的立体声,需要133Mhz英特尔奔腾处理器或更好

相关链接

官网提供了ST的可执行程序、C++源码、说明文档、不同操作系统的示例工程,几个重要链接:

Android中使用SoundTouch

Android中使用ST,需将ST的C++代码使用NDK编译为.so库,再通过JNI调用。参考:SoundTouch in Android

1.下载源码

下载:soundtouch-1.9.2.zip ,包含ST的C++源码、Android-lib示例工程。

2.编译so

NDK的编译操作可参考:Android NDK编译C/C++为so共享对象

E:\>cd soundtouch-1.9.2\soundtouch\source\Android-lib\jni    //根据Android.mk,定位到jni
E:\soundtouch-1.9.2\soundtouch\source\Android-lib\jni>ndk-build    //开始编译

编译完毕后可以在新生成的\Android-lib\libs下得到不同CPU的libsoundtouch.so

3.导入so

在Eclipse-ADT中import进Android-lib工程。

在项目目录下,新建与\src平级的\libs文件夹,将编译出的so放在此处即可。

4.运行效果

该工程实现了对wav文件的变调处理,如图。

调用接口与参数

示例工程中的SoundTouch.cpp是ST的调用接口,音调、音速的变化是通过为ST设置新的参数,这些参数需在正式开始处理前设置好。接口的调用示例可以参考soundtouch-jni.cpp中的_processFile函数。

采样:

  • setChannels(int) 设置声道,1 = mono单声道, 2 = stereo立体声
  • setSampleRate(uint) 设置采样率

速率:

  • setRate(double) 指定播放速率,原始值为1.0,大快小慢
  • setTempo(double) 指定节拍,原始值为1.0,大快小慢
  • setRateChange(double)setTempoChange(double) 在原速1.0基础上,按百分比做增量,取值(-50 .. +100 %)

音调:

  • setPitch(double) 指定音调值,原始值为1.0
  • setPitchOctaves(double) 在原音调基础上以八度音为单位进行调整,取值为[-1.00,+1.00]
  • setPitchSemiTones(int) 在原音调基础上以半音为单位进行调整,取值为[-12,+12]

以上调音函数根据乐理进行单位换算,最后进入相同的处理流程calcEffectiveRateAndTempo()。三个函数对参数没有上下界限限制,只是参数过大失真越大。SemiTone指半音,通常说的“降1个key”就是降低1个半音。所以我认为使用SemiTone为单位即可满足需求,并且容易理解。

处理:

  • putSamples(const SAMPLETYPE *samples, uint nSamples) 输入采样数据
  • receiveSamples(SAMPLETYPE *output, uint maxSamples) 输出处理后的数据,需要循环执行
  • flush() 冲出处理管道中的最后一组“残留”的数据,应在最后执行

八度音Octave、半音SemiTone与Key

作为音痴,顺道了解下乐理的皮毛:

钢琴键盘上的一个黑键或白键就是一个key,乐理中叫semiTone半音。 上图的白键c d e f g a b,加黑键#c #d #f #g #a,共12个半音称为1个八度音。我们唱的do re mi fa so la si对应其中的7个白键。

12个半音从低到高分别是: c #c d #d e f #f g #g a #a b

2个半音=1个全音,相邻的键差1个半音(如c与#c),相隔的键差1个全音(如c与d)。

“降3个key”就是将原本的g音唱为e;

“降1个八度”是指原本唱高音组中的g,唱为中音组中的g,是降了12个key。

“升key降八度”是一种歌唱方法: 歌手音准在a2,歌曲在d3,这时候有2个办法:

1、把伴奏降key,从d3降到a2,这样伴奏和歌手都在a2上

2、把伴奏升key,从d3升到a3,歌手用a2来唱。这样歌手a2和伴奏a3虽然不同,但是都在a调上,所以不会别扭。

采用方法2“升key降八度”是因为伴奏升key的音质损失更小。

SoundTouch实时处理音频流

ST对音频的处理是输入函数putSamples()与输出函数receiveSamples()。实时处理音频流的思路就是,循环读取音频数据段,放入ST进行输出,输出处理后的数据段用于播放。

How to use SoundTouch for realtime audio processing?

Create a processing function that is called by realtime system once realtime input samples are available, so that this function puts realtime input samples into SoundTouch pipeline with ‘putSamples’ function call, and use ‘receiveSamples’ function for extracting resulting output samples for realtime output processing.

由于业务要求使用Android的AudioEffect机制实现变调处理,得空后再尝试以JNI形式直接处理音频数据的工程。

参考

  1. soundtouch之变调、变速、节拍
  2. Android下使用SoundTouch实现变声并转为wav格式播放
  3. SoundTouch音频处理库源码分析及算法提取(1-9)
  4. FFmpeg + SoundTouch实现音频的变调变速(视频中音频提取)
时间: 2024-10-05 04:33:37

SoundTouch实现音频变速变调的相关文章

OLA音频变速算法的仿真与剖析

前段时间,在尝试音乐节拍数的提取时,终于有了突破性的进展,效果基本上比市面上的许多商业软件还要好,在作节拍数检测时,高频信息作用不大, 通过重采样减小运算量.重采样让我想起了在学校里面做的变速变调算法,在这里顺便回顾一下. OLA(Overlap-and-Add, OLA)重叠叠加算法是音频变速算法中最简单的时域方法,它是后续时域算法(SOLA, SOLA-FS, TD-PSOLA, WSOLA)的基础. OLA分为分解与合成两个部分,公式看起来很复杂,所以不贴出了,基本思路从图中更能清晰的表现

实时变速变调

以前一直都是针对整个文件的音效处理. 为了将变调不变速.变速变调.变速不变调的功能 整理到PC demo里面,实时产生效果. 只好重新将整个数据流产生流程和获取流程整理了一下,生成一个多线程单例模式的音效处理对象,终于OK搞定了. 在播放的过程中,可以随时调整两种音效的系数,实时产生效果. 下一次有时间,把vad和drc等相关功能也整理到里面.

java使用Sonic 算法对音频变速不变声、变调、调整音量

依赖库:https://github.com/waywardgeek/sonic 基础库:Sonic.java /* Sonic library Copyright 2010, 2011 Bill Cox This file is part of the Sonic Library. This file is licensed under the Apache 2.0 license. */ public class Sonic { private static final int SONIC_

使用SoundTouch库写一个歌声合成程序

以前在学习WAV文件格式的时候发现了一个叫SoundTouch的开源小众库,提供WAV音频的变调和变速功能.这几天忽然想起来这个库,无聊的我就写了一个简单的歌声合成程序.功能和质量都比不上专业的音频合成软件,而且我也不想再做下去了...... 这个简单的歌声合成程序,我称它为FA♂乐器好了,因为音源是FA(滑稽 http://files.cnblogs.com/files/CodeMIRACLE/fa.zip 我的开发环境是win10 CodeBlock+Mingw32,我没有预先编译这个库,直

支持8K播放且低延时高并发全功能的流媒体播放器EasyPlayerPro如何播放H.265视频?

需求分析 一般对于一个播放器,应该支持如下几种显示模式: 等比例,最大化区域显示,不裁剪 等比例,最大区域显示,裁剪 拉伸显示,铺满全屏 要实现这几种显示模式.其实只要对播放控件的布局进行些许调整即可. 那EasyPlayer是怎么实现的呢?EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP.RTMP.HTTP.HLS.UDP.RTP.File等多种流媒体协议播放.支持本地文件播放,支持本地抓拍.本地录像.播放旋转.多屏播放.倍数播放等多种功能特性,核心基于ffmpeg,稳定.高

sonyvegas基本操作及快捷键

sonyvegas基本操作 魅力网络今天用vegas处理音频,把音频就行分割合并,用到的快捷有S 截断 M 打点 G 组合  U 解组 音频变速:右击属性,选典型 自己手动填需要加长到的时间. 分割视频 :U键可以把视频和音频分割开 s分割的时候就只会分割选择的音频或者视频 不会整个分割了 调节音量:按V键 会出来蓝色的线 双击你要变化音量大小的时间 添加节点, 上下拖动 复习下基本的快捷键及方法 Vegas的快捷键大全 J 反向 K 暂停  L 正向 回车播放/光标就地暂停空格播放/光标返回播

soundtouch变速wsola算法之改进

soundtouch变速算法很类似sola算法,细看才知道是wsola算法. 上个星期有个需求,将该变速应用到直播的包处理,有点类似于webrtc的netEQ处理机制. 直接使用soundtouch,会存在一些问题: 1.一段正常,一段变速,中间会出现不连续,有冲击.或者不同速率的切换. 越频繁,现象更明显,有de,de的声响. 2.soundtouch每次处理,会有残余,如果用flush,音质会受到影响,一般到结尾采用该函数. 也就是说输入样本有残余. 3.soundtouch变速的长度不能精

转:在ios中使用soundtouch库实现变声

http://yarin.blog.51cto.com/1130898/640398 首先下载soundtouch开源库,可以到官方网站去找了,http://www.surina.net/soundtouch/. 下面我们要修改音频文件主要调整的几个函数如下了: mSoundTouch.setSampleRate(sampleRate);//设置声音的采样频率mSoundTouch.setChannels(channels);//设置声音的声道m_SoundTouch.setTempoChang

自由操控声音-相位声码器-变速篇(一)

比较古董的声码器:LPC声码器,相位声码器 LPC声码器就是用全极点模型来表示浊音,近似清音,根据最小平方误差最小化原则,得到该模型的一组参数,就是LPC系数,对系数量化编码,可以大幅压缩数据量:从时域来分析,就是用过去的一组样本点来预测现在的样本点. 从短时傅里叶变换和逆变换可以推导出,一个信号x(n)通过一组滤波器组,在满足一定条件下,这些滤波后的各个频段信号累积起来,可以还原x(n). 这组滤波器其实就是由窗函数(低通滤波器)调制到不同的频率段上,构成一组带通滤波器.滤波器组的N个通道的中