Swift:从语音识别返回字符串中提取特定命令的数字子串
解决语音识别结果中提取"Open Case"命令及对应数字的问题
针对你遇到的语音识别返回冗余内容,需要精准提取"open case"命令和关联数字的问题,结合你给出的示例,我整理了一套实用的处理方案,从预处理到正则匹配,一步一步来解决:
核心思路
首先要做的是清理无效冗余,把无意义的乱码、重复命令过滤掉,然后用正则精准匹配"open case"的各种变体,同时捕获对应的数字。这样既兼顾了语音识别的不确定性,又保证了提取的准确性。
具体实现步骤
1. 预处理:统一格式+清理噪音
语音识别的结果往往大小写混乱、夹杂无意义词汇(比如"bla bla"、"..."),甚至重复命令,所以第一步先把这些噪音去掉:
- 转小写:消除大小写差异对匹配的影响
- 清理无意义内容:直接替换掉"bla"、"..."这类无效词汇
- 去重重复命令:把连续重复的"open case"合并成一次,比如"open case open case 6842"处理后变成"open case 6842"
2. 正则匹配:捕获命令和数字
结合你给出的所有示例,"open case"后面可能直接跟数字,也可能带"id"、"no"、"number"前缀,所以我们可以用一个正则表达式覆盖所有情况:r'open case(?:\s+(id|no|number))?\s*(\d+)'
(?:...)是非捕获组,用来匹配可选的前缀(id/no/number),不会干扰数字的提取(\d+)是捕获组,专门用来提取数字
如果遇到多次出现命令的情况(比如"open case 1234 open case"),可以根据业务需求选择取最后一个有效数字,或者收集所有数字。
3. 代码示例(Python)
下面是完整的实现代码,包含预处理、匹配和测试:
import re def extract_open_case_info(voice_input): # 第一步:预处理文本 processed = voice_input.lower() # 清理无意义内容 processed = processed.replace('...', '').replace('bla', '') # 去重连续的"open case" processed = re.sub(r'(open case)\s+\1', r'\1', processed) # 第二步:匹配命令和数字 pattern = r'open case(?:\s+(id|no|number))?\s*(\d+)' matches = re.findall(pattern, processed) if matches: # 取最后一个匹配的结果(可根据需求调整为取第一个或全部) latest_match = matches[-1] return { 'command': 'open case', 'id_type': latest_match[0] or None, # 如果有前缀就返回,否则None 'case_number': latest_match[1] } else: # 只匹配到"open case"但没有数字的情况 if 'open case' in processed: return {'command': 'open case', 'case_number': None} return None # 测试所有示例 test_samples = [ "open case", "open case 1234", "open case id 3421", "open case no 9546", "open case number 5241", "open case 9552 open case", "open case open case 6842", "open case bla bla 5415 bla", "open case 1234 bla bla", "open ..." ] for sample in test_samples: result = extract_open_case_info(sample) print(f"输入: '{sample}' → 输出: {result}")
4. 额外优化建议
- 如果用户语音中数字是口语化表达(比如"one two three four"),可以引入数字转写工具(比如
num2words反向转换)来处理 - 对于模糊发音(比如"op case"),可以用字符串相似度算法(比如Levenshtein距离)来做容错匹配,提升鲁棒性
内容的提问来源于stack exchange,提问作者Krunal
相关产品推荐
相关产品推荐

