Node.js运行Google Speech-to-Text示例报ENOENT文件不存在错误
Google Speech-to-Text Node.js 接入报错排查
问题现象
在自有Web应用中接入Google Speech-to-Text能力时,为排除业务代码干扰,优先测试官方Node.js版本快速入门示例,分别覆盖远程存储URI音频转写、本地音频文件转写两个场景,两个示例运行时抛出完全一致的错误:
(node:4836) UnhandledPromiseRejectionWarning: Error: The file at { does not exist, or it is not a file. ENOENT: no such file or directory, lstat '[项目根目录路径]/{'
测试用代码示例
远程URI转写实现(参考官方文档)
// 加载dotenv读取凭证配置 require('dotenv').config(); // 引入Google Cloud客户端库 const speech = require('@google-cloud/speech'); // 初始化客户端实例 const client = new speech.SpeechClient(); async function quickstart() { // 测试用远程LINEAR16格式音频的GCS URI路径 const gcsUri = 'gs://cloud-samples-data/speech/brooklyn_bridge.raw'; // 音频识别基础配置 const audio = { uri: gcsUri, }; const config = { encoding: 'LINEAR16', sampleRateHertz: 16000, languageCode: 'en-US', }; const request = { audio: audio, config: config, }; // 发起语音识别请求 const [response] = await client.recognize(request); const transcription = response.results .map(result => result.alternatives[0].transcript) .join('\n'); console.log(`转写结果: ${transcription}`); } quickstart();
本地音频文件转写实现(参考教程视频)
require('dotenv').config(); const speech = require('@google-cloud/speech'); const fs = require('fs'); async function main() { const client = new speech.SpeechClient(); const filename = './resources/Sample.mp3'; const file = fs.readFileSync(filename); const audioBytes = file.toString('base64'); const audio = { content: audioBytes }; const config = { encoding: 'LINEAR16', sampleRateHertz: 16000, languageCode: 'en-US' }; const request = { audio: audio, config: config }; const [response] = await client.recognize(request); const transcription = response.results.map(result => result.alternatives[0].transcript).join('\n'); console.log(`转写结果: ${transcription}`); } main().catch(console.error);
缺失的必要环节
- 核心报错触发逻辑:
@google-cloud/speechSDK初始化时会按顺序校验凭证配置来源,当无法识别到有效凭证时,会尝试将空值/非法对象结构作为本地文件路径做存在性校验,最终抛出指向不存在路径{的ENOENT错误。该报错与音频转写的业务请求逻辑无关,属于SDK初始化阶段的凭证配置问题。 - 凭证配置全流程缺失:
- 未在对应Google Cloud项目中开启Speech-to-Text API服务
- 未创建具备Speech Client角色权限的服务账号,未导出对应格式的JSON密钥文件
- 未通过dotenv配置环境变量
GOOGLE_APPLICATION_CREDENTIALS,将其指向本地密钥文件的绝对路径。SDK默认会读取该环境变量定位凭证文件,未配置时会触发非法路径解析逻辑,触发上述ENOENT报错。
- 本地转写示例参数不匹配:
- 代码中指定音频编码为
LINEAR16,但测试文件为MP3格式,编码参数与实际音频格式不一致会导致识别失败,需根据音频实际格式调整encoding参数,MP3格式需对应设置为MP3,同时确保sampleRateHertz参数和音频实际采样率一致。
- 代码中指定音频编码为
- 异常捕获逻辑不完整:
- 远程URI转写示例中直接调用异步方法
quickstart(),未绑定.catch()捕获SDK初始化阶段抛出的错误,错误被归类为未处理的Promise拒绝,增加问题排查的复杂度。
- 远程URI转写示例中直接调用异步方法
内容的提问来源于stack exchange,提问作者Rayhan Memon
相关产品推荐
相关产品推荐

