使用c++搭建声纹(说话人和说话人性别)识别服务。
环境&依赖库
1.ubuntu18.04 gcc/g++7.5
2.freesr
编译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)