Fastify 是一个快速和低开销的 Web 框架,它支持异步编程风格和 HTTP/2。在这个文章中,我们将讨论如何使用 Fastify 实现语音识别服务的 API,这将有助于您更好地了解如何使用 Fastify 构建 Web 服务。
前置准备
在开始之前,我们需要安装一些必要的包以方便进行开发:
npm install fastify fastify-multipart axios @splitmedialabs/node-fluent-ffmpeg
需要提及的是,我们使用了 @splitmedialabs/node-fluent-ffmpeg 这个库来处理音频。
实现语音识别 API
首先,我们需要创建一个 Fastify 的实例:
const fastify = require('fastify')({ logger: true });
然后,我们创建一个路由处理程序,接受上传的音频文件。我们使用 fastify-multipart 插件来处理 multipart/form-data 格式的表单数据。这里我们只读取并存储音频文件:
// javascriptcn.com 代码示例 fastify.post('/upload-audio', { preHandler: fastify.uploadFieldsMiddleware }, async (request, reply) => { // 从请求中获取音频文件 const { audio } = request.files; try { // 将音频文件存储到硬盘 const { filename } = await request.saveFile(audio); // 在控制台上打印存储路径 console.log('file saved at', filename); // 返回存储路径 return { filename }; } catch (error) { console.error('upload-audio', error); reply.code(500).send({ error: "Failed to upload audio" }); } });
接下来,我们需要使用第三方 API 让其转换音频文件并进行语音识别。我们们使用了百度云的语音识别 API,同样使用 axios 来发起请求,我们需要先通过 auth
接口获取 AccessToken:
// javascriptcn.com 代码示例 fastify.get('/baidu/auth', async (request, reply) => { const url = 'https://openapi.baidu.com/oauth/2.0/token'; try { const response = await axios.get(url, { params: { grant_type: 'client_credentials', client_id: 'YOUR_APP_KEY', client_secret: 'YOUR_APP_SECRET', } }); const { access_token } = response.data; // 返回 accessToken return { access_token }; } catch (error) { console.error('baidu/auth', error); reply.code(500).send({ error: "Failed to get access token" }); } });
接下来我们使用语音识别接口,其中就用到了上述的 @splitmedialabs/node-fluent-ffmpeg 来将音频文件转换为百度 API 支持的格式,并发起 POST 请求:
// javascriptcn.com 代码示例 fastify.post('/baidu/speech-recognition', async (request, reply) => { const url = 'https://vop.baidu.com/server_api'; const { access_token } = request.query; try { const { filename } = request.body; // 将音频转换为百度 API 支持的格式 const audioPath = 'tmp/audio_converted.pcm'; const audioConverted = ffmpeg(filename).audioFrequency(16000).audioChannels(1).format('s16le').save(audioPath); // 构建 POST 数据 const audio = fs.readFileSync(audioPath); const data = audio.toString('base64'); const options = { headers: { 'Content-Type': 'application/json', }, data: { format: 'pcm', cuid: 'mynodejs', lan: 'zh', token: access_token, speech: data, len: audio.byteLength } }; // 发起 POST 请求 const response = await axios.post(url, options.data, { headers: options.headers }); // 返回语音识别结果 return response.data; } catch (error) { console.error('baidu/speech-recognition', error); reply.code(500).send({ error: "Failed to recognize speech" }); } });
总结
在这篇文章中,我们使用 Fastify 和第三方库来实现了语音识别服务的 API。我们展示了如何使用 fastify-multipart 处理上传的音频文件,并使用 @splitmedialabs/node-fluent-ffmpeg 将它转换为百度 API 所需的格式,最终通过 axios 发起请求并得出语音识别的结果。如果您尝试实现一个语音识别服务,这里的代码一定能给您有所启示!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653a36e57d4982a6eb40bc7e