【即时通讯项目】环境搭建9——语言平台

目录

一.语言平台

1.1.安装语音识别SDK

1.2.ffmpeg安装

1.3.使用示例

二.封装


一.语言平台

1.1.安装语音识别SDK

我们登录百度云:

我们实名认证之后,百度云会赠送我们一定额度的免费资源。

我们进入第二步

随便起个名字即可

在您创建完毕应用后,平台将会分配给您此应用的相关凭证,主要为AppID、API Key、 Secret Key。以上三个信息是您应用实际开发的主要凭证,请您妥善保管。

然后我们需要进行SDK下载

下载完之后我们把它放到我们的云服务器里面

我们怎么使用它呢?我们回官网看看

这里面会告诉你怎么进行使用

我们去它的官网看看调用示例

cpp 复制代码
// 请替换您下载的C++SDK路径
#include "aip-cpp-sdk-x.x.x/speech.h

void ASR(aip::Speech* client);

void ASR_url(aip::Speech* client);

void TTS(aip::Speech* client);

int main()
{
    // 务必替换百度云控制台中新建百度语音应用的 Api Key 和 Secret Key
    aip::Speech * client = new aip::Speech("填写appid", "请填写Api Key", "请填写Secret Key");
    
    // 打印详细请求结果,可以打开查看详细请求内容
    client->setDebug(false);
    
    // 语音识别调用
    ASR(client);

    // 语音识别调用
    TTS(client);
    
    // 语音识别极速版调用
    TTS(client);

    
    return 0;
}

/**
 * ASR语音识别示例
 */
void ASR(aip::Speech* client) {
    std::map<std::string, std::string> options;
    std::string file_content;
    aip::get_file_content("../assets/16k_test.pcm", &file_content);
    Json::Value result = client->recognize(file_content, "pcm", 16000, options);
    std::cout << "语音识别本地文件结果:" << std::endl << result.toStyledString();
}

/**
 * ASR语音识别极速版示例
 */
void ASR_PRO(aip::Speech* client) {
    std::map<std::string, std::string> options;
    std::string file_content;
    aip::get_file_content("../assets/16k_test.pcm", &file_content);
    Json::Value result = client->recognize_pro(file_content, "pcm", 16000, options);
    std::cout << "语音识别极速版本地文件结果:" << std::endl << result.toStyledString();
}

/**
 * TTS语音合成示例
 */
void TTS(aip::Speech* client) {
    std::ofstream ofile;
    std::string file_ret;
    std::map<std::string, std::string> options;
    options["spd"] = "5";
    options["per"] = "2";
    ofile.open("./tts.mp3", std::ios::out | std::ios::binary);
    Json::Value result = client->text2audio("百度语音合成测试", options, file_ret);
    // 如果file_ret为不为空则说明合成成功,返回mp3文件内容
    if (!file_ret.empty())
    {
        // 合成成功保存文件
        ofile << file_ret;
        std::cout << "语音合成成功,打开目录下的tts.mp3文件听听看" << std::endl;
    } else {
        // 合成出错,打印错误信息
        std::cout << result.toStyledString();
    }
}

这个还是很容易懂的。

1.2.ffmpeg安装

百度语音识别服务对输入的音频数据有严格的格式要求:音频必须为 PCM 编码 ,采样率 16000 Hz ,位深 16bit ,采用小端序 (Little Endian)存储,且为单声道。这种格式保证了识别引擎能够高效准确地处理音频内容。

FFmpeg 是一个非常强大且广泛使用的多媒体处理工具,可以轻松帮助您满足上述格式要求。无论您是将已有的各种格式音频文件(如 MP3、WAV、AAC 等)转换为符合百度接口规范的 PCM 文件,还是从麦克风实时采集声音并编码为指定格式,FFmpeg 都能通过简洁的命令行操作快速完成,极大地简化音频数据的预处理流程。

点击Download,

下载之后进行解压

然后我们进去

进去bin目录,

将bin目录的完整路径复制下来,我们去

点击属性

点击高级系统设置

我们win+R输入cmd,打开命令行

输入

cpp 复制代码
ffmpeg --version

这就表明我们安装成功了。

您可以使用以下命令将普通音频文件转换为符合要求的 PCM 数据:

cpp 复制代码
ffmpeg -i 原始音频文件.mp3 -ar 16000 -ac 1 -f s16le -acodec pcm_s16le 输出文件.pcm
  • -i 原始音频文件.mp3:-i 指定输入文件,后面紧跟源文件名(这里是 原始音频文件.mp3)。FFmpeg 会根据扩展名自动判断文件格式,支持 MP3、WAV、AAC 等多种常见格式。
  • -ar 16000:-ar 设置输出音频的采样率,单位为 Hz。16000 表示输出采样率为 16000 Hz,这是百度语音识别接口要求的采样率。
  • -ac 1:-ac 设置输出音频的声道数。1 表示输出单声道(mono)。如果源文件是多声道,FFmpeg 会自动混音为单声道,符合百度接口的"单声道"要求。
  • -f s16le:-f 指定输出文件的封装格式。s16le 代表 signed 16-bit little-endian,即 16 位有符号整型、小端字节序的原始 PCM 数据。这个格式不包含任何文件头(如 WAV 头),是纯粹的音频裸数据。
  • **-acodec pcm_s16le:**明确指定音频编码器为 pcm_s16le,即 16 位小端 PCM 编码器。这个选项告诉 FFmpeg 使用何种算法对音频进行编码。
  • **输出文件.pcm:**指定输出文件的路径和名称。生成的文件是纯 PCM 数据,没有元信息,通常使用 .pcm 或 .raw 扩展名以便识别。

该命令将自动完成采样率转换、声道合并及 PCM 编码输出,确保数据格式与百度语音识别接口完美兼容。

1.3.使用示例

首先我们自己先录一段音(我说的是 "今天有什么可以帮到你" )

cpp 复制代码
ffmpeg -i D:\FFmpeg\test.m4a -ar 16000 -ac 1 -f s16le -acodec pcm_s16le D:\FFmpeg\test.pcm

我们得到了我们的这个文件

我们就把这个文件上传到我们的服务器那里去

我们写下面这个代码

cpp 复制代码
// 包含百度AI语音识别SDK的头文件
#include "aip-cpp-sdk/speech.h"

/**
 * 语音识别函数,传入一个已初始化的aip::Speech客户端对象
 * @param client 百度AI语音客户端对象,用于调用识别接口
 */
void asr(aip::Speech &client)
{
    // 声明一个字符串变量,用于存储读取到的音频文件内容
    std::string file_content;
    // 调用SDK提供的工具函数,读取指定路径的PCM音频文件内容到file_content中
    aip::get_file_content("test.pcm", &file_content);

    // 调用百度语音识别API,传入音频数据、音频格式(pcm)、采样率(16000)及其他参数(此处为默认值)
    // 返回的结果是一个Json::Value对象,包含识别结果或错误信息
    Json::Value result = client.recognize(file_content, "pcm", 16000, aip::null);
    // 检查返回结果中的错误码(err_no)是否为0,0表示成功,非0表示出错
    if (result["err_no"].asInt() != 0) {
        // 如果出错,输出错误信息(err_msg)到控制台
        std::cout << result["err_msg"].asString() << std::endl;
        // 返回,结束函数执行
        return;
    }

    // 识别成功,从结果中提取第一个识别结果的文本(result是一个数组,通常包含多个候选结果,这里取第一个)
    std::cout << result["result"][0].asString() << std::endl;
}

/**
 * 主函数:程序入口
 */
int main()
{
    // 设置百度AI应用的APPID、API Key和Secret Key
    // 这些信息在百度AI开放平台创建应用后获取
    std::string app_id = "换成你自己的";
    std::string api_key = "换成你自己的";
    std::string secret_key = "换成你自己的";

    // 创建一个aip::Speech客户端对象,传入认证信息,用于后续调用语音识别接口
    aip::Speech client(app_id, api_key, secret_key);

    // 调用语音识别函数,传入客户端对象
    asr(client);

    // 程序正常结束,返回0
    return 0;
}

怎么样?是不是和我说的是一模一样的。

二.封装

首先我们需要将我们的这个下载的sdk放到我们项目的专门放置第三方库的位置这里来

然后我们进行编写我们的asr.hpp

"ASR"通常代表"Automatic Speech Recognition"(自动语音识别)

cpp 复制代码
// 防止头文件重复包含
#pragma once

// 包含百度AI语音识别SDK头文件
#include "../third/include/aip-cpp-sdk/speech.h"
// 包含日志记录器头文件
#include "logger.hpp"

// 命名空间 IMS,用于封装即时通讯相关的功能
namespace IMS {

// ASRClient类:封装了百度AI的语音识别功能,提供语音识别服务
class ASRClient {
public:
    // 智能指针类型别名,方便管理ASRClient对象的生命周期
    using ptr = std::shared_ptr<ASRClient>;

    // 构造函数:初始化百度AI语音识别客户端
    // @param app_id: 百度AI应用的APP_ID
    // @param api_key: 百度AI应用的API_KEY
    // @param secret_key: 百度AI应用的SECRET_KEY
    ASRClient(const std::string &app_id,
              const std::string &api_key,
              const std::string &secret_key)
        : _client(app_id, api_key, secret_key) {}  // 初始化内部aip::Speech对象

    // recognize函数:对输入的语音数据进行识别
    // @param speech_data: 语音数据(PCM格式)
    // @param err: 输出参数,用于返回错误信息(如果识别失败)
    // @return: 识别出的文本字符串,如果失败则返回空字符串
    std::string recognize(const std::string &speech_data, std::string &err) 
    {
        // 调用百度SDK的recognize方法进行语音识别
        // 参数:语音数据、音频格式(pcm)、采样率(16000)、可选参数(这里使用aip::null)
        Json::Value result = _client.recognize(speech_data, "pcm", 16000, aip::null);

        // 检查识别结果中是否包含错误码(err_no不为0表示失败)
        if (result["err_no"].asInt() != 0) {
            // 记录错误日志,输出错误信息
            LOG_ERROR("语音识别失败:{}", result["err_msg"].asString());
            // 将错误信息赋值给输出参数err
            err = result["err_msg"].asString();
            // 返回空字符串表示识别失败
            return std::string();
        }

        // 识别成功,返回识别结果中的第一个文本(result是一个数组,通常第一个元素即为识别结果)
        return result["result"][0].asString();
    }

private:
    aip::Speech _client;  // 百度AI语音识别客户端对象
};

} // namespace IMS

没什么好说的,就是很简单的。

测试

对于这个测试,我们也是借助之前

cpp 复制代码
#include "../../../common/asr.hpp"
#include <gflags/gflags.h>

// 定义命令行参数:语音平台应用ID,默认值为 "122401972"
DEFINE_string(app_id, "122401972", "语音平台应用ID");
// 定义命令行参数:语音平台API密钥,默认值为 "W2LUcGvz0JwCkf9F63751t6K"
DEFINE_string(api_key, "W2LUcGvz0JwCkf9F63751t6K", "语音平台API密钥");
// 定义命令行参数:语音平台加密密钥,默认值为 "wYWjnuJZY0tgFeKeWYURACMsI5nm6qtI"
DEFINE_string(secret_key, "wYWjnuJZY0tgFeKeWYURACMsI5nm6qtI", "语音平台加密密钥");

// 定义命令行参数:程序的运行模式,false 表示调试模式,true 表示发布模式
DEFINE_bool(run_mode, false, "程序的运行模式,false-调试; true-发布;");
// 定义命令行参数:发布模式下日志输出文件路径,默认为空(输出到控制台)
DEFINE_string(log_file, "", "发布模式下,用于指定日志的输出文件");
// 定义命令行参数:发布模式下日志输出等级,默认为0(通常表示最低级别)
DEFINE_int32(log_level, 0, "发布模式下,用于指定日志输出等级");

// 程序主函数
int main(int argc, char *argv[])
{
    // 解析命令行参数,将识别的参数从 argc/argv 中移除
    google::ParseCommandLineFlags(&argc, &argv, true);

    // 根据运行模式、日志文件路径和日志等级初始化日志系统
    IMS::init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);

    // 创建 ASRClient 对象,传入从命令行参数获取的应用ID、API密钥和加密密钥
    IMS::ASRClient client(FLAGS_app_id, FLAGS_api_key, FLAGS_secret_key);

    // 定义一个字符串变量用于存储音频文件内容
    std::string file_content;
    // 调用百度 SDK 提供的工具函数,读取当前目录下的 "16k.pcm" 文件内容到 file_content 中
    aip::get_file_content("16k.pcm", &file_content);

    std::string err;  // 用于接收错误信息

    // 调用 ASRClient 的 recognize 方法对音频数据进行语音识别,返回识别结果字符串
    std::string res = client.recognize(file_content,err);
    // 如果识别结果为空,表示识别失败,程序返回 -1 退出
    if (res.empty()) {
        LOG_ERROR("语音识别失败:{}", err);  // 可以记录错误信息
        return -1;
    }
    // 将识别结果输出到标准输出
    std::cout << res << std::endl;
    // 程序正常退出,返回 0
    return 0;
}

这个就很简单了

相关推荐
小温冲冲2 小时前
ReSharper 在 Visual Studio 中的详细配置指南
c++·ide·qt·visual studio
深蓝轨迹3 小时前
IDEA 常用编辑快捷键清单
java·ide·intellij-idea
还是大剑师兰特3 小时前
VSCode 代码格式化完整解决方案(插件 + 配置 + 快捷键)
ide·vscode·编辑器
小锅锅氩4 小时前
JavaDay01
java·ide·intellij-idea
帅得不敢出门4 小时前
MacOS安装VSCode在QEMU上模拟跑FreeRtos
ide·vscode·macos·freertos·rtos
Sahadev_4 小时前
macOS 解决 AirDrop 传输应用“已损坏“问题,以sublime为例
macos·策略模式·sublime text
无限进步_4 小时前
【C++】字符串中的字母反转算法详解
开发语言·c++·ide·git·算法·github·visual studio
pop_xiaoli4 小时前
【iOS】alloc & init & new源码阅读
macos·ios·objective-c·cocoa·xcode
挂科边缘4 小时前
字节跳动 AI 原生 IDE Trae 安装与上手图文教程
ide·人工智能·trae