设想你走进一座庞大的“声音图书馆”,馆内收藏着数百万首歌曲,但你不记得歌名,只记得那句洗脑的旋律。别急,图书馆门口有两个窗口。左边的“哼唱窗口”:你把调子哼给管理员听,他闭眼点头,凭旋律的起伏形状从书架间找到那首歌;右边的“语音窗口”:你若能说清歌名、歌手或一句歌词,管理员会飞快地把它抄成纸条,再到分类目录里去查。两个窗口,同一座图书馆,对应着音频检索的两条技术路径:哼唱搜索(用旋律特征匹配歌曲)与语音搜索(把语音转成文字再检索)。数字世界里没有“管理员”,有的是一行行算法——从音高提取、旋律编码,到音频指纹、语音识别,再到向量相似度计算。这篇文章,我们就跟着这位看不见的管理员,把两个窗口背后的原理看个明白。
学习音频检索,你将理解多模态检索中“声音”模态的完整解法:分清哼唱与语音两条路径,才能在音乐 App、智能助手等产品中设计出体验自然、召回准确的声音检索功能。
可视化演示
展示哼唱搜索的旋律提取与DTW匹配流程,以及语音搜索的ASR转写过程,对比两种音频检索模式的技术路径和适用场景。
本节配有交互动效(进入视口后自动加载,约 3KB)。
哼唱搜索旋律匹配 哼唱音频提取音高轮廓序列 DTW算法与数据库旋律动态对齐 dist=DTW(query,DB) 最小距离即为匹配歌曲
两种检索入口
声音图书馆的门口立着一块告示牌:“哼得出旋律,走左窗;说得清歌名、歌手或歌词,走右窗。”管理员会根据你能提供的信息形态,选择完全不同的找歌路线。左窗的路线是“用一段声音直接匹配另一段声音”;右窗的路线是“先把声音变成文字,再按文字找声音”。两条路线走向同一座曲库,但沿途经过的技术站点截然不同。
在技术世界里,这块告示牌就是检索引擎的“入口路由”。用户发出的音频查询 q 有两种形态:一段哼唱的旋律波形,或一句自然语言的语音指令。目标只有一个:从曲库 R 中返回最匹配的歌曲 r*。无论哪条路线,整个系统都可以用一个统一公式概括——对所有候选歌曲计算查询与歌曲的匹配分,取分数最高者作为答案。
公式里的 Score(q, r) 是“分水岭”。在哼唱搜索中,Score 通常来自旋律方向轮廓的相似度、节奏周期的一致性;在语音搜索中,Score 则来自音频转成文本后的相关性,例如倒排索引的 TF-IDF 分数或文本向量的余弦相似度。入口路由决定了后续所有模块的选型,所以在设计音频检索引擎时,第一步永远是问:用户能提供什么样的查询?
回到图书馆,告示牌并非一成不变:如果用户哼得含糊,管理员会请他走语音窗试着报出歌名;如果连歌名都忘了,只好回哼唱窗多哼两句。现实中,产品也常常让两种路径互为兜底——哼唱无结果时引导用户说歌词,语音无结果时引导用户哼旋律。入口路由不是单选题,而是一道“组合题”。
- 输入与候选q 是用户拿来的查询音频,r 是曲库 R 中的候选歌曲。
- 打分函数Score(q, r) 计算查询与候选的匹配程度,两条技术路线在此分道扬镳。
- 取分数最高者argmax 表示遍历曲库中所有歌曲,返回得分最高的那一首。
旋律轮廓编码
左边的哼唱窗口有位神奇的管理员:你五音不全,他依然能对上歌。秘密在于,他从不在乎你唱的是 C 还是 D,只在乎音高“往上走了还是往下走了”。就像我们看一座山的剪影,不关心绝对高度,只关心线条起伏。这套“只看起伏”的做法,正是哼唱搜索得以在现实中成立的关键。
技术要复刻这位管理员,第一步是把哼唱波形转成一串音符的音高值,第二步再计算音符之间的相对变化方向。这里的音高 p_i 常用 MIDI 半音数字表示,差值为正说明旋律上行,为负说明下行,为零说明持平。只保留差值的符号,就得到了旋律方向轮廓。
方向轮廓的形式化定义如下:Δp_i = sign(p_{i+1} − p_i)。sign 函数把整数差值压成 +1、0、−1 三值。这带来一个巨大好处——跑调时绝对音高会整体偏移(例如整段低两度),但相邻音符的升降关系基本不变;即使偶尔唱错一个音,也只会影响局部方向,不会摧毁整条轮廓。因此,轮廓比对天然具备“音准容差”。
回到图书馆,管理员口袋里揣的并不是乐谱,而是一叠“小箭头卡”。每首歌对应一串箭头,用户哼几句,他也抽出一串箭头,两串箭头从头到尾对一对,相同越多,越可能是同一首。因为只比方向不比绝对音高,所以哪怕用户在浴室里把《小星星》唱成了《小星星变奏曲》,箭头大体还是那组箭头。
- 音高序列p_i 表示第 i 个音符的音高值,用半音数字表示。
- 相邻音高差p_{i+1} − p_i 的正负反映旋律走向。
- 符号化sign 函数把差值映射为三个离散状态。
- 整串轮廓所有方向拼接后,就是参与匹配的旋律轮廓。
音频指纹技术
哼唱窗口先解决“你唱得不准怎么办”,但曲库管理员还有一个烦恼:几百万首歌,总不可能把每首都的波形背下来。于是他把每首歌浓缩成一张“迷你身份证”,上面只记录几个能量特征。比对时不再翻乐谱,而是快速刷身份证。这张身份证,就是音频指纹。
音频指纹的目标是用紧凑的摘要表示一段音频,让同一首歌的不同录音(不同音质、不同起始时间、不同响度)都能被迅速认出,同时让不同的歌尽量区分开。它不是“压缩版音频”,而是“可辨识的摘要”——不需要还原波形,只需要能区分歌。
经典做法分三步:切片、变换、聚合。先把音频切成短帧(约几十毫秒),对每一帧做傅里叶变换(把波形拆解成不同频率成分的数学工具)得到频谱 X(f);然后把频率轴划分为若干子带 b,在每个子带内累加能量:E_b = Σ_{f∈b}|X(f)|²。每个子带能量构成指纹的一个分量。为什么是能量?因为峰值频段能量分布对同一首歌稳定,且不依赖相位信息,天然抗噪。识别时,查询指纹与库内指纹做快速匹配,例如利用哈希表实现常数时间候选查找。
馆长的指纹库里,每首歌的身份证都很小,几千首加起来才顶得上一首歌的体积。识别时只需要从数据库里“刷证”,瞬间锁定几首候选,再回到原曲做确认。这套“先指纹粗筛、再细节精排”的思路,是音频检索在海量曲库上保持实时性的基石。
- 频谱系数X(f) 是一帧音频在频率 f 处的复振幅。
- 能量谱模平方 |X(f)|² 表示该频率的能量强度。
- 子带累加把子带 b 内所有频率的能量求和,得到一维指纹分量。
语音搜索流程
右窗的语音管理员画风完全不同——他先掏出一个速记本,把你说的“播放小星星”飞快写成字条,再拿着字条去目录室查。声音在检索阶段已经“功成身退”,真正起作用的是字条上的文字。这一步“听写”,在计算机里叫自动语音识别(ASR)。
语音搜索的技术路线因此分为两段:前半段是把语音波形 X 转成文本 W,后半段是用文本去检索歌曲标题、歌手名和歌词索引。前半段解决“声音能不能懂”,后半段解决“查到哪首歌”。相比哼唱搜索的“声音对声音”,语音搜索是“声音→文字→声音”的长链路。
ASR 的解码目标可以用贝叶斯公式描述:Ŵ = argmax_W P(X|W)P(W)。P(X|W) 是声学模型,负责估算“这段话的音像不像 X”;P(W) 是语言模型,负责评估“这句话通不通顺”。两者相乘后取最大值的 W,就是最可能的转写结果。识别出的文本还要经过规范化(全角转半角、去掉口头语、歌曲别名对齐),才能进入检索阶段。
速记本也有失灵的时候:嘈杂环境会让字条写错字,用户口音也会让“小星星”变成“小心心”。所以语音窗口的管理员还要查阅“相似词表”,把错别字映射回正确歌名。现实中,语音搜索系统通常带纠错与改写模块,正是为了弥补速记本偶尔的手抖。
- 语音观测X 是麦克风采集到的语音波形。
- 声学模型P(X|W) 给“候选文字 W 念出来像 X”的程度打分。
- 语言模型P(W) 给“候选文字 W 是否通顺自然”打分。
- 联合解码两项相乘后取 argmax,得到最可能的文本。
向量检索匹配
无论从哼唱窗还是语音窗进来,管理员最终都要面对同一个问题:如何在几百万首歌里快速找到“最像”的那个?他灵机一动,把每首歌画在一张巨大的“旋律地图”上——风格相近的歌靠得近,风格迥异的歌离得远。用户哼一段或说一句,他也在地图上落一个点,然后只需找“离这个点最近”的歌。
这张“地图”就是向量空间。哼唱搜索可以把方向轮廓编码成旋律特征向量,语音搜索可以把文本查询编码成语义向量;歌曲库一侧也预先对每首歌做了同样的向量化。任务由此变成:给定查询向量,在库中找出距离最近的 K 个向量。
最常用的相似度是余弦相似度:sim(q,d) = (q⃗·d⃗)/(|q⃗||d⃗|)。分子是点积,衡量方向一致性;分母用两个向量的模长做归一化,让相似度不受“响度”这类长度信息干扰。对音频检索,这尤其重要:同一首歌播放音量再大,也不该改变它和查询的相似度。全库逐条计算后按分数降序排序取 Top-K;对上亿规模的库,还会引入 ANN(近似最近邻)索引,用聚类或图结构跳过大量无关向量。
地图画得越合理,找歌就越快。管理员的“画图功夫”来自特征工程:旋律轮廓、音频指纹、文本语义向量都是不同维度上的“绘图坐标”。向量检索把主观的“像不像”变成客观的“距离远近”,这也是多模态检索能统一处理声音、文字、图像的根本原因。
- 特征向量查询 q 与歌曲 d 都表示为向量。
- 点积同向向量点积大,正交向量点积为零。
- 模长归一化除以两个模长,长度差异不再影响分数。
- 相似度取值结果落在 [−1, 1],越接近 1 越相似。
应用场景落地
如今,哼唱窗口和语音窗口不再只存在于幻想中的图书馆——哼唱窗口坐进了音乐 App 的“听歌识曲”柜台,语音窗口住进了智能音箱的“语音点歌”服务台。用户在地铁里哼一段、在客厅里喊一声,两个窗口背后的算法便各自忙碌起来。
真实产品的输入往往更随意:可能是嘈杂环境中的一段清唱,也可能是一句带口音的“放首歌”。无论输入形态如何,产品侧都遵循同一套工程链路:采集音频 → 前端特征提取(旋律轮廓或 ASR)→ 检索匹配 → 结果重排 → 播放反馈。
以音乐 App 为例,用户哼唱 5 秒,客户端提取旋律方向轮廓,服务端在千万级指纹库中做粗筛返回候选,再用细粒度特征重排。智能音箱场景,用户说“播放周杰伦的晴天”,端侧 ASR 转文本,云端检索歌曲库,返回音频流播放。两路可以统一写成:s* = argmax_s Match(f_q(a), f_s(s)),其中 a 为查询音频,f_q 与 f_s 分别是查询侧和歌曲侧的特征提取函数。
从图书馆走向 App,两位管理员还学会了互相补位:哼唱无结果时,App 会提示“您可以说出歌名试试”;语音点歌找不到时,音箱会问“要不要哼一下旋律?”。两种窗口从竞争走向融合,构成了今天多模态检索产品最常见的交互形态。
- 查询音频a 是用户输入的哼唱或语音片段。
- 两侧特征提取f_q 提取查询特征,f_s 提取歌曲库特征。
- 匹配打分Match 比较两个特征,输出相似度。
- 最优歌曲在曲库 S 中取分数最高者。
技术挑战权衡
再能干的管理员也有头疼时刻:窗外电钻声盖过哼唱,一位用户把《小星星》唱成原创歌曲,书架多到跑一圈要一小时。音频检索的工程路上,永远横着三座山:噪声、变体、规模。真正的系统设计,就是在这三座山之间走钢丝。
噪声同时攻击两条路径:哼唱搜索的旋律提取在嘈杂中被干扰,语音搜索的 ASR 在嘈杂中翻车。变体则来自用户:跑调的哼唱、带口音的话语、含糊的歌词。规模问题更直接——库越大,检索越慢。因此,工业级系统通常用“前端降噪 + 鲁棒特征 + 粗筛精排”三层结构应对。
前端降噪依赖麦克风阵列或谱减法,把电钻声压下去;鲁棒特征指前面介绍的方向轮廓和音频指纹,它们天生舍弃绝对细节,换取对变体的宽容。效率和精度则是此消彼长的权衡:特征越紧凑,检索越快,但区分度下降;特征越精细,精度越高,但库越大越慢。评估一个系统的综合能力,常用 F1 分数——精确率与召回率的调和平均。
那位管理员最后学会的,是“不追求完美,只追求够用”:允许少量误识别,但保证绝大多数用户在两三秒内得到候选;允许方向轮廓偶有错位,但保证整段旋律的宏观走向不错。音频检索的成熟,不在于消灭所有噪音,而在于让系统在嘈杂世界里依然稳健地给出答案。
- 精确率P 表示检索结果里真正相关的歌曲占比。
- 召回率R 表示所有相关歌曲中被找出的比例。
- 调和平均F1 平衡两者,任何一方过低都会被拉低。
AI 应用场景
音乐App哼唱识曲
阶段:特征提取与相似检索
解决的问题:用户只记得旋律却说不清歌名,传统文本搜索无从下手。AI 通过旋律方向轮廓和音频指纹,把哼唱音频映射到千万级曲库中,几秒内返回候选歌曲,打破“必须知道歌名才能找歌”的限制。
具体案例:用户在地铁里哼唱一段“灯~等灯等灯~”,App 提取方向轮廓后在指纹库粗筛,再经过细粒度特征重排,识别出《小星星》前奏,联动歌词页展示歌名并一键播放。
智能音箱语音点歌
阶段:语音识别与文本索引检索
解决的问题:用户正在做饭或开车,腾不出手来打字。AI 通过 ASR 把语音指令转成文本,再对歌曲标题、歌手、歌词建立文本索引,让“说一句话就能点歌”成为可能。
具体案例:用户在厨房说“放一首周杰伦的晴天”,音箱端侧 ASR 识别出文本,云端对歌曲库做文本检索,返回候选后播放,并语音确认“为您播放《晴天》”。
车载语音搜索
阶段:端侧音频处理与云端检索
解决的问题:驾驶场景下手动输入不安全,且车内噪声大。AI 通过麦克风阵列降噪后,将语音查询转为文本,再结合多模态检索在音乐库和播客库中查找,提升行车安全与体验。
具体案例:司机说“来点提神的歌”,车机完成降噪、ASR 转文本、文本向量检索,返回一首高能量歌单并自动播放。
Python 演示
# -*- coding: utf-8 -*-"""哼唱搜索与语音搜索迷你演示: 声音图书馆的两个窗口""" NOTE_TO_SEMITONE = { 'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11} def parse_melody(text): """把 'C D E G' 转成半音数字列表, 无法识别的符号直接跳过""" notes = [] for token in text.split(): up = token.upper() if up in NOTE_TO_SEMITONE: notes.append(NOTE_TO_SEMITONE[up]) return notes def direction_profile(notes): """旋律方向轮廓: 升=+1, 平=0, 降=-1""" profile = [0] for i in range(len(notes) - 1): diff = notes[i + 1] - notes[i] if diff > 0: profile.append(1) elif diff < 0: profile.append(-1) else: profile.append(0) return profile def contour_match(query, candidate): """逐位比较两条轮廓, 返回一致比例""" if len(query) != len(candidate): return 0.0 hits = 0 for a, b in zip(query, candidate): if a == b: hits += 1 return hits / len(query) SONG_LIBRARY = { '小星星': 'C C G G A A G', '两只老虎': 'D E D C D E D C G F E', '生日快乐': 'G G A G C B G G A G E D', '找朋友': 'C D E E F G C D E E F G C',} def hum_search(hum_input): """哼唱窗口: 旋律轮廓匹配""" query = direction_profile(parse_melody(hum_input)) results = [] for name, melody in SONG_LIBRARY.items(): candidate = direction_profile(parse_melody(melody)) score = contour_match(query, candidate) results.append((name, score)) results.sort(key=lambda x: x[1], reverse=True) return results def speech_search(query_text): """语音窗口: 文本命中检索""" results = [] for name in SONG_LIBRARY: score = 1.0 if (query_text in name or name in query_text) else 0.0 results.append((name, score)) results.sort(key=lambda x: x[1], reverse=True) return results def main(): print('=== 音频检索迷你演示: 声音图书馆 ===') mode = input('选择窗口 (1=哼唱, 2=语音): ').strip() if mode == '2': query_text = input('说点什么 (如 "播放小星星"): ').strip() or '小星星' results = speech_search(query_text) print('--- 语音窗口结果 ---') for name, score in results[:2]: print('%-6s 文本命中: %d' % (name, int(score))) else: hum_input = input('哼一段 (如 C C G G A A G): ').strip() or 'C C G G A A G' results = hum_search(hum_input) print('--- 哼唱窗口结果 ---') for name, score in results[:2]: print('%-6s 轮廓匹配度: %.2f' % (name, score)) if __name__ == '__main__': main()
for token in text.split():把用户输入的哼唱文字逐个解析成可计算的半音数字if diff > 0:相邻音高差的正负决定方向轮廓取 +1 还是 −1def contour_match(query, candidate):把两条旋律方向轮廓逐位比对,返回一致比例作为匹配分results.sort(key=lambda x: x[1], reverse=True)按匹配分降序排序,得分最高的歌曲排最前score = 1.0 if (query_text in name or name in query_text) else 0.0语音搜索侧用文本包含关系判断是否命中歌名mode = input('选择窗口 (1=哼唱, 2=语音): ').strip()用输入模拟两个窗口的入口路由,哼唱走轮廓、语音走文本
常见误区
误区哼唱搜索和语音搜索不就是一回事吗?都是把用户的声音拿去跟曲库比对,结果都是返回一首歌,感觉没有本质区别。
正解两者技术路径完全不同。哼唱搜索把音频转成旋律特征(方向轮廓、音频指纹),用特征相似度匹配;语音搜索先把音频转成文本(ASR),再用文本索引检索。用声音图书馆的比喻:哼唱窗口是“声音找声音”,语音窗口是“先听写再查目录”。误把两者混为一谈,会在检索系统设计时选错组件,比如给本来该走文本索引的需求错误地上了音频指纹。
为何常见:用户对这两类功能的接触入口相似(都是对着手机或音箱说话),又都返回歌曲结果,自然以为底层模型是同一套。
误区音频指纹就是那首歌的完整音频,只是体积小一点的压缩版。需要听完整歌曲时,把指纹“解压”回来就行。
正解指纹是“摘要特征”,不是可重建的信号。音频指纹只保留“这首歌区别于其他歌”的能量分布模式(如子带能量、峰值频点),丢弃波形细节和相位信息。就像“迷你身份证”上只有几个数字,根本无法还原成完整的人像。若当真去比对完整音频,存储和计算都会爆炸。
为何常见:“指纹”这个词让人联想到生物识别里保存的模板,以为指纹和原物一一对应且可反推,忽略了音频指纹更接近“哈希摘要”的本质。
误区哼唱识曲一定要唱得准。我每次跑调都会识别失败,肯定是我的问题,唱得准的人才能用这个功能。
正解方向轮廓天然容忍绝对音高偏移,识别失败更常见的原因是:哼唱片段太短(方向信息不足)、节奏自由变化太大、库内没有该版本或该歌曲。产品对失败往往只显示“未识别”,让用户误以为是音准问题。实际可以多哼几句、放慢速度、换成录音棚版本再试。
为何常见:语音识别给人们的印象是“必须标准发音”,用户把手写输入的苛刻印象迁移到了哼唱搜索上,忽略了旋律匹配与语音识别的机制差异。
误区语音搜索就是把用户说的话录下来,然后跟每首歌的音频做相似度计算,谁像就返回谁。
正解语音搜索的输入语音和歌曲音频根本不是同一模态:前者是一句话,后者是一段音乐,直接比波形毫无意义。正确流程是 ASR 先把语音转成文字,再对歌曲的标题、歌手、歌词做文本检索。类比:语音窗口管理员先写字条,再用字条查目录,而不是拿着录音带对比唱片。
为何常见:看到“语音搜索”四个字,容易按“用音频找音频”的直觉理解,忽略了中间必须有“语音转文字”这一步桥接。
面试题
Q1. 哼唱搜索与语音搜索的核心区别是什么?
- A.输入音频来源不同
- B.中间处理路径不同← 正确答案
- C.曲库规模大小不同
- D.输出结果形式不同
答案:B。两者输入都可以是麦克风音频,输出都是歌曲列表,曲库规模也未必有差异。核心区别在中间处理路径:哼唱搜索走旋律特征匹配,语音搜索走 ASR 转文本再检索,对应声音图书馆的哼唱窗口与语音窗口。
Q2. 哼唱搜索的第一步通常做什么?
- A.将音频转成文本
- B.直接比对波形采样
- C.播放全部候选歌曲
- D.提取旋律方向轮廓← 正确答案
答案:D。哼唱搜索的第一步是音高序列提取,进而计算方向轮廓。“转成文本”是语音搜索的路径;“直接比对波形采样”对跑调和噪声极敏感;“播放候选歌曲”是检索后的人工确认,不属于技术流程。
Q3. 旋律方向轮廓为什么能容忍跑调?
- A.把波形切得更细
- B.只记录音高相对升降← 正确答案
- C.使用更长的音频片段
- D.忽略所有节奏信息
答案:B。方向轮廓只记录相邻音符的升降方向(+1/0/−1),跑调是绝对音高的整体偏移,相对升降关系保持不变。方向轮廓不关心波形粗细,也不等于忽略节奏,与音频片段长度无直接关系。
Q4. 音频指纹应具备哪些特点?
- A.对噪声有一定鲁棒性← 正确答案
- B.存储量远小于原始音频← 正确答案
- C.保存音频全部波形细节
- D.能快速进行比对匹配← 正确答案
答案:ABD。音频指纹是紧凑摘要,必须抗噪、体积小、比对快。若保存全部波形细节,就不叫“指纹”而叫“压缩音频”,既浪费存储又拖慢比对,因此 C 错误。
Q5. 语音搜索流水线的正确顺序是?
- A.波形→文字→检索← 正确答案
- B.波形→检索→文字
- C.文字→波形→检索
- D.波形→检索→排序
答案:A。语音搜索先把语音波形交给 ASR 转成文本,再用文本去检索曲库。B 和 D 颠倒了文字与检索的顺序;C 把输入输出方向搞反。排序是检索之后的步骤,不是主链开端。
Q6. 语音搜索相比哼唱搜索更适合哪些场景?
- A.用户记得歌名和歌手← 正确答案
- B.用户只能哼出旋律
- C.用户想按歌词找歌← 正确答案
- D.环境嘈杂但口述清晰
答案:AC。语音搜索的优势在于能利用歌名、歌手、歌词等文本信息;若用户只能哼旋律,就该走哼唱搜索。嘈杂环境对两条路径都是挑战,ASR 同样会被噪声拉低识别率,因此 D 不是优势场景。
Q7. 音频指纹中子带能量的作用是什么?
- A.保存原始波形时间轴
- B.记录歌手音色标签
- C.表示该频段能量强度← 正确答案
- D.直接存储歌词文本
答案:C。子带能量把频谱按频段累加,得到该频段的强度数字,作为指纹分量。它不保存波形时间轴、歌手音色标签或歌词,只保留“哪个频段响”这种可辨识的摘要信息。
Q8. 下列哪些因素会影响哼唱检索的召回率?
- A.旋律轮廓编码精度← 正确答案
- B.库内歌曲特征质量← 正确答案
- C.用户哼唱音色好坏
- D.检索相似度阈值← 正确答案
答案:ABD。召回率衡量“该找到的歌有没有被找到”。轮廓编码精度不高、库内特征构造粗糙、相似度阈值定得太高,都会漏掉真歌。用户的音色不属于旋律特征,方向轮廓不关心音色,因此 C 不影响召回。
Q9. 余弦相似度适合衡量什么?
- A.两个向量长度差值
- B.两个向量方向一致性← 正确答案
- C.音频文件大小差异
- D.文本字数多少差异
答案:B。余弦相似度用点积除以模长乘积,只看方向是否一致,对向量长度不敏感。它不衡量长度差值、文件大小或字数差异。对音频检索而言,播放音量不会改变向量方向,所以它比欧氏距离更稳定。
Q10. 哼唱搜索与语音搜索在本质上的区别是哪一项?
- A.是否建立索引的结构
- B.服务器部署的位置差异
- C.查询到内容的映射方式← 正确答案
- D.返回结果的展示形式
答案:C。哼唱搜索把旋律特征映射到歌曲,语音搜索把语音转出的文本映射到歌曲,查询模态到内容的映射方式不同,这才是本质区别。两者都可以建索引,部署位置和返回形式与业务有关,不构成本质差异。