音频处理之语音加速播放

本文系作者原创。如转载,请注明出处。 谢谢!

在做语音类APP时,语音留言(以码流形式)会被保存下来。当听时想快点听完,于是就有了语音加速播放功能。同时还有个需求,能实时切换播放速率,即当1.5倍
速播放时切两倍速,就要立刻两倍速播放。

首先做了一番调研,看几倍速后就基本上听不清说什么了。找来了一款能在PC上运行的有加速播放功能的软件,试验下来两倍速以上就基本上听不清说什么了。于是除
了正常速率外,只有两个速率可调:1.5倍速和两倍速。同时搜了一下变速相关的开源算法(算法原理请看其他相关文章),发现主打变声功能的sound touch使用率较高。它可以改变音调(pitch)和语速(rate)等,好多软件拿它做一些趣味音频。基于sound touch做了一个应用程序看加速效果,同时要兼顾男声和女声。试验下来发现语速加快了后音调就变了,也就是还要同时调音调。改了音调做了一番调试后只能接近原声,能兼顾男女声。再试试在PC上运行的软件,加速后也是只能接近原声。做了这些后就决定用sound touch来做了,在不同的速率下音调(pitch)和语速(rate)参数值也确定了下来(男女声在一个速率下用一组参数值)。

再看我们的相关代码,系统支持ILBC和OPUS两种codec,ILBC每帧30ms, OPUS每帧20ms, 播放线程每20ms运行一次,即每次取20ms PCM数据播放。要想播放语音留言,首先要解码码流成PCM 数据放在buffer1中,再看是否要加速播放,要加速的话就把buffer1中的语音数据调加速函数处理后放在buffer2中,不加速就把buffer1中的语音数据直接拷进buffer2中,等待buffer2中的数据被取走播放。根据这些经过一番尝试后用了分段循环处理的实现方法。一个循环内取固定时间长度的原始音频帧,取出的这段音频帧不管是否加速在这个循环内都要正好播放完,同时兼顾ILBC和OPUS两种不同的帧长和1.5倍速两倍速两种不同的速率。ILBC时,每帧30ms,每次取20ms播放,有1.5倍速两倍速两种速率,最小的原始PCM数据长度(即最小固定长度)是120ms(原始ILBC帧数是4帧,1.5倍速后是80ms,4次可取完播放,2倍速后是60ms,3次可取完播放)。OPUS时,每帧20ms,每次取20ms播放,有1.5倍速两倍速两种速率,最小的原始PCM数据长度也是120ms(原始OPUS帧数是6帧,1.5倍速后是80ms,4次可取完播放,2倍速后是60ms,3次可取完播放)。所以一个循环内取的最小原始音频的固定长度是120ms. 一个循环结束后正好播放完,清空buffer2,然后取下一段原始音频帧解码加速后播放。为了在循环内播放时声音不断断续续,buffer2里要有足够的数据供取走播放。这样在每个循环刚开始的时候,要尽可能多的解码帧数加速后放在buffer2中等取走播放。至于几次解码完所需的码流帧数,这要根据cpu来定。一般一个循环的前一两次就把码流解码加速做完了,后面的次数里只需要从加速后的buffer2里取数据播放就可以了。这样循环内每次播放线程运行时都能取到数据播放,下一循环开始时也能取到数据播放,不存在断断续续的情况。

当要求实时切换语速时,要把这120ms原始语音数据播放完在下一个循环里才能改变语速。由于120ms很短,用户基本无感知,可以认为是实时的,不影响用户体验。
当到语音结尾时,有多少帧就解码加速多少帧供播放,当从加速后的buffer里不能取到20ms数据就可认为播放结束了。这时用零补足20ms数据,把这些数据播放出去,从而结束播放。

跟上层的UI联调后效果不错。这样APP内的语音加速方案就搞定了。

时间: 2024-11-07 13:25:23

音频处理之语音加速播放的相关文章

基于讯飞语音的识别和图灵机器人的具体智能反馈,百度语音的播放,原因是讯飞语音的free版似乎播放做了限制

https://github.com/1158114251/-Intelligent-speech-robot https://www.kancloud.cn/turing/web_api/522992 图灵网站:https://www.kancloud.cn/turing/web_api/522992 apikey:820c4a6ca4694063ab6002be1d1c63d3 编码方式 UTF-8(调用图灵API的各个环节的编码方式均为UTF-8) 接口地址 http://openapi.

第六十九篇、OC_录制语音和播放语音功能的实现

录制: 1.设置全局属性 NSURL *recordedFile;//存放路径 AVAudioPlayer *player;//播放 AVAudioRecorder *recorder;//录制 NSString *recoderName;//文件名 2.设置存储路径 NSDateFormatter *formater = [[NSDateFormatter alloc] init]; [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"]; N

librtmp推流使用aac编码音频的html5和flash播放问题

公司项目中使用rtmp推流,音频编码aac.视频编码H264.windows和android平台都没有发现问题.然而在IOS版本的APP中发现几个问题:1. 推流后flash播放异常2. IOS平台微信分享后html5播放异常但是在PC上播放正常,android平台上html5播放正常. 经过两天的钻研,发现问题如下:1. rtmp建立连接的时候先发送音视频相关参数.或者第一帧发送的数据应该如下: 1 m_pPacketAudio->m_nChannel = 0x04; 2 m_pPacketA

kmplayer加速播放视频(转)

转自微博:http://blog.sina.com.cn/shaguazhu1213 KMPlayer控制播放速度的快捷方式 (2011-11-12 10:51:56) 标签: 杂谈 分类: 编程之旅 用KMPlayer播放器在播放视频的时候,如何控制播放速度? 通常方式是:  右键--播放--快 但这个方式有点麻烦就是,每这样操作一次只能提速5%,比如我想把播放速度增至130%,就要"右键--播放--快"这样循环操作6次. 通过上网搜索并亲身试验后发现还有一个快捷方式: 按Alt +

Html5之高级-5 HTML5音频处理(在H5中播放音频、编程实现音频播放器)

一.在HTML5中播放音频 audio 元素 - audio元素可以实现在HTML页面中嵌入音频内容,该元素的属性可以设置是否自动播放.预加载及循环播放等 - audio元素提供了播放.暂停和音量控件来控制音频 - 使用audio元素提供三种音频格式的文件:MP3.Ogg.Wav - MP3: 采用mpeg音频解码器 - Ogg: 采用ogg音频解码器 - Wav: 采用wav音频解码器 - 语法结构 audio 属性 - audio 元素支持以下属性 - src: 指定播放文件的URL,可通过

iOS音频篇:使用AVPlayer播放网络音乐

引言 假如你现在打算做一个类似百度音乐.豆瓣电台的在线音乐类APP,你会怎样做? 首先了解一下音频播放的实现级别:(1) 离线播放:这里并不是指应用不联网,而是指播放本地音频文件,包括先下完完成音频文件再进行播放的情况,这种使用AVFoundation里的AVAudioPlayer可以满足(2) 在线播放:使用AVFoundation的AVPlayer可以满足(3) 在线播放同时存储文件:使用AudioFileStreamer + AudioQueue 可以满足(4) 在线播放且带有音效处理:使

加速播放视频提高学习效率

现在网上很多免费课程供我们学习,因此看视频学习会花去我们不少时间,对于很多视频教程,我们都可以通过调节其播放速度达到节省时间而又不影响学习效果的目的,以下以Coursera上的课程为例,如下图,我将播放速度调到1.5X倍速,因此时间节省了50%.当然这个调节根据不同的视频而有不同的设定,有的甚至可以调到2X,只要不影响自己听和理解老师所讲的内容即可.

IOS 音频播放

iOS音频播放 (一):概述 Audio Playback in iOS (Part 1) : Introduction 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖引玉,另一方面也是希望能帮助国内其他的iOS开发者和爱好者少走弯路(我自己就遇到了不少的坑=.=). 本篇为<iOS音频播放>系列的第一篇,主要将对iOS下实现音频播放的方法进行概述. 基础 先来简单了解一

管理音频播放(摘自Android官方培训课程中文版(v0.9.5))

编写:kesenhoo - 原文:http://developer.android.com/training/managing-audio/index.html 如果我们的应用能够播放音频,那么让用户能够以自己预期的方式控制音频是很重要的.为了保证良好的用户体验,我们应该让应用能够管理当前的音频焦点,因为这样才能确保多个应用不会在同一时刻一起播放音频. 在学习本系列课程中,我们将会创建可以对音量按钮进行响应的应用,该应用会在播放音频的时候请求获取音频焦点,并且在当前音频焦点被系统或其他应用所改变