一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

解码方法、装置和计算机可读存储介质与流程

2022-02-25 18:17:56 来源:中国专利 TAG:


1.本公开涉及计算机技术领域,特别涉及一种解码方法、装置和计算机可读存储介质。


背景技术:

2.随着人工智能的高速发展,人工智能客服机器人的应用越来越广泛,涉及语音识别技术,而语音识别又依赖说实时的音频流的输入,作为语音识别的前置条件。通常在人工智能客服领域,需要对用户同机器人讲的话进行识别,用户讲的话会作为音频流实时传入系统中,因此在对音频流的实时解码成为一个要解决的问题。
3.对音频流进行实时解码需要获取音频的格式、参数等,这些信息一般包含在头部信息中。


技术实现要素:

4.发明人发现:实际人工智能客服的电话场景中,音频需要进行流式处理,即将音频文件分为音频流片段进行传输,此时第一个流片段或前几个流片段中会包含音频编码时产生的头部信息。之后的流片段中不包含头部信息,尤其在使用ffmpeg工具针对不同的流片段进行解码的过程中,会因为大部分流片段不包含头部信息无法解码而返回错误信息,无法满足实时音频流在人工智能客服场景中实时解码的需求。
5.本公开所要解决的一个技术问题是:如何实现对音频流的实时解码。
6.根据本公开的一些实施例,提供的一种解码方法,包括:对接收的数据流的流片段进行缓存,其中,数据流包括音频流;对缓存的流片段进行解析,直至解析得到头部信息;将头部信息进行保存;根据头部信息对接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码。
7.在一些实施例中,对缓存的流片段进行解析,直至解析得到头部信息包括:确定当前缓存的流片段的数据长度是否达到预设帧长度;在当前缓存的流片段的数据长度达到预设帧长度的情况下,对预设帧长度的数据进行解析;确定是否成功解析得到头部信息;在未成功解析得到头部信息的情况下,将预设帧长度增加预设值,更新预设帧长度;重复执行上述步骤,直至解析得到头部信息。
8.在一些实施例中,对缓存的流片段进行解析,直至解析得到头部信息还包括:在当前缓存的流片段的数据长度未达到预设帧长度的情况下,等待接收到下一个流片段进行缓存后,重新执行确定缓存的流片段的数据长度是否达到预设帧长度。
9.在一些实施例中,根据头部信息对接收的各个流片段中音频流的流片段进行解码包括:根据头部信息确定音频帧的长度;根据音频帧的长度,对接收到的各个流片段中音频流的流片段区分不同的音频帧进行解码。
10.在一些实施例中,根据音频帧的长度,对接收到的各个流片段中音频流的流片段区分不同的音频帧进行解码包括:对音频流的当前的流片段,根据音频帧的长度,按照数据
封装格式的顺序划分音频帧;对当前的流片段中完整的音频帧进行解码;确定音频流的当前的流片段的尾部数据是否属于不完整的音频帧;在音频流的当前的流片段的尾部数据属于不完整的音频帧的情况下,将不完整的音频帧缓存;等待接收到音频流的下一个流片段后,将下一个流片段与不完整的音频帧进行拼接,得到拼接后的流片段;将拼接后的流片段作为音频流的当前的流片段,重复执行上述步骤,直至完成对音频流的最后一个流片段的解码。
11.在一些实施例中,根据头部信息对接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码包括:在根据头部信息对音频流的当前的流片段进行解码失败的情况下,对当前的流片段或者当前的流片段以及当前的流片段之后的流片段进行解析,直至解析得到新的头部信息;根据新的头部信息对接当前的流片段之后的流片段进行解码,直至完成对音频流的解码。
12.在一些实施例中,对缓存的流片段进行解析,直至解析得到头部信息包括:调用ffmpeg中的open avformat方法对缓存的流片段进行解析,直至解析得到头部信息。
13.在一些实施例中,根据头部信息对接收的各个流片段中音频流的流片段进行解码包括:根据头部信息确定数据流是否包括音频流以外的其他数据流;在数据流包括音频流以外的其他数据流的情况下,将其他数据流与音频流分离;根据头部信息确定音频流的格式信息;根据音频流的格式信息将音频流的各个流片段转码为原始音频流;将原始音频流按照预设码率重新采样。
14.在一些实施例中,调用ffmpeg中的分离流separate stream方法将其他数据流与音频流分离;调用ffmpeg中的解析格式parse format方法根据头部信息确定音频流的格式信息,根据音频流的格式信息将音频流的各个流片段转码为原始音频流,并将原始音频流按照预设码率重新采样。
15.根据本公开的另一些实施例,提供的一种解码装置,包括:缓存模块,用于对接收的数据流的流片段进行缓存,其中,数据流包括音频流;头部信息解析模块,用于对缓存的流片段进行解析,直至解析得到头部信息;头部信息保存模块,用于将头部信息进行保存;解码模块,用于根据头部信息对接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码。
16.根据本公开的又一些实施例,提供的一种解码装置,包括:处理器;以及耦接至处理器的存储器,用于存储指令,指令被处理器执行时,使处理器执行如前述任意实施例的解码方法。
17.根据本公开的再一些实施例,提供的一种非瞬时性计算机可读存储介质,其上存储有计算机程序,其中,该程序被处理器执行时实现前述任意实施例的解码方法。
18.本公开首先对接收的数据流的流片段进行缓存,对缓存的流片段持续进行解析,直至解析得到头部信息,将头部信息进行保存,利用头部信息对后续接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码。本公开的方法可以实现音频流的实时解码,满足实时音频流在人工智能客服场景中实时解码的需求。
19.通过以下参照附图对本公开的示例性实施例的详细描述,本公开的其它特征及其优点将会变得清楚。
附图说明
20.为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
21.图1示出本公开的一些实施例的解码方法的流程示意图。
22.图2示出本公开的一些实施例的音频流的结构示意图。
23.图3示出本公开的另一些实施例的解码方法的流程示意图。
24.图4示出本公开的一些实施例的解码装置的结构示意图。
25.图5示出本公开的另一些实施例的解码装置的结构示意图。
26.图6示出本公开的又一些实施例的解码装置的结构示意图。
具体实施方式
27.下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本公开及其应用或使用的任何限制。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
28.本公开提供一种解码方法可以用于人工智能客服场景中对音频流实时解码,下面结合图1~图3进行描述。
29.图1为本公开解码方法一些实施例的流程图。如图1所示,该实施例的方法包括:步骤s102~s108。
30.在步骤s102中,对接收的数据流的流片段进行缓存。
31.数据流包括音频流,还可以包括音频流之外的其他数据流,例如,视频流等,音频流和其他数据流混合的情况下,后续步骤中需要进行不同流的分离,具体在之后的实施例中描述。数据流在传输过程中被划分为多个流片段,每个流片段可以被封装成数据包(package)进行传输。解码装置(执行本公开解码方法的装置)接收到数据包后,对数据包进行解析得到流片段,对流片段进行缓存。
32.可以基于ffmpeg api实现本公开的方案。首先可以初始化avformat和avio context两个模块(init avformat/init avio context),分别用来进行后续的头部信息解析以及音频流的读取,对流片段进行缓存可以调用buffer stream方法。
33.在步骤s104中,对缓存的流片段进行解析,直至解析得到头部信息。
34.头部(header)信息例如包括:音频流的格式信息和参数,参数例如包括:采样率、位深、通道数、压缩比等至少一项,不限于所举示例。由于流片段的划分是不确定的,有可能一个流片段中就包含完整的头部信息,也有可能一个流片段只包含部分头部信息,需要多个流片段才能得到完整的头部信息。在一些实施例中,每次缓存一个流片段之后,尝试对之前缓存的所有流片段进行解析,确定是否成功解析得到头部信息,在未成功解析得到头部信息的情况下,继续对下一个流片段进行缓存,重复上述过程,直至成功解析得到头部信息。
35.在另一些实施例中,确定当前缓存的流片段的数据长度是否达到预设帧长度;在当前缓存的流片段的数据长度达到预设帧长度的情况下,对预设帧长度的数据进行解析;确定是否成功解析得到头部信息;在未成功解析得到头部信息的情况下,将预设帧长度增加预设值,更新预设帧长度;重复执行上述步骤,直至解析得到头部信息。
36.预设帧长度可以是根据历史音频流中头部信息的长度统计得到的。每次缓存一个流片段之后可以判断当前缓存的流片段的数据长度是否达到预设帧长度。在当前缓存的流片段的数据长度未达到预设帧长度的情况下,等待接收到下一个流片段进行缓存后,重新执行确定缓存的流片段的数据长度是否达到预设帧长度的步骤。直至当前缓存的流片段的数据长度达到预设帧长度,则尝试对预设帧长度的数据进行解析。例如,预设帧长度为200字节,则由最开始缓存的流片段的第一个字节开始至200字节的长度的数据,作为待解析数据,对待解析数据进行解析确定是否成功解析得到头部信息。如果成功解析得到头部信息,则停止头部信息的解析过程。如果解析头部信息失败,预设帧长度增加预设值,更新预设帧长度,例如,将200字节增加至300字节。之后由确定当前缓存的流片段的数据长度是否达到预设帧长度的步骤开始重新执行。
37.可以调用ffmpeg中的open avformat方法对缓存的流片段进行解析,直至解析得到头部信息。上述方法中通过持续对缓存的流片段进行头部解析处理的尝试,避免了在头部信息被划分至不同流片段的情况下,无法成功解析的问题。通过预设帧长度的判断和修正,减少了解析次数,提高效率。
38.在步骤s106中,将头部信息进行保存。
39.在步骤s108中,根据头部信息对接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码。
40.在数据流只包含音频流的情况下,利用头部信息直接对接收到的每个流片段进行解码。在数据流包含音频流和其他数据流的情况下,需要进行流的分离操作。在一些实施例中,根据头部信息确定数据流是否包括音频流以外的其他数据流;在数据流包括音频流以外的其他数据流的情况下,将其他数据流与音频流分离。例如,调用ffmpeg中的separate stream(分离流)方法将其他数据流与音频流分离。
41.将接收的每个流片段中的音频流的流片段分离出来后,利用头部信息对音频流的流片段进行解码。在一些实施例中,根据头部信息确定音频流的格式信息;根据音频流的格式信息将音频流的各个流片段转码为原始音频流;将原始音频流按照预设码率重新采样。重新采样的码率符合播放设备的码率,便于播放。例如,调用ffmpeg中的parse format(解析格式)方法根据头部信息确定音频流的格式信息,根据音频流的格式信息将音频流的各个流片段转码为原始音频流,并将原始音频流按照预设码率重新采样。
42.在音频流只包含一个完整的音频文件的情况下,利用保存的头部信息可以实现对整个音频流的正确解码。在音频流包含多个完整的音频文件的情况下,不同音频文件的头部信息可能会不同,在解码过程中出现失败。针对该问题,在一些实施例中,在根据头部信息对音频流的当前的流片段进行解码失败的情况下,对当前的流片段或者当前的流片段以及当前的流片段之后的流片段进行解析,直至解析得到新的头部信息;根据新的头部信息对接当前的流片段之后的流片段进行解码,直至完成对音频流的解码。
43.解析获取新的头部信息的方法可以参考前述实施例中解析头部信息的方法。将新
的头部信息进行保存,可以删除原来保存的头部信息,利用新的头部信息对之后接收的流片段进行解码,直至完成对音频流的解码。
44.上述实施例的方法首先对接收的数据流的流片段进行缓存,对缓存的流片段持续进行解析,直至解析得到头部信息,将头部信息进行保存,利用头部信息对后续接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码。上述实施例的方法可以实现音频流的实时解码,满足实时音频流在人工智能客服场景中实时解码的需求。
45.尤其针对使用ffmpeg工具实现音频解码的场景,上述实施例的方法通过音频流buffer缓存流片段,提取头部信息(包含音频流的格式信息和参数等)解析后进行保存,根据头部信息可以解析出音频流的格式信息和参数,通过音频流的格式信息可以获取到解码器类型,并在之后接收的音频流的流片段中,使用之前缓存的解码器类型链接对应的解码器引擎,并根据音频流的参数去对之后的流片段进行解码尝试,这种情况下,对于使用标准的音频编码器生成的音频流,可以做到实时解码,解决了ffmpeg工具由于大部分流片段中不包含头部信息而无法解码的问题。
46.音频流传输过程中,如果传输的流片段并非按照音频帧长度的整数倍进行切分,可能存在不完整音频帧的问题。如图2所示,音频流的流片段1包含音频帧(frame)1、音频帧2以及音频帧3的一部分,而流片段2包含音频帧3的另一部分,此时使用解码器根据头部信息对流片段1和2解码时会报错。针对上述问题,本公开还提供一种解决方法。在一些实施例中,根据头部信息确定音频帧的长度;根据音频帧的长度,对接收到的各个流片段中音频流的流片段区分不同的音频帧进行解码。可以根据头部信息包含的参数确定音频帧的长度,例如,根据采样率、位深、通道数等确定音频帧的长度,可以参考现有技术,具体不再赘述。
47.进一步,如图3所示,根据头部信息对接收的各个流片段中音频流的流片段进行解码包括:步骤s302~s316。
48.在步骤s302中,根据头部信息确定音频帧的长度。
49.在步骤s304中,如果头部信息所在的流片段还包含音频数据,则将该流片段作为音频流的当前的流片段。
50.在步骤s306中,对当前的流片段,根据音频帧的长度,按照数据封装格式的顺序划分音频帧。
51.例如,数据在流片段中按照从左到右或者从前到后的顺序排列。如图2所示,流片段1划分音频帧后,尾部数据属于不完整的音频帧3。
52.在步骤s308中,对当前的流片段中完整的音频帧进行解码。
53.在步骤s310中,确定当前的流片段是否为最后一个流片段,如果是,则停止,否则执行步骤s312。
54.在步骤s312中,确定音频流的当前的流片段的尾部数据是否属于不完整的音频帧。如果是,则执行步骤s314,否则执行步骤s313。
55.在步骤s313中,等待接收到音频流的下一个流片段后,将下一个流片段作为当前的流片段,返回步骤s306重新开始执行。
56.在步骤s314中,将不完整的音频帧缓存。
57.在步骤s316中,等待接收到音频流的下一个流片段后,将下一个流片段与不完整的音频帧进行拼接,得到拼接后的流片段,作为当前的流片段,并返回步骤s306重新开始执

58.如图2所示,将流片段2与流片段1中音频帧3的前半部分进行拼接,组成完整的帧。
59.上述实施例的方法,考虑对不完整的帧信息缓存到下个流片段接收后再进行拼接处理,解决了流片段中包含不完整的音频帧的情况下,无法正确解码的问题。
60.本公开还提供一种解码装置,下面结合4进行描述。
61.图4为本公开解码装置的一些实施例的结构图。如图4所示,该实施例的装置40包括:缓存模块410,头部信息解析模块420,头部信息保存模块430,解码模块440。
62.缓存模块410用于对接收的数据流的流片段进行缓存,其中,数据流包括音频流。
63.头部信息解析模块420用于对缓存的流片段进行解析,直至解析得到头部信息。
64.在一些实施例中,头部信息解析模块420用于确定当前缓存的流片段的数据长度是否达到预设帧长度;在当前缓存的流片段的数据长度达到预设帧长度的情况下,对预设帧长度的数据进行解析;确定是否成功解析得到头部信息;在未成功解析得到头部信息的情况下,将预设帧长度增加预设值,更新预设帧长度;重复执行上述步骤,直至解析得到头部信息。
65.在一些实施例中,头部信息解析模块420用于在当前缓存的流片段的数据长度未达到预设帧长度的情况下,等待接收到下一个流片段进行缓存后,重新执行确定缓存的流片段的数据长度是否达到预设帧长度。
66.在一些实施例中,头部信息解析模块420用于调用ffmpeg中的open avformat方法对缓存的流片段进行解析,直至解析得到头部信息。
67.头部信息保存模块430用于将头部信息进行保存。
68.解码模块440用于根据头部信息对接收的各个流片段中音频流的流片段进行解码,直至完成对音频流的解码。
69.在一些实施例中,解码模块440用于根据头部信息确定音频帧的长度;根据音频帧的长度,对接收到的各个流片段中音频流的流片段区分不同的音频帧进行解码。
70.在一些实施例中,解码模块440用于对音频流的当前的流片段,根据音频帧的长度,按照数据封装格式的顺序划分音频帧;对当前的流片段中完整的音频帧进行解码;确定音频流的当前的流片段的尾部数据是否属于不完整的音频帧;在音频流的当前的流片段的尾部数据属于不完整的音频帧的情况下,将不完整的音频帧缓存;等待接收到音频流的下一个流片段后,将下一个流片段与不完整的音频帧进行拼接,得到拼接后的流片段;将拼接后的流片段作为音频流的当前的流片段,重复执行上述步骤,直至完成对音频流的最后一个流片段的解码
71.在一些实施例中,解码模块440用于在根据头部信息对音频流的当前的流片段进行解码失败的情况下,对当前的流片段或者当前的流片段以及当前的流片段之后的流片段进行解析,直至解析得到新的头部信息;根据新的头部信息对接当前的流片段之后的流片段进行解码,直至完成对音频流的解码。
72.在一些实施例中,解码模块440用于根据头部信息确定数据流是否包括音频流以外的其他数据流;在数据流包括音频流以外的其他数据流的情况下,将其他数据流与音频流分离;根据头部信息确定音频流的格式信息;根据音频流的格式信息将音频流的各个流片段转码为原始音频流;将原始音频流按照预设码率重新采样。
73.在一些实施例中,解码模块440用于调用ffmpeg中的分离流separate stream方法将其他数据流与音频流分离;调用ffmpeg中的解析格式parse format方法根据头部信息确定音频流的格式信息,根据音频流的格式信息将音频流的各个流片段转码为原始音频流,并将原始音频流按照预设码率重新采样。
74.本公开的实施例中的解码装置可各由各种计算设备或计算机系统来实现,下面结合图5以及图6进行描述。
75.图5为本公开解码装置的一些实施例的结构图。如图5所示,该实施例的装置50包括:存储器510以及耦接至该存储器510的处理器520,处理器520被配置为基于存储在存储器510中的指令,执行本公开中任意一些实施例中的解码方法。
76.其中,存储器510例如可以包括系统存储器、固定非易失性存储介质等。系统存储器例如存储有操作系统、应用程序、引导装载程序(boot loader)、数据库以及其他程序等。
77.图6为本公开解码装置的另一些实施例的结构图。如图6所示,该实施例的装置60包括:存储器610以及处理器620,分别与存储器510以及处理器520类似。还可以包括输入输出接口630、网络接口640、存储接口650等。这些接口630,640,650以及存储器610和处理器620之间例如可以通过总线660连接。其中,输入输出接口630为显示器、鼠标、键盘、触摸屏等输入输出设备提供连接接口。网络接口640为各种联网设备提供连接接口,例如可以连接到数据库服务器或者云端存储服务器等。存储接口650为sd卡、u盘等外置存储设备提供连接接口。
78.本领域内的技术人员应当明白,本公开的实施例可提供为方法、系统、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机可用程序代码的计算机可用非瞬时性存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
79.本公开是参照根据本公开实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解为可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
80.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
81.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
82.以上所述仅为本公开的较佳实施例,并不用以限制本公开,凡在本公开的精神和
原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献