AnalyticDB向量检索+AI 实战:声纹识别( 二 )
CREATE EXTENSION IF NOT EXISTS open_analytic;CREATE EXTENSION IF NOT EXISTS fastann;
3.1 建表
我们可以建立一个表来保存所有说话人的声音和声音的特征 , 后续我们可以从这个表中搜索说话人 。
CREATE TABLE speaker_table (speaker_id TEXT NOT NULL,# 说话人idaudio BYTEA NOT NULL, # 声音文件feature REAL[] NOT NULL, # 声音特征向量PRIMARY KEY (question));
注:*左右滑动阅览
3.2 创建索引
我们可以为特征向量列创建向量检索索引 。
CREATE INDEX speaker_table_index ON speaker_table USING ann (feature) WITH (dim = 512);
注:*左右滑动阅览
3.3 创建声纹识别算法pipeline
通过以下sql , 我们可以在数据库中创建声纹特征提取的算法模型 。
SELECT open_analytic.pipeline_create('speaker_feature_extractor');
注:*左右滑动阅览
3.4 获取说话人声纹特征
通过以下sql可以使用3.3创建的pipeline 。 这个UDF的输入是pipeline名称和目标文本 。 输出是一个说话人声音的特征向量 。
# 通过声音文件识别SELECT open_analytic.pipeline_run_dist_random('speaker_feature_extractor',<声音文件>);
注:*左右滑动阅览
3.5 说话人声纹特征导入AnalyticDB
获取声音特征后, 我们可以使用一下sql来讲数据插入3.1创建的表中 。
INSERT INTO speaker_table VALUES (<说话人id>,<声音文件>, <声音特征向量>);
注:*左右滑动阅览
3.6 在数据库中搜索最相似的的人
通过以下sql , 我们可以在声音特征库中搜索最相似的说话人 。 然后我们可以根据特征间距离是否满足预设的阈值来判断是否是同一个人 。
SELECT speaker_id, l2_distance(feature,<声音特征向量>) ORDER BY feature <-> <声音特征向量>LIMIT 10;
注:*左右滑动阅览
3.7 比较两个声音是否为同一个人
我们还可以提取出两个人的声音特征然后直接计算二者的距离来判断这两个声音是否来自同一个说话人 。 SQL如下
SELECTl2_distance(feature1,feature2);
04 AnalyticDB介绍
分析型数据库(AnalyticDB)是阿里云上的一种高并发低延时的PB级实时数据仓库 , 可以毫秒级针对万亿级数据进行即时的多维分析透视和业务探索 。 AnalyticDB for MySQL 全面兼容MySQL协议以及SQL:2003 语法标准, AnalyticDB forPostgreSQL 支持标准 SQL:2003 , 高度兼容 Oracle 语法生态 。
向量检索和非结构化数据分析是AnalyticDB的进阶功能 。 目前两款产品都包含向量检索功能, 可以支持人脸, 人体, 车辆等的相似查询和推荐系统 。 AnalyticDB在真实应用场景中可以支持10亿级别的向量数据的查询, 毫秒级别的响应时间 。 AnalyticDB已经在多个城市的重大项目中大规模部署 。
在一般的包含向量检索的的应用系统中, 通常开发者会使用向量检索引擎(例如Faiss)来存储向量数据, 然后使用关系型数据库存储结构化数据 。 在查询时也需要交替查询两个系统, 这种方案会有额外的开发工作并且性能也不是最优 。 AnalyticDB支持结构化数据和非结构化数据(向量)的检索 , 仅仅使用SQL接口就可以快速的搭建起以图搜图或者图片+结构化数据混合检索等功能 。 AnalyticDB的优化器在混合检索场景中会根据数据的分布和查询的条件选择最优的执行计划 , 在保证召回的同时 , 得到最优的性能 。 AnalyticDB向量版采用了多项创新性技术, 这些技术在我们的论文 AnalyticDB-V: A Hybrid Analytical Engine Towards Query Fusion for Structured and Unstructured Data