发明内容
本发明要解决的技术问题是提供一种实现卡拉OK功能的方法及装置,能够实现多个移动终端上的用户共同进行卡拉OK演唱。
为解决上述技术问题,本申请提供了一种实现卡拉OK功能的方法,包括:
语音服务器接收多个演唱用户发送的语音数据,所述语音数据中携带有时序标识;
所述语音服务器将接收到的语音数据透传给除发送方之外的其他演唱用户,并对语音数据进行缓存;
所述语音服务器根据所述时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,将混音数据发送给旁听用户。
进一步地,所述语音数据是所述演唱用户侧的移动终端在同时启动伴奏播放及音频录制的情况下,将时间阈值之后录制的音频数据消除移动终端播放的伴奏以及添加时序标识后得到的数据,所述时间阈值是播放延迟时间与录音延迟时间之和。
进一步地,所述方法还包括:
所述语音服务器在接收演唱用户发送的语音数据之前,接收所述多个演唱用户发送的点播请求,在接收到点播请求后,同时向发送点播请求的演唱用户发送开始演唱指令,指示发送点播请求的演唱用户在接收到开始演唱指令后开始播放伴奏。
进一步地,所述时序标识为序号或者时间戳。
进一步地,所述根据所述时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,包括:
在缓存的语音数据的数量达到数量阈值之前接收到全部演唱用户针对同一时序标识的语音数据,则将该时序标识对应的全部语音数据以及所述发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时接收到部分演唱用户针对同一时序标识的语音数据,则将已接收到的该时序标识对应的语音数据以及所述发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时未接收到演唱用户针对同一时序标识的语音数据,则将所述发生时间对应的伴奏数据作为所述混音数据。
进一步地,一种实现卡拉OK功能的装置,包括:接收单元、透传单元、缓存单元和混音单元,其中:
所述接收单元,用于接收多个演唱用户发送的语音数据,所述语音数据中携带有时序标识;
所述透传单元,用于将所述接收单元接收到的语音数据透传给除发送方之外的其他演唱用户;
所述缓存单元,用于对所述接收单元接收到的语音数据进行缓存;
所述混音单元,用于根据所述时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,将混音数据发送给旁听用户。
进一步地,所述语音数据是所述演唱用户侧的移动终端在同时启动伴奏播放及音频录制的情况下,将时间阈值之后录制的音频数据消除移动终端播放的伴奏以及添加时序标识后得到的数据,所述时间阈值是播放延迟时间与录音延迟时间之和。
进一步地,还包括启动单元,其中:
所述启动单元,用于在所述接收单元接收演唱用户发送的语音数据之前,接收所述多个演唱用户发送的点播请求,在接收到点播请求后,同时向发送点播请求的演唱用户发送开始演唱指令,指示发送点播请求的演唱用户在接收到开始演唱指令后开始播放伴奏。
进一步地,所述时序标识为序号或者时间戳。
进一步地,所述混音单元根据所述时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,包括:
在缓存的语音数据的数量达到数量阈值之前接收到全部演唱用户针对同一时序标识的语音数据,则将该时序标识对应的全部语音数据以及所述发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时接收到部分演唱用户针对同一时序标识的语音数据,则将已接收到的该时序标识对应的语音数据以及所述发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时未接收到演唱用户针对同一时序标识的语音数据,则将所述发生时间对应的伴奏数据作为所述混音数据。
综上所述,本申请能够使多个移动终端上的用户共同进行卡拉OK演唱,多个用户之间可以通过对唱、合唱等方式共同进行演唱,旁听用户可以实时收听演唱用户共同演唱的歌曲,本申请可以使多个用户在不同的地方共同进行卡拉OK演唱,摆脱了多人共同卡拉OK对地域的要求,使多个用户之间能够随时随地的共同进行卡拉OK演唱,用户能够方便的与其他用户共同进行卡拉OK演唱。
具体实施方式
本申请中参考卡拉OK的多个演唱用户在本地播放伴奏,并且录制音频数据,并且将只包含演唱用户的声音的语音数据上传到语音服务器,语音服务器接收多个演唱用户发送的语音数据,语音数据中都携带有时序标识,时序标识用于表明语音的发生时间。语音服务器将语音数据发送给除发送方之外的其他演唱用户,并对接收到的语音数据进行缓存,根据时序标识将发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,将混音数据发送给旁听用户。
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
如图1所示,本申请的实现卡拉OK功能的方法,包括:
步骤101:语音服务器接收多个演唱用户发送的语音数据,语音数据中携带有时序标识;
本申请中语音数据是演唱用户侧的移动终端在同时启动伴奏播放及音频录制的情况下,将时间阈值之后录制的音频数据消除移动终端播放的伴奏以及添加时序标识后得到的数据,时间阈值是播放延迟时间与录音延迟时间之和。
本申请中在开始卡拉OK之前,演唱用户需要先下载要演唱歌曲的伴奏文件,即演唱用户需要在本地进行伴奏,在开始演唱的时候各自在本地播放伴奏。播放伴奏的过程包括:移动终端的mp3Mgr线程调用flvCodec模块的API将伴奏文件(MP3)解码成伴奏数据(PCM数据),并且保存在系统放音缓存中,开始卡拉OK以后,向mediaDev线程写入伴奏数据,伴奏是一帧一帧的写入,每次写入的伴奏数据的时长为40ms。
移动终端在启动伴奏播放的同时启动音频录制,录制的音频数据会缓存在系统录音缓存中,系统录音缓存在装满数据之后,才能从中获取数据,mediaDev线程获取音频数据回调给mp3Mgr线程,因为系统录音缓存在装满数据之后才能获取数据,故系统录制的音频数据不能被第一时间获取到。
从上述内容可以看出,从开始进行卡拉OK,即开始播放伴奏数据,到用户真正听到伴奏数据存在延迟,即播放延迟时间,因为用户是根据伴奏进行演唱,故用户一定是在听到伴奏后才开始演唱,从用户开始演唱,到得到用户演唱的音频数据也存在延迟,即录音延迟时间,因此,从开始进行伴奏播放,到得到用户的语音数据是有延迟的,只有去掉这个延迟才能保证语音服务器得到的语音数据能够与伴奏同步。因此,本申请中设置时间阈值,时间阈值是播放延迟时间与录音延迟时间之和,对时间阈值之后录制的音频数据消除移动终端播放的伴奏以及添加时序标识作为演唱用户的语音数据。
本申请中由于需要语音服务器需要将演唱用户的语音数据转发给其他的演唱用户,其他的演唱用户的本地也在播放伴奏,如果收到带有伴奏的数据,就会出现多层伴奏,就会听到本地的伴奏和其他演唱用户的伴奏的重音,因此本申请中演唱用户发送到语音服务器的语音数据中不包含伴奏,语音数据仅包含录制的人声。由于移动终端的麦克风录制回来的音频数据中既包含扬声器播放的伴奏也包含演唱用户的人声,所以需要对录制回来的音频数据消除移动终端播放的伴奏,才能得到演唱用户演唱的声音。本申请中可以采用回音消除从录制的音频数据中消除移动终端播放的伴奏。
本申请中语音服务器需要将发生时间相同的语音对应的语音数据以及相应的伴奏数据进行混音,再发送给旁听用户,因此,语音数据中需要包含时序标识,时序标识用于指示语音数据中的语音的发生时间。时序标识可以是序号或者时间戳等。
下面以在语音数据中携带序号为例进行说明。
每个语音数据都会附带一个序号,移动终端发送给语音服务器的语音数据(语音数据包)的语音时长都是40ms,移动终端在发送语音数据时给每个语音数据都加上一个序号,该序号为自增类型。即每发送一个语音数据序号进行递增。
序号和语音数据的打包方式如下:
type(4bit) |
序号(16bit) |
语音数据 |
type:占4个位标识语音数据的类型,可以是普通的语音数据,也可以是本申请的多个演唱用户共同演唱时的语音数据。例如:type==0,表示普通的语音数据;type==1表示本申请的多个演唱用户共同演唱时的语音数据。
如果语音数据是本申请的多个演唱用户共同演唱时的语音数据,在type后面紧跟着的就是序号,序号为16bit,即16位(两个字节),16位最大可以表示65535,而一首歌的时长如果是5分钟,5*60*1000得到5分钟对应的毫秒数,40ms是每个语音数据的语音时长,那么5*60*1000/40=7500,7500是总共需要发送的数据包的数量,即需要的序号数量,7500远远小于65535。
序号相较于时间戳占用的空间较小,消耗的带宽也更小,因此,本申请中优先采用序号。
由于从播放伴奏到录制到演唱用户的音频数据存在一个延迟,故本申请中在同时启动伴奏播放和音频录制的情况下,对时间阈值之后录制的音频数据进行回声消除以及添加序号的处理,这样才能保证演唱用户的语音数据和伴奏的对齐。如果不等待时间阈值就会将非演唱用户的语音数据发送到语音服务器,导致语音服务器混音后得到的混音数据发生演唱声音与伴奏不对齐的问题。
本申请中语音服务器在接收演唱用户发送的语音数据之前,接收多个演唱用户发送的点播请求,在接收到点播请求后,同时向发送点播请求的演唱用户发送开始演唱指令,指示发送点播请求的演唱用户在接收到开始演唱指令后开始播放伴奏。
在进行演唱之前用户需要一个准备的过程,需要向语音服务器发送一个点播请求,语音服务器在收到全部演唱用户进行相同歌曲的点播请求后,可以开始倒计时一指定时间(如倒计时5s),之后语音服务器会同时向全部演唱用户发送开始演唱指令,演唱用户在收到语音服务器的开始演唱指令后开始播放伴奏。
步骤102:语音服务器将接收到的语音数据透传给除发送方之外的其他演唱用户,并对语音数据进行缓存;
本申请中语音服务器将接收到的语音数据直接透传给除发送方之外的其他演唱用户,通过这种方式来最大的减少延迟,因为共同演唱的用户之间需要有最小的延迟,只有这样才能使演唱用户之间配合的更加顺畅。
语音服务器在接收到语音数据后,进行如下处理:
(一)进行缓存,为后续的混音做准备;
(二)直接在接收到语音数据的线程将演唱用户上传的语音数据直接发送给其他演唱用户,不对语音数据进行解码和编码等,以最大的减少延迟。由于采用这种透传的方式,所以共同参加演唱的用户只能听到演唱用户的声音,无法听到其他旁听用户的声音。
步骤103:语音服务器根据时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,将混音数据发送给旁听用户。
由于用户网络状况不同,不同的用户之间的网络延迟并不一致,在保证用户演唱的同步性上存在一定的困难,即便相同时间演唱的歌曲,因为网络延迟,语音数据到达服务器的时间也不一样。这样直接导致的问题是即使在演唱用户看来演唱是同步的,但是对于旁听用户来说,收听到的演唱声也并不同步,如此就带来比较差的用户体验。
因为网络延迟和网络丢包是客观存在的问题,因此只能尽量减少因为网络所带来的延时和较差的用户体验,本申请中因为演唱用户的网络不同,即便是相同时间唱的声音上传到服务器也不一定在同一时间,故服务器先开辟一个缓冲buffer,收到演唱用户上传的语音数据后,先将语音数据缓冲起来,在收到其他演唱用户上传的具有相同时序标识的语音数据后,才将时序标识相同的语音数据以及服务器缓存的伴奏数据进行混音,并且将混音数据发送给旁听用户。语音服务器在开始卡拉OK之前将伴奏文件解码成PCM的伴奏数据并且进行缓存。
本申请中根据时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,包括:
在缓存的语音数据的数量达到数量阈值之前接收到全部演唱用户针对同一时序标识的语音数据,则将该时序标识对应的全部语音数据以及发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时接收到部分演唱用户针对同一时序标识的语音数据,则将已接收到的该时序标识对应的语音数据以及发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时未接收到演唱用户针对同一时序标识的语音数据,则将发生时间对应的伴奏数据作为所述混音数据。
由于存在丢包的情况,因此本申请中采用缓冲限制,数量阈值如可以设置为100,如果缓冲超过100个语音数据包,只收到部分演唱用户针对同一时序标识的语音数据,则将收到的部分语音数据与相应的伴奏数据进行混音;如果全部演唱用户针对一时序标识的语音数据都丢失了,则只将相应的伴奏数据发送给旁听用户;如果收到全部演唱用户针对同一时序标识的语音数据,则将全部的语音数据和相应的伴奏数据进行混音并且发送给旁听用户。
如图2所示,本申请还提供了一种实现卡拉OK功能的装置,包括:接收单元、透传单元、缓存单元和混音单元,其中:
接收单元,用于接收多个演唱用户发送的语音数据,语音数据中携带有时序标识;
透传单元,用于将接收单元接收到的语音数据透传给除发送方之外的其他演唱用户;
缓存单元,用于对接收单元接收到的语音数据进行缓存;
混音单元,用于根据时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,将混音数据发送给旁听用户。
语音数据是演唱用户侧的移动终端在同时启动伴奏播放及音频录制的情况下,将时间阈值之后录制的音频数据消除移动终端播放的伴奏以及添加时序标识后得到的数据,时间阈值是播放延迟时间与录音延迟时间之和。
本申请的装置还包括启动单元,其中:
启动单元,用于在接收单元接收演唱用户发送的语音数据之前,接收多个演唱用户发送的点播请求,在接收到点播请求后,同时向发送点播请求的演唱用户发送开始演唱指令,指示发送点播请求的演唱用户在接收到开始演唱指令后开始播放伴奏。
时序标识为序号或者时间戳。
混音单元根据时序标识将缓存的发生时间相同的语音对应的语音数据以及发生时间对应的伴奏数据进行混音,包括:
在缓存的语音数据的数量达到数量阈值之前接收到全部演唱用户针对同一时序标识的语音数据,则将该时序标识对应的全部语音数据以及发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时接收到部分演唱用户针对同一时序标识的语音数据,则将已接收到的该时序标识对应的语音数据以及发生时间对应的伴奏数据进行混音;或者,
在缓存的语音数据的数量达到数量阈值时未接收到演唱用户针对同一时序标识的语音数据,则将发生时间对应的伴奏数据作为混音数据。
本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
尽管上文对本发明进行了详细说明,但是本发明不限于此,本技术领域技术人员可以根据本发明的原理进行各种修改。因此,凡按照本发明原理所作的修改,都应当理解为落入本发明的保护范围。