C++搭建http服务实现声纹识别

本文介绍了如何在Ubuntu 18.04环境下,使用freesr库和libevent构建声纹识别服务,涉及初始化日志、创建监听、处理POST请求及识别过程。重点展示了如何解析JSON数据并返回结果给客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用c++搭建声纹(说话人和说话人性别)识别服务。

环境&依赖库

1.ubuntu18.04 gcc/g++7.5

2.freesr

3.libevent-2.1.12-stable

编译libevent

服务端

主要流程

建立监听服务=>响应请求:解码数据(json->base64->buffer)=>识别=>识别结果构建json=>返回给客户端


void init()
{
    try
    {
        // Create a daily logger - a new file is created every day on 0:00am
        daily_logger = spdlog::daily_logger_mt("freesr-server", "logs/daily.txt", 0, 0);
        // https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
        daily_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e][process %P][thread %t][%n][%l] %v");
        daily_logger->set_level(spdlog::level::debug);
        daily_logger->flush_on(spdlog::level::info);
        
        //spdlog::set_level(spdlog::level::debug);

        //spdlog::flush_every(std::chrono::seconds(3));
    }
    catch(const spdlog::spdlog_ex &ex)
    {
        daily_logger->error("freesr server initialization failed: {0}", ex.what());
        // fprintf(stderr,)
    }

    daily_logger->info("freesr-server version:[{0:d}.{1:d}.{2:d}]", int(FLIPSERVER_VERSION_MAJOR), int(FLIPSERVER_VERSION_MINOR), int(FLIPSERVER_VERSION_PATCH));
    daily_logger->info("freesr-server sha-1:[{0}]", hash.c_str());
}
int main()
{
    init();

    SpeakerRecognizer spk(16000);

    bool init_status = spk.Init();
    if(!init_status)
    {
        daily_logger->warn("Failed to init Speaker Recognizer");
        return -1;
    }
    daily_logger->info("Finished init Speaker Recognizer");
     

	struct evhttp *http_server = NULL;
	short http_port = 8888;
	const char *http_addr = "0.0.0.0";
	
	event_init();

	http_server = evhttp_start(http_addr, http_port);
	if(http_server == NULL)
	{
        daily_logger->warn("Failed to start http server[{0}:{1:d}]", http_addr, http_port);
		return -1;
	}
	
    daily_logger->info("Start http server[{0}:{1:d}]", http_addr, http_port);

    evhttp_set_allowed_methods(http_server, EVHTTP_REQ_POST);
	// timeout (second)
	evhttp_set_timeout(http_server, 5);
    
    evhttp_set_cb(http_server, "/compare", compare, (void *)(&spk));
    
	
    // repeat listen
	event_dispatch();
	evhttp_free(http_server);

    // Release and close all loggers
    spdlog::drop_all();
    //spd::drop("freesr-server");
	return 0;
}

监听服务

利用shell脚本进行监听,如果服务端程序崩溃则自动重启

客户端

客户端使用python进行测试

import base64
import requests
import json

def getByte(fpath):
    with open(fpath, 'rb') as f:
        byte_data = base64.b64encode(f.read())
        data_str = byte_data.decode('ascii')
    return data_str
 

file1_base64 = getByte('BAC009S0002W0122.wav')
file2_base64 = getByte('BAC009S0002W0123.wav')

data = {"format":"wav", "file1":file1_base64, "file2": file2_base64}

headers = {"User-Agent":"analog-user", "Content-Type":"application/json"}
r = requests.post(url='http://127.0.0.1:8888/compare', headers=headers, data=json.dumps(data), timeout=5)


print('result',r.text)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值