1. 项目概述:从“听”到“看”的桥梁
语音转文字,听起来是个挺时髦的技术,但说白了,就是让机器听懂人话,再把听到的内容变成我们能读的文字。这玩意儿现在可太常见了,从你手机里的语音输入法,到开会时用的实时字幕,再到短视频平台自动生成的字幕,背后都有它的影子。我最早接触这技术,还是为了整理会议录音,当时手动敲字敲到手抽筋,就琢磨着有没有省事的法子。后来自己动手搞,才发现这里面门道不少,从选工具到调参数,每一步都可能影响最终的效果。
这个项目,就是要把“语音转文字”这个看似黑盒的过程给拆开揉碎了讲清楚。它适合谁呢?如果你是产品经理,想了解怎么把这个功能集成到你的App里;如果你是开发者,想自己动手实现一个基础的转换服务;或者你只是个普通用户,好奇手机里那个“小话筒”是怎么工作的,这篇文章都能给你一些答案。核心就一句话:把声音信号变成文本信息。但怎么变、变得准不准、快不快,就是我们要深入探讨的了。
2. 核心原理与方案选型:为什么是它?
在动手之前,得先明白我们到底要解决什么问题。语音转文字,学术上叫“自动语音识别”。它的核心需求可以拆解为三点:准确性、实时性、易用性。准确性是命根子,转出来的文字驴唇不对马嘴,功能就废了;实时性决定了体验,是等半天出结果,还是边说边出字;易用性则关乎落地,是搞个云端大模型,还是本地部署个小引擎。
2.1 主流技术路线解析
目前市面上主要有三条技术路线,各有各的适用场景。
路线一:云端API服务这是最省心、效果通常也最好的方式。你把音频文件或流扔给大厂(比如国内的百度、阿里、腾讯,或者国际上的Google、Microsoft)的服务器,他们用训练好的超大模型给你处理,然后把文本结果返回给你。
- 优点:开箱即用,识别率高,支持多种语言和方言,自带降噪、标点、说话人分离等高级功能。你几乎不用关心模型训练和优化。
- 缺点:依赖网络,有延迟,数据要上传到第三方服务器(涉及隐私考量),并且通常是按调用量收费,长期使用成本需要考虑。
- 典型场景:移动App的语音输入、在线会议字幕、海量音视频内容批量转写。
路线二:本地开源引擎如果你对数据隐私有要求,或者需要在无网络环境下使用,本地部署开源引擎是首选。目前最成熟的是Mozilla 的 DeepSpeech和NVIDIA 的 NeMo。
- 优点:数据完全本地处理,安全可控;可离线运行;一次部署,后续调用成本极低(主要是电费)。
- 缺点:部署有一定技术门槛;识别效果通常略逊于顶尖的云端服务(尤其是对复杂口音、嘈杂环境的适应性);需要自己准备或寻找合适的预训练模型;对本地计算资源(特别是GPU)有要求。
- 典型场景:企业内部敏感会议记录、医疗问诊记录、嵌入式设备(如智能录音笔)的离线转写。
路线三:端侧轻量化模型这是云端和本地重型引擎之间的折中方案。利用ONNX Runtime或TensorFlow Lite等框架,将小型化的语音识别模型直接集成到手机或边缘设备上。
- 优点:兼顾了离线可用性和响应速度;隐私性好;用户体验流畅(无网络延迟)。
- 缺点:模型能力受限于大小,词汇量和场景适应性可能不如大型模型;需要针对特定平台(如Android、iOS)进行优化和集成。
- 典型场景:手机系统级的语音助手唤醒词识别、输入法的离线语音输入、智能家居设备的语音指令识别。
注意:没有“最好”的方案,只有“最合适”的方案。对于个人学习或快速验证,我强烈建议从云端API开始,它能让你最快地看到效果,理解整个流程。等摸清了门道,再根据实际需求考虑是否向本地或端侧迁移。
2.2 为什么选择云端API作为入门?
基于我们“实现”一个可用的语音转文字功能的目标,尤其是对于大多数初学者和希望快速集成的开发者,我首推从云端API入手。理由有三:
- 降低初始门槛:你不需要学习复杂的声学模型、语言模型,也不用搭建训练环境。API调用就像使用一个封装好的函数,输入音频,输出文本。
- 效果立竿见影:大厂投入巨资训练的模型,在通用场景下的识别率是个人或小团队短期内难以企及的。这能给你带来正向反馈。
- 功能完整:成熟的语音识别API不仅做识别,还提供语音活动检测(VAD,自动找出哪里有人说话)、标点预测、数字规整化(把“一二三”转成“123”)甚至语义分段等增值服务,这些都是产品化不可或缺的部分。
接下来,我们就以国内最常用的百度智能云语音识别API和阿里云智能语音交互为例,手把手走通从准备到调用的全流程。选择它们是因为文档齐全、社区活跃,且有免费的资源包可供测试。
3. 实战准备:从注册到拿到“钥匙”
在写代码之前,我们需要在云服务商那里完成一系列准备工作,拿到调用API必需的凭证。这个过程虽然繁琐,但每一步都关系到后续能否成功调用。
3.1 创建云服务账号与开通服务
首先,你需要有一个百度智能云或阿里云的账号。如果没有,去官网注册一个,通常需要实名认证。登录后,进入控制台。
以百度智能云为例:
- 在控制台顶部搜索“语音技术”或“语音识别”。
- 找到“短语音识别标准版”或“实时语音识别”产品。对于入门,从“短语音识别”开始,它适用于录制好的一次性音频文件(时长一般小于60秒)。实时识别则用于流式音频,如直播字幕。
- 点击“立即使用”或“开通服务”。系统可能会引导你创建一个应用。这个“应用”是管理你API调用的单元,会获得唯一的
AppID、API Key和Secret Key,这就是你的“钥匙串”。
以阿里云为例:
- 搜索“智能语音交互”。
- 进入产品页后,同样需要开通服务。阿里云的概念是创建一个“项目”(Project),在项目下你可以配置不同的识别引擎(如普通话通用、金融、医疗等)。
- 开通后,你需要在“AccessKey管理”中创建或查看你的
AccessKey ID和AccessKey Secret。同时,记下你创建的项目名称(appkey)。
实操心得:在创建应用或项目时,注意选择离你目标用户近的服务区域(如华北-北京、华东-上海)。这能降低网络延迟,提升响应速度。另外,务必查看产品的免费额度。百度和阿里对新用户都有一定时长的免费识别额度,足够我们完成大量的学习和测试。
3.2 获取核心密钥与参数
这是最关键的一步,你的代码将用这些信息向云服务器证明“我是谁,我有权调用”。
- 百度智能云:
APP_ID: 应用列表里可以看到。API_KEY: 应用详情里。SECRET_KEY: 同上。这个最为敏感,切勿泄露。
- 阿里云:
AccessKey ID: 在RAM访问控制中查看。AccessKey Secret: 同上,高度敏感。appkey: 你在智能语音交互控制台创建的项目名称。
拿到这些密钥后,千万不要直接硬编码在即将要写的Python脚本里!尤其是如果你打算把代码上传到GitHub等公共平台,这等于把家门钥匙挂在网上。正确的做法是使用环境变量。
3.3 准备开发环境
我们需要一个Python环境。推荐使用conda或venv创建独立的虚拟环境,避免包冲突。
# 创建并激活虚拟环境(以conda为例) conda create -n speech2text python=3.8 conda activate speech2text # 安装必要的SDK # 对于百度云 pip install baidu-aip # 对于阿里云 pip install aliyun-python-sdk-core # 阿里云的语音识别SDK可能包含在更具体的包中,有时直接安装以下包更方便 pip install aliyun-python-sdk-nls-cloud-meta # 或者根据官方最新文档安装除了SDK,我们还需要一个测试用的音频文件。你可以用手机录一段清晰的普通话(内容比如:“今天天气不错,我们下午三点开会讨论项目进度。”),保存为test_audio.wav。音频格式至关重要,通常API支持PCM、WAV、MP3等,但为了最好的兼容性和识别效果,我推荐使用:
- 编码格式: PCM(无压缩)或 FLAC(无损压缩)。
- 采样率: 16000 Hz。这是电话语音的常见采样率,也是大多数API的推荐值。
- 位深: 16 bit。
- 声道数: 单声道(Mono)。
你可以使用免费工具如Audacity来查看和转换你的音频文件格式。
4. 核心代码实现:调用API的两种姿势
环境备齐,钥匙在手,现在可以写代码了。我们将分别实现一次性文件识别和实时流式识别。前者用于处理已录好的音频,后者用于麦克风实时输入。
4.1 短语音识别(文件上传)
我们先实现最简单的:上传一个音频文件,等待识别结果。
百度云实现示例:
from aip import AipSpeech import os # 从环境变量读取密钥,安全! APP_ID = os.getenv('BAIDU_APP_ID') API_KEY = os.getenv('BAIDU_API_KEY') SECRET_KEY = os.getenv('BAIDU_SECRET_KEY') client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) def recognize_file(file_path): # 读取音频文件 with open(file_path, 'rb') as fp: audio_data = fp.read() # 调用API # 参数说明:audio_data-音频二进制数据,format-音频格式(后缀名,如'wav','pcm'),rate-采样率16000 result = client.asr(audio_data, 'wav', 16000, { 'dev_pid': 1537, # 普通话(支持简单的英文识别)模型。1536为纯中文,1737为英语,更多见文档 }) # 解析结果 if result['err_no'] == 0: # 成功 recognized_text = result['result'][0] print(f"识别成功: {recognized_text}") return recognized_text else: # 失败 print(f"识别失败,错误码: {result['err_no']}, 错误信息: {result['err_msg']}") return None if __name__ == '__main__': text = recognize_file('test_audio.wav')阿里云实现示例(稍复杂,需构造请求):
from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest import json import os import base64 # 初始化客户端 client = AcsClient( os.getenv('ALIYUN_AK_ID'), os.getenv('ALIYUN_AK_SECRET'), 'cn-shanghai' # 区域,根据你的项目所在地选择 ) def recognize_file_aliyun(file_path, appkey): with open(file_path, 'rb') as f: audio_content = base64.b64encode(f.read()).decode('utf-8') # 创建通用请求对象 request = CommonRequest() request.set_domain('nls-meta.cn-shanghai.aliyuncs.com') request.set_version('2019-02-28') request.set_action_name('CreateRecognize') # 设置请求体,JSON格式 request_body = { "appkey": appkey, "format": "wav", "sample_rate": 16000, "enable_punctuation_prediction": True, # 开启标点预测 "enable_inverse_text_normalization": True, # 开启ITN,如“一百”转“100” "audio": audio_content } request.set_content_type('application/json') request.set_content(json.dumps(request_body).encode('utf-8')) try: response = client.do_action_with_exception(request) result = json.loads(response.decode('utf-8')) if result.get('Status') == 'SUCCESS': recognized_text = result.get('Result', {}).get('Sentences', [{}])[0].get('Text', '') print(f"阿里云识别成功: {recognized_text}") return recognized_text else: print(f"阿里云识别失败: {result}") return None except Exception as e: print(f"请求异常: {e}") return None if __name__ == '__main__': text = recognize_file_aliyun('test_audio.wav', os.getenv('ALIYUN_APPKEY'))运行这两个脚本(记得先设置环境变量),你应该能看到控制台打印出识别出的文字。第一次成功调用时,那种“机器听懂了我”的感觉还是挺奇妙的。
4.2 实时语音识别(流式传输)
文件识别适合事后处理,但很多场景需要“边说边转”,比如语音输入法、会议直播。这就需要流式识别。其原理是:建立一条WebSocket或长连接,持续将麦克风采集到的音频数据小块(例如每40ms一片)发送到服务器,服务器则持续返回中间结果和最终结果。
由于流式识别的代码相对复杂,涉及音频采集、WebSocket通信、回调处理等,这里我给出一个百度云流式识别的简化框架思路,并推荐使用官方SDK中封装好的类。
# 这是一个高度简化的示例,实际请参考百度云官方SDK文档中的 `speech_realtime.py` 示例 from aip import AipSpeech import pyaudio import threading import time # 初始化客户端(同上) client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) class RealTimeASR: def __init__(self): self.audio = pyaudio.PyAudio() self.stream = None self.is_recording = False def start(self): self.is_recording = True # 打开音频流,从麦克风采集 self.stream = self.audio.open( format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1280 # 每帧80ms的数据 ) # 启动一个线程专门发送数据 send_thread = threading.Thread(target=self._send_audio_data) send_thread.start() def _send_audio_data(self): # 这里需要实现与百度云流式识别端点的WebSocket通信 # 官方SDK中提供了 `AipSpeech` 的 `_asr_streaming` 等内部方法或示例 # 核心是:循环读取 self.stream 的数据,通过WebSocket发送 # 并处理服务器返回的中间结果和最终结果 print("开始发送音频流...") # 伪代码:ws.send(audio_chunk) pass def stop(self): self.is_recording = False if self.stream: self.stream.stop_stream() self.stream.close() self.audio.terminate() # 注意:实际开发中,强烈建议直接使用百度云提供的完整流式识别示例代码, # 它已经处理了WebSocket连接、数据分包、结果回调等复杂逻辑。重要提示:流式识别涉及到状态维护、网络重连、中间结果合并等复杂问题,不建议从零开始造轮子。百度云和阿里云的官方SDK都提供了非常完善的流式识别示例程序。你的最佳策略是:1)找到官方GitHub仓库或示例代码;2)仔细阅读代码逻辑;3)复制到本地,替换成自己的密钥;4)运行并理解其工作流程。这是最高效、最稳妥的方式。
5. 效果优化与高级功能调参
基础调用跑通只是第一步。要想获得更好的识别效果,或者适配更复杂的场景,我们需要深入了解API提供的各种参数。
5.1 关键参数深度解析
以百度云短语音识别API的client.asr()方法为例,除了音频数据和格式,还有一个options字典参数,里面大有乾坤。
options = { 'dev_pid': 1537, # 语言模型ID,这是最重要的参数之一 'lm_id': None, # 自定义语言模型ID,如果你训练了领域特定的模型 'speech_rate': 0, # 语速控制(高级功能,一般不用) 'audio_status': 0, # 音频状态,0-正常,1-首包,2-尾包(用于流式) 'vad_enable': True, # 是否启用语音活动检测(VAD),默认为True。强烈建议开启! 'vad_mode': 3, # VAD模式,3-激进型(适合安静环境),2-平衡型,1-保守型(适合嘈杂环境) 'max_seconds': 60, # 音频最大长度,超过会报错 'interim_results': False, # 是否返回中间结果(流式识别用) 'enable_words': False, # 是否返回词级别时间戳(需要特定模型支持) }dev_pid(语言模型):这是影响识别准确率的头号参数。1536:纯中文识别模型。如果你确定音频里只有中文,用这个。1537:普通话(支持简单英文)。这是最通用的模型,也是默认推荐。它能处理中英文混合的句子,比如“请打开PDF文件”。1737:英语。纯英文内容用这个。1637:粤语。1837:四川话。- 选择正确的模型,准确率能有显著提升。
vad_enable与vad_mode(语音活动检测):这是提升体验的利器。VAD能自动检测音频中哪些部分是人声,哪些是静音或噪音。开启后,API会自动裁剪掉首尾的静音段,有时甚至能处理音频中间的长时间停顿。vad_mode=3在安静环境下能更精准地找到语音起点和终点;如果环境嘈杂,可以尝试设为1,避免把噪音误判为语音。
5.2 音频预处理:事半功倍的关键
API再强大,如果喂给它的音频质量太差,也是巧妇难为无米之炊。在调用API前,对音频进行简单的预处理,往往能花小钱办大事。
- 降噪:如果录音环境有持续的空调声、风扇声等稳态噪音,可以使用像Audacity的降噪功能,或者Python库
noisereduce进行简单处理。 - 音量归一化:确保音频的音量在一个合理的范围内,避免声音过小或爆音。可以用
pydub库的normalize方法。 - 格式转换与重采样:确保音频格式、采样率、声道数符合API要求。
pydub和ffmpeg是完成这项工作的瑞士军刀。
from pydub import AudioSegment def preprocess_audio(input_path, output_path): # 加载音频 audio = AudioSegment.from_file(input_path) # 转换为单声道 if audio.channels > 1: audio = audio.set_channels(1) print("已转换为单声道。") # 重采样到16000Hz if audio.frame_rate != 16000: audio = audio.set_frame_rate(16000) print(f"已重采样到16000Hz。") # 简单增益调整(示例:提高6分贝) # audio = audio + 6 # 导出为WAV格式(PCM编码) audio.export(output_path, format='wav', parameters=['-acodec', 'pcm_s16le']) print(f"预处理完成,文件已保存至: {output_path}") return output_path # 使用 processed_file = preprocess_audio('raw_recording.m4a', 'processed.wav') recognize_file(processed_file)5.3 启用高级功能:让结果更可用
成熟的语音识别服务不仅仅是转文字,还提供了一系列后处理功能,让生成的文本直接可用。
- 标点预测:默认的识别结果可能是没有标点的一长串文字。开启标点预测(百度云默认开启,阿里云需设置
enable_punctuation_prediction为True)后,API会自动添加句号、逗号、问号等,可读性大大增强。 - 逆文本归一化:口语中说的“一百二十块钱”,在书面文本里我们可能希望写成“120元”。ITN功能就是干这个的。阿里云的
enable_inverse_text_normalization参数控制此功能。 - 说话人分离:在会议录音场景中,如果能区分出A、B、C分别说了什么,价值巨大。这是一个更高级的功能(通常称为“声纹识别”或“说话人日记”),部分API支持,但可能需要单独开通或付费。
6. 常见问题排查与性能优化实录
在实际集成和使用过程中,你肯定会遇到各种各样的问题。下面是我踩过的一些坑和解决方案。
6.1 错误码大全与应对策略
| 错误现象/码 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
err_no: 3301` (百度) / 请求被拒绝 | 音频质量差、格式不对、采样率错误、音量过低、背景噪音过大。 | 1. 用播放器或pydub检查音频是否能正常播放。2. 用 AudioSegment或ffprobe确认格式、采样率(16000)、声道数(1)。3. 可视化音频波形,看是否有信号(波形是否近乎一条直线)。 4. 进行音频预处理(降噪、增益)。 5. 换一段清晰、安静的录音测试。 |
err_no: 3302` (百度) / 鉴权失败 | API Key/Secret Key 错误、服务未开通、账号欠费、网络代理问题。 | 1.仔细核对APP_ID,API_KEY,SECRET_KEY,确保复制无误,无多余空格。2. 登录云控制台,确认语音识别服务已开通且处于正常状态。 3. 检查账号余额或免费额度是否用完。 4. 尝试在服务器或另一网络环境测试,排除本地网络或代理拦截。 |
err_no: 3303` (百度) / 请求频率超限 | 免费用户QPS(每秒查询率)限制被触发。 | 1. 检查代码中是否有死循环在频繁调用API。 2. 在代码中加入延时,如 time.sleep(0.2),将请求间隔拉大到200ms以上。3. 考虑升级到付费套餐以获得更高QPS。 |
err_no: 3304` (百度) / 余额不足 | 免费额度用完或账户欠费。 | 1. 登录控制台查看“用量统计”和“账户余额”。 2. 进行充值或购买资源包。 |
err_no: 3307` (百度) / 音频过长 | 音频超过max_seconds参数限制(默认60秒)。 | 1. 对于长音频,必须使用长语音识别服务(异步接口),或者将音频切片后分段识别。 2. 检查 max_seconds参数设置是否过小。 |
| 识别结果乱码或完全不对 | 音频编码格式与声明不符、dev_pid语言模型选错。 | 1. 确认format参数与音频文件实际编码一致。.wav文件也可能是mp3编码的,用ffprobe查看真实编码。2. 确认 dev_pid是否匹配音频内容语言。英文内容用1537可能不准,应用1737。 |
| 流式识别连接立即断开 | WebSocket连接参数错误、音频采样率不匹配、未及时发送数据。 | 1. 严格对照官方流式示例代码检查WebSocket URL和请求头。 2. 确保麦克风采集的音频采样率与请求参数一致(通常16000)。 3. 流式识别需要持续发送数据包,检查发送逻辑是否有长时间阻塞或中断。 |
6.2 性能与成本优化心得
当项目从demo走向实际应用,性能和成本就成了必须考虑的问题。
- 音频压缩上传:如果音频文件很大,直接上传原始PCM数据会消耗大量带宽和时间。可以在本地先将其压缩为OPUS或MP3格式(比特率64kbps或更低),再上传。大部分云API都支持解压这些格式。用
pydub转换非常方便,能减少80%以上的数据量。 - 识别模式选择:
- 短语音:适用于指令、搜索查询等短音频(<60s)。响应快。
- 长语音(异步):适用于讲座、会议等长音频。你需要先上传文件,得到一个任务ID,然后轮询或等待回调获取结果。适合后台任务处理。
- 实时语音:适用于对话、直播。延迟低,但单位时间成本可能更高。
- 缓存与去重:如果你的应用场景中有大量相同或相似的音频(比如教育App里同一段课文跟读),可以考虑在本地缓存识别结果。对音频内容计算一个哈希值(如MD5),先查缓存,没有再调用API,能显著节省成本。
- 设置合理的超时与重试:网络是不稳定的。在调用API时,务必设置连接超时和读取超时(例如10秒),并实现简单的重试机制(例如重试2次),增强程序的健壮性。
import requests from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def call_api_with_retry(audio_data): # 这里封装你的API调用逻辑 # 如果遇到网络超时等临时性错误,tenacity会自动重试 response = requests.post(api_url, data=audio_data, timeout=10) response.raise_for_status() # 如果状态码不是200,会抛出异常,触发重试 return response.json()7. 从API到产品:进阶集成思路
当你熟练调用API后,下一步就是思考如何将它变成一个真正的产品功能。这里分享几个进阶方向。
7.1 构建一个简单的语音转文字服务
你可以用Flask或FastAPI快速搭建一个RESTful服务,提供音频上传和文本返回的接口。这样,移动端、Web前端或其他服务都可以通过HTTP调用来使用语音识别能力。
# 一个使用FastAPI的极简示例 from fastapi import FastAPI, File, UploadFile from pydub import AudioSegment import io import os from your_recognizer import recognize_audio # 封装好的识别函数 app = FastAPI() @app.post("/recognize") async def recognize_speech(file: UploadFile = File(...)): # 读取上传的文件 contents = await file.read() # 将文件内容转换为AudioSegment对象(假设是wav) audio = AudioSegment.from_file(io.BytesIO(contents), format="wav") # 预处理(重采样、转单声道) audio = audio.set_frame_rate(16000).set_channels(1) # 导出为PCM格式的字节流 buffer = io.BytesIO() audio.export(buffer, format="wav", codec="pcm_s16le") audio_data = buffer.getvalue() # 调用识别核心函数 text = recognize_audio(audio_data) return {"filename": file.filename, "text": text} # 运行:uvicorn main:app --reload7.2 与业务逻辑结合:字幕生成与会议纪要
单纯的文字输出价值有限。结合自然语言处理,可以玩出更多花样。
- 自动生成字幕文件:将识别出的文本,配上根据返回的(或估算的)时间戳,生成SRT或VTT格式的字幕文件。
pysrt库可以方便地操作SRT文件。 - 会议纪要自动化:将多人会议录音识别后,结合说话人分离技术区分不同讲者,然后利用文本摘要模型(如TextRank或基于Transformer的摘要模型)提取关键结论和待办事项,自动生成会议纪要草案。
- 内容分析与检索:将所有的语音转文字结果存入数据库(如Elasticsearch),就可以实现对历史录音内容的全文检索。比如,快速找到“上次提到预算问题的会议片段”。
7.3 探索本地与离线方案
如果你对数据隐私、网络延迟或长期成本有极高要求,是时候研究本地方案了。
- 评估本地引擎:DeepSpeech是一个不错的选择。你需要下载预训练好的模型文件(
.pbmm和.scorer),然后使用其Python接口进行推理。它的准确率在干净语音上不错,但对中文的支持和噪音环境下的鲁棒性可能不如商业API。 - 考虑硬件加速:本地推理,尤其是流式推理,对算力有要求。如果希望低延迟,需要配备GPU(并使用对应的CUDA版本引擎)或利用Intel的OpenVINO、ARM的NPU进行推理加速。
- 混合架构:一种折中的产品思路是“离线优先,云端兜底”。在设备端先用轻量模型进行识别,如果置信度低于某个阈值(表示没听清),或者用户主动纠正,再将这段音频上传到云端进行更精准的识别。这样既保证了多数情况下的离线体验和隐私,又用云端能力弥补了本地模型的不足。
语音转文字的实现,从调用一个API开始,但其深度和广度足以支撑起一个复杂的产品特性。关键在于理解核心原理,熟练使用工具,并根据实际场景做出最合适的技术选型和优化。