音频变速播放原理分析及实现方案
[时间:2019-05] [状态:Open]
[关键词:音频,audio,倍速,变速,变调,soundtouch,sonic]
音频变调变速原理分析
先来一段语音处理的理论:
变速变调可分为:变速不变调和变调不变速。语音变速不变调是指保持音调和语义保持不变,语速变快或变慢。该过程表现为语谱图在时间轴上如手风琴般压缩或者扩展。那也就是说,基频值几乎不变,对应于音调不变;整个时间过程被压缩或者扩展,声门周期的数目减小或者增加,即声道运动速率发生改变,语速也随之变化。对应于语音产生模型,激励和系统经历与原始发音情况几乎相同的状态,但持续时间相比原来或长或短。严格地讲,基频和音调是两个不同的概念,基频是指声带振动的频率,音调是指人类对基频的主观感知,但是两者变化基本一致,即基频越高,音调越高,基频越低,音调越低,音调是由基频决定的。因此,语音变调不变速就是指改变说话人基频的大小,同时保持语速和语义不变,即保持短时频谱包络(共振峰的位置和带宽)和时间过程基本不变。对应于语音产生模型,变调改变了激励源;声道模型的共振峰参数几乎不变,保证了语义和语速不变。综上所述,变速改变声道运动速率,力求保持激励源不变;变调改变激励源,力求保持声道的共振峰信息不变。但是声源和声道不是相互独立的,在改变声源时,必然也会非线性的影响声道,同样地,改变声道时也会或多或少的影响声源,两者之间相互影响,相互作用。
语音变调在变声软件中较常用。而语音变速在播放器中常用,比如倍速播放(快播、慢播)。本文重点关注变速。
相对于视频基于帧的变速原理,跳帧或者插帧。音频的变速原理并不是如此简单,因为简单的抽采样点会引起声音的不连续、噪声或爆破音,主观体验较差。
所以一下简单的音频处理策略通常是行不通的:(以x2倍速为例)
1.播放设备实现,设置播放设备播放采样率加倍,这样单位时间播放的采样点数加倍,可以实现变二倍速不变调,但声音不连续。
2.播放前PCM重采样为原采样率的一半,可以实现二倍速,但是会变调。
3.丢帧,每隔一帧丢一帧,可以实现两倍速,但是也会有刺啦刺啦的噪音,而且声音会产生断续,体验十分差。
可用方案
所以为了实现较好的主观体验,只能采用相对复杂的语音处理策略。目前较为常用的音频变速解决方案有两个:soundtouch和Sonic。
ijkplayer使用的是soundtouch,EXOPlayer使用的是Sonic。
在Android上还有一种实现方式,基于AudioTrack的变速播放,代码如下:
PlaybackParams params = audioTrack.getPlaybackParams();//params.setSpeed(1.0f); // available//params.setSpeed(0.5f); // availableparams.setSpeed(1.5f); // not availableaudioTrack.setPlaybackParams(params);
详细用法建议参考PlaybackParams。
Sonic和Soundtouch用法类似,都是提供封装好的库,将原音频的PCM数据通过接口函数处理为目标格式,比如二倍速,可能PCM采样点就减半。
这里以Soundtouch提供的接口为例,说明下如下使用:
参数设置类接口:
- 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]
PCM处理类接口:
- putSamples(const SAMPLETYPE *samples, uint nSamples) 输入采样数据
- receiveSamples(SAMPLETYPE *output, uint maxSamples) 输出处理后的数据,需要循环执行
- flush() 冲出处理管道中的最后一组“残留”的数据,应在最后执行
从上述接口来看,类似于常规的解码器或者解复用器的调用逻辑。
小结
本文简述了音频变速变调的原理,并对目前Android平台上可用的音频变速方案做了总结,包括Soundtouch、Sonic及AudioTrack三种方案,仅供后续参考。
参考资料
- 音频倍速(变速不变调)的实现
- 变速变调原理与方法总结
- SoundTouch官网
- ijkplayer倍速变调问题解决方案
- SoundTouch实现音频变速变调
转载于:https://www.cnblogs.com/tocy/p/audio-tune-speed-change.html
音频变速播放原理分析及实现方案相关推荐
- 音频变速变调原理及 soundtouch 代码分析
音频变速变调原理及 soundtouch 代码分析 作者:floer rivor 2021 年 4 月 30 日 本文字数:5066 字 阅读完需:约 17 分钟 概述 音频变速变调在不同的场景可以分 ...
- ijkplayer音频解码播放架构分析
ijkplayer是一款跨平台播放器,支持Android与iOS播放,音频解码默认使用FFmpeg的avcodec软解.Android端播放音频可以用OpenSL ES和AudioTrack,而iOS ...
- MySQL优化原理分析及优化方案总结
前言 今天中午收到我司安全部发了一封邮件:Jackson存在安全漏洞.查了一下,这件事并不算很新鲜了(已经过了5天的样子),本文来聊聊吧. 说起来还蛮戏剧化:阿里云向Jackson官方提交了一个Jac ...
- Mp4文件播放原理分析
- 音视频开发之旅(66) - 音频变速不变调的原理
目录 声音的基本知识 时域压扩(TSM)的原理 波形相似叠加(WSOLA) 资料 收获 音频的原始pcm数据是由 采样率.采样通道数以及位宽而定.常见的音频采样率是44100HZ,即一秒内采样4410 ...
- sonic音频变速不变调的原理分析
1.问题背景 音频的原始pcm(Pulse Code Modulation)数据是由采样频率.通道数以及采样精度(位宽)而决定.人耳能听到的频率范围是[20H~20kHz],所以常见的音频采样率是44 ...
- 9.ffplayer 原理、架构及代码分析——变速播放的实现
基本原理 变速播放的实现原理很简单.抛开音频回放暂不考虑,只有视频的情况下,变速播放就是改变了视频回放的播放帧率.如果帧率是 30fps,我们以 200% 的速度播放,那么等于是把帧率提升到了 60f ...
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...
- 一篇读懂无线充电技术(附方案选型及原理分析)
更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: 目录 一篇读懂无线充电技术(附方案选型及原理分析) 0.背景 1.无线供电特 ...
最新文章
- 【Java Web开发指南】JQuery基础笔记
- 口语学习Day4:今天带你们一起逛一下博物馆
- Oracle三种循环:for,while,do...while(PL/SQL)
- VS C++生成dll和静态调用dll的方法
- jmeter执行python脚本,Jmeter+Python-1问题记录jmeter执行Python3的脚本时报 ValueErro
- java文件调用脚本_Java中调用文件中所有bat脚本
- jooq_jOOQ与Hibernate:何时选择哪个
- 在Spring中配置多个View解析器
- linux root邮箱地址,linux – 如何将root的电子邮件转发到外部电子邮件地址?
- 【从入门到放弃-Java】并发编程-线程安全
- LeetCode 234. Palindrome Linked List
- 张朝阳寄语“校花”把参赛比做登山 走到不同阶段都是一种成就
- php不用框架怎么写,php框架不用写sql语句就能调用数据库里表的字段是怎么实现的...
- 切换至 root 身份
- 使用指针时的“陷阱”
- Vmware虚拟机红帽子Linux联网
- 淘宝天猫自动抢购插件下载-开发学习
- todo Java注解
- 如何选购计算机的硬盘,教你如何选配电脑—硬盘篇
- 华为在线笔试题-python
热门文章
- 达人评测 R7 PRO 6850HS 核显相当于什么显卡
- Adrealm:区块链的“快慢之道”|金色财经独家专访
- 视频编辑软件编辑星海外英文网站上线
- 科幻科技对话:机器人实在不能变得像人一样愚蠢
- JavaWeb的架构
- WordPress搜索引擎蜘蛛统计分析插件:Spider Analyser
- C语言——初识C语言(define定义常量和宏,指针,结构体)
- Zotero 和它的朋友们: 一个文献阅读生态
- 小程序 身份认证服务器,如何实现微信小程序与.net core应用服务端的无状态身份验证...
- 【故障处理】队列等待之enq: TX - row lock contention