Linux应用编程

您所在的位置:网站首页 linux系统怎么读取音频数据文件夹 Linux应用编程

Linux应用编程

2024-07-11 01:39| 来源: 网络整理| 查看: 265

文章目录 前言Linux语音识别alsa-lib简介:安装alsa-lib库:libcurl库简介:安装libcurl库:API调用录音相关概念样本长度(Sample)声道数(channel)帧(frame)周期(period)采样率(Sample rate) 打开声卡设备设置硬件参数初始化硬件参数结构对象设置访问类型设置数据编码格式设置采样频率设置声道加载硬件参数 使声卡设备处于准备状态读/写数据 文件IO打开音频文件向音频文件写数据 信号多线程主循环实现效果及注意事项实现效果注意事项 源代码(转载请注明出处)

前言

本篇分享:

Linux应用编程之音频编程,使用户可以录制一段音频并进行识别(语音转文字)

环境介绍:

系统:Ubuntu 22.04 声卡:电脑自带

Linux语音识别

实现目标 :用户可以录制一段音频并进行识别(语音转文字) 知识点 : C语言、文件IO、信号、多线程、alsa-lib 库、libcurl库、API调用

alsa-lib简介:

alsa-lib是一套 Linux 应用层的 C 语言函数库,为音频应用程序开发提供了一套统一、标准的接口,应用程序只需调用这一套 API 即可完成对底层声卡设备的操控,譬如播放与录音。 用户空间的alsa-lib对应用程序提供了统一的API 接口,这样可以隐藏驱动层的实现细节,简化了应用 程序的实现难度、无需应用程序开发人员直接去读写音频设备节点。所以,主要就是学习alsa-lib库函数的使用、如何基于alsa-lib库函数开发音频应用程序。 alsa-lib官方说明文档:https://www.alsa-project.org/alsa-doc/alsa-lib/

安装alsa-lib库:

在ubuntu系统上安装alsa-lib库方法:

sudo apt-get install libasound2-dev libcurl库简介:

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。

官网地址:http://curl.haxx.se/

安装libcurl库:

在ubuntu系统上安装alsa-lib库方法:

sudo apt-get install libcurl4-openssl-dev API调用

该程序使用的是百度语音识别API

在这里插入图片描述

注册后领取免费额度及创建中文普通话应用(创建前先领取免费额度(180 天免费额度,可调用约 5 万次左右) )

在这里插入图片描述

创建好应用后,可以得到API key和Secret Key(填写到程序中的相应位置)

在这里插入图片描述

调用API相关说明可在图中所示位置查阅,Demo代码中有多种语言的调用示例可以参考,使用C语言的话也可以直接在本项目程序上面直接更改(项目源代码在最下方):

在这里插入图片描述

API相关c文件中 需要修改的有asrmain.c和相应的头文件: asrmain.c的fill_config函数中(该函数我已修改,原本无file参数,根据实际情况使用),需要修改的有:音频文件格式,API Key以及Secret Key:

RETURN_CODE fill_config(struct asr_config *config,char *file) { // 填写网页上申请的appkey 如 g_api_key="g8eBUMSokVB1BHGmgxxxxxx" char api_key[] = "填写网页上申请的API key"; // 填写网页上申请的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx" char secret_key[] = "填写网页上申请的Secret Key"; // 需要识别的文件 char *filename = NULL; filename = file; // 文件后缀仅支持 pcm/wav/amr 格式,极速版额外支持m4a 格式 char format[] = "pcm"; char *url = "http://vop.baidu.com/server_api"; // 可改为https // 1537 表示识别普通话,使用输入法模型。其它语种参见文档 int dev_pid = 1537; char *scope = "audio_voice_assistant_get"; // # 有此scope表示有asr能力,没有请在网页里勾选,非常旧的应用可能没有 …………

结合音频录制的程序使用的话,还需要删除示例中的main函数,run函数中的相关初始化以及API调用函数需要根据实际情况重新调整调用位置。本项目总体按照:获取token(在程序开始时获取一次即可,根据官网可知获取的token有效期为30天,重新获取token则之前获取的token失效)->调用API->得到返回结果->解析结果->反馈给用户。

录音

实现音频录制分为以下步骤:打开声卡设备->设置硬件参数->读写数据

相关概念 样本长度(Sample) 样本长度,样本是记录音频数据最基本的单元,样本长度就是采样位数,也称为位深度(Bit Depth、Sample Size、 Sample Width)。是指计算机在采集和播放声音文件时,所使用数字声音信号的二进制位数,或者说每个采样样本所包含的位数(计算机对每个通道采样量化时数字比特位数),通常有 8bit、16bit、24bit 等。 声道数(channel) 分为单声道(Mono)和双声道/立体声(Stereo)。1 表示单声道、2 表示立体声。 帧(frame) 帧记录了一个声音单元,其长度为样本长度与声道数的乘积,一段音频数据就是由若干帧组成的。把所有声道中的数据加在一起叫做一帧,对于单声道:一帧 = 样本长度 * 1;双声道:一帧 = 样本长度 * 2。对于本程序中,样本长度为16bit 的单声道来说,一帧的大小等于:16 * 1 / 8 = 2 个字节。 周期(period) 周期是音频设备处理(读、写)数据的单位,换句话说,也就是音频设备读写数据的单位是周期,每一次读或写一个周期的数据,一个周期包含若干个帧;譬如周期的大小为 1024 帧,则表示音频设备进行一次读或写操作的数据量大小为 1024 帧。一个周期其实就是两次硬件中断之间的帧数,音频设备每处理(读或写)完一个周期的数据就会产生一个中断,所以两个中断之间相差一个周期,即每一次读或写一个周期的数据。对于本程序中,一周期的大小 = 一周期帧数 * 一帧大小 = 一周期帧数 * (样本长度 * 声道数 / 字节长度) = 1024 * (16 * 1 / 8) = 2048个字节。 采样率(Sample rate) 也叫采样频率,是指每秒钟采样次数,该次数是对于帧而言。 打开声卡设备

函数:

函数原型: int snd_pcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode) 参数: pcmp -- 表示一个 PCM 设备,snd_pcm_open 函数会打开参数 name 所指定的设备,实例化 snd_pcm_t 对象,并将对象的指针通过 pcmp 返回出来。 name -- 参数 name 指定 PCM 设备的名字。alsa-lib 库函数中使用逻辑设备名而不是设备文件名,命名方式为"hw:i,j",i 表示声卡的卡号,j 则表示这块声卡上的设备号 SND_PCM_STREAM_CAPTURE:表示从设备采集音频数据。 stream --SND_PCM_STREAM_PLAYBACK表示播放,SND_PCM_STREAM_CAPTURE则表示采集。 mode -- 最后一个参数 mode 指定了 open 模式,通常情况下将其设置为0,表示默认打开模式,默认情况下使用阻塞方式打开设备; 作用: 打开音频采集卡硬件。

代码:

/*打开音频采集卡硬件,并判断硬件是否打开成功,若打开失败则打印出错误提示*/ // SND_PCM_STREAM_PLAYBACK 输出流 // SND_PCM_STREAM_CAPTURE 输入流 if ((err = snd_pcm_open(&capture_handle, "hw:0", SND_PCM_STREAM_CAPTURE, 0))


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3