开源语音格式speex教程

这两天在折腾语音的东西,实现类似微信上对讲机的功能,做了两个Demo,一种使用lib-amr库用amr格式实现的,这个网上有现成的教程,所以还是比较好实现的。另一个是用的speex库,这个提的人很多,但是出教程的不多,恨透那个爱图腾的教程了,很多不明所以的地方,让我们这些新手很困惑呀,网上晃了3天终于可以搞出个像样的Demo了。Demo中我将一个录好的.caf格式的PCM音频 编码成speex格式 然后将speex格式的再转回PCM。当然Demo只是实现了音频的编码解码,并没有增加过多的功能。

本人测试了下,60秒的录音(8khz,单声道),转成最小格式的amr大小为39k和微信一分钟录音文件的大小差不多,speex格式最小18k但是比较模糊,可以接受的大小是30k,所以还是会比amr格式的小点,另外speex库可以对声音进行比如降噪,增益,静音判定等处理。但是考虑到Android支持amr格式的音频,wp也支持,所以最后还是选了转成amr格式的方案,可惜apple现在已经不支持amr了,所以才需要转码,下面我就和大家一起一步一步做Demo。

编译静态库:

这个着实让我费解了一天,其实linux下的C/C++程序员搞这个应该很轻松,但是我的那些都还给老师了,按照网上的教程愣是折腾了很久。

首先下载你所需要的源文件,因为speex是依赖ogg库的,所以先下载ogg库,这里我一并打包上传了,大家也可以去官网上下载。

源文件:  libogg-1.3.0.zip (496 K)   speex-1.2rc1.tar (3890 K) 

因为编译是在命令行模式下进行的,打开终端,首先进入ogg所在的文件夹,我们先编译ogg

补充下,我用的是xcode4.4.1,大家根据自己xcode命令也需要略微调整,4.2的编译教程网上有,这里我就不重复了。

在终端键入以下内容:

1.ogg-i386的库

./configure -prefix=/Users/你的电脑用户名/Desktop/speexLibrary/libogg-1.3.0/i386 -host=i386-apple-darwin -build=x86_64-apple-darwin11.3.0 CC="/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 -std=c99 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/"

make

make install

make clean (一定要clean,不然后面编译的都是第一次的编译的内容)

2、ogg-armv6的库

./configure -prefix=/Users/你的电脑用户名/Desktop/speexLibrary/libogg-1.3.0/armv6 -host=armv6-apple-darwin -build=x86_64-apple-darwin11.3.0 CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 -std=c99 -arch armv6 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/"

make

make install

make clean 

3、ogg-armv7的库

./configure -prefix=/Users/你的电脑用户名/Desktop/speexLibrary/libogg-1.3.0/armv7 -host=armv7-apple-darwin -build=x86_64-apple-darwin11.3.0 CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 -std=c99 -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/"

make

make install

make clean

接着编译speex库:

1.speex-i386的库

./configure -prefix=/Users/你的电脑用户名/Desktop/speexLibrary/speex-1.2rc1/i386 -host=i386-apple-darwin -disable-shared -enable-static -disable-oggtest -disable-fixed-point -enable-float-api -build=x86_64-apple-darwin11.3.0 -with-ogg=/Users/你的电脑用户名/Desktop/speexLibrary/libogg-1.3.0/i386 CC="/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 -std=c99 -arch i386 -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/"

make

make install

make clean 

2.speex-armv6的库

./configure -prefix=/Users/你的电脑用户名/Desktop/speexLibrary/speex-1.2rc1/armv6 -host=armv6-apple-darwin -disable-shared -enable-static -disable-oggtest -enable-fixed-point -disable-float-api -build=x86_64-apple-darwin11.3.0 -with-ogg=/Users/你的电脑用户名/Desktop/speexLibrary/libogg-1.3.0/armv6 CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 -std=c99 -arch armv6 -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/"

make

make install

make clean

3.speex-armv7的库

./configure -prefix=/Users/你的电脑用户名/Desktop/speexLibrary/speex-1.2rc1/armv7 -host=armv7-apple-darwin -disable-shared -enable-static -disable-oggtest -enable-fixed-point -disable-float-api -build=x86_64-apple-darwin11.3.0 -with-ogg=/Users/你的电脑用户名/Desktop/speexLibrary/libogg-1.3.0/armv7 CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/llvm-gcc-4.2 -std=c99 -arch armv7 -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/"

make

make install

make clean 

最后合并静态库,进入speexLibrary文件夹,终端键入:

lipo -create i386/lib/libogg.a armv6/lib/libogg.a armv7/lib/libogg.a -output libogg.a

lipo -create i386/lib/libspeex.a armv6/lib/libspeex.a armv7/lib/libspeex.a -output libspeex.a

lipo -create i386/lib/libspeexdsp.a armv6/lib/libspeexdsp.a armv7/lib/libspeexdsp.a -output libspeexdsp.a 

好了,这里应该已经编译完成了。如果合并静态库不成功,那么请检查上述步骤(我当时就是忘了make clean,导致编译的都是i386的.a文件).你可以lipo -info xxx.a文件,后面会显示库内文件使用的平台信息,正常显示为i386,armv6,armv7那么就成功了。当然打包好的库我也一并上传了,方便大家下载。

打包好的speex库:  _speex.zip (821 K)

下面开始我们的工程:

新建一个工程,导入我们的静态库,我是将包直接拖到工程里面的,记得设置静态库的查找路径,我当时就是忘了设置路径,结果就是各种找不到头文件。导入完以后就进入主题了。

为了方便我已经录好一个60秒的.caf文件,怎么录制的?此处省略一千字…

详细的Demo解释我就不说明了,大家看Demo,我这里讲一下步骤

1.我们需要从.caf文件中将文件头去掉得到纯的PCM数据

2.将纯的PCM数据编码成纯speex格式

3.给纯speex格式数据添加文件头

 

---------------分割一下-------------

4.解码speex格式数据(带文件头的)成纯PCM格式

5.添加wav格式文件头

6.将wav数据写入文件导出caf文件(导出的文件可以在模拟下该工程的tmp文件夹内找到,一个caf文件,点击可以播放出声音).

下面是我给出的Demo,请结合speex官方的用户手册对照,用户手册上有编码解码的C语言示例代码,一定要仔细研究。

我的Demo  TEST_Speex_001.zip (1585 K) 希望对大家有帮助

 

社区原帖:http://www.cocoachina.com/bbs/read.php?tid=114755

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Speex全双工数字对讲机是一种基于开源技术的通信设备,具有实时语音传输和接收的能力。全双工意味着用户可以同时进行讲话和听取对方讲话,类似于真实的对话模式。开源指的是该设备的设计和代码开放给公众,任何人都可以自由查看、修改和分发。 开源一个Speex全双工数字对讲机的好处是多方面的。首先,开源能够促进设备的技术创新和改进,因为任何人都可以通过参与开源社区贡献自己的想法和代码。这将推动对讲机的功能和性能的不断优化。 其次,开源能够加速技术普及和推广。任何人都可以获取和使用Speex全双工数字对讲机的源代码,从而促进了对该设备的理解和应用。开源还为各种应用场景提供了更广泛的适应性,能够满足不同用户的需求。 另外,开源可以提高系统的安全性。通过公开源代码,社区成员可以检查和修复可能存在的漏洞,确保系统的稳定性和可靠性。这也为开发者提供了一个协作的环境,可以获得其他人的意见和建议,以进一步完善设备。 总的来说,开源一个Speex全双工数字对讲机可以促进技术发展、推广应用和增加设备的安全性。这种开源方式利益众多,共同促进了技术社区的发展和进步。 ### 回答2: Speex全双工数字对讲机是一种基于开源技术的对讲机系统。开源意味着该系统的源代码是公开可用的,可以被任何人查看、使用和修改。 开源一个Speex全双工数字对讲机,首先需要获取Speex全双工数字对讲机的源代码。由于Speex是一个开源音频压缩编解码库,我们可以在Speex的官方网站或其他开源代码库上找到相关源代码。 接下来,我们可以运用开发工具和编程语言(如C++等)对源代码进行修改和定制。我们可以添加新的功能或改进现有功能,例如增加对新的音频编码算法的支持,改善音质和网络连接稳定性等。 在开源过程中,与其他开发者共享和讨论是非常重要的。我们可以将改进后的代码上传到开源社区的代码仓库,例如GitHub等,供其他人查看、下载和贡献代码。这种开放的合作方式可以使我们受益于其他开发者的经验和意见,以获得更好的代码质量和功能。 最后,我们还可以编写文档或教程,帮助其他人理解和使用这个开源Speex全双工数字对讲机。这样有助于扩大对该系统的认知,并吸引更多开发者参与共同的开源项目。 总结而言,开源一个Speex全双工数字对讲机需要获取源代码并进行修改,与其他开发者共同合作,最终获得改进后的代码,并为社区提供文档和教程等支持。这种开源方式能够促进创新、合作和知识共享,为数字对讲机领域的发展带来积极影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值