使用Lambda函数和Google Cloud Speech-to-Text,对存储在S3中的wav文件进行文字转录

使用Lambda函数将存储在S3中的wav文件转换为文本稿件,借助Google Cloud Speech-to-Text。

首先

我将根据以下链接提供的文章,总结一下使用Lambda将存储在S3上的wav文件转录成文本的过程中使用的Google Cloud Speech-to-Text的方法。

使用S3 + ElasticTranscoder + Lambda + Google Cloud Speech-to-Text API的组合,可以自动将视频音频转换为文本。

因为上面的文章完全是我的文章的升级版本,所以可能没必要阅读我的文章了吧。

创建S3

1-1. 使用一个随意的存储桶名称和区域(我选择东京)然后继续。
1-2. 不进行任何选项设置。
1-3. 不进行任何访问权限设置(将所有公共访问都阻止)。
1-4. 进行确认。

2. 在本地安装Google Cloud语音转文本API

为了使用Google Cloud Speech-to-Text API,使用npm在本地进行安装。
为了将其作为lambda的图层(layer)添加,将目录命名为nodejs。

创建一个名为nodejs的文件夹
进入nodejs文件夹
运行npm init命令
运行npm install @google-cloud/speech命令

将包含node_modules的nodejs文件夹压缩成zip文件(nodejs.zip)。

创建Lambda层。

将之前创建的zip文件作为层添加到lambda。
3-1. 从Lambda的层页面转到创建层页面。
3-2. 输入适当的名称和描述。
3-3. 上传zip文件。
3-4. 在运行环境中选择您的Node.js版本(我选择的是10.x)。
4-5. 创建。

获取Google Cloud Speech-to-Text的服务帐户。

为了将其配置在lambda函数中,可以使用JSON格式来获取服务账号密钥。
4-1. 进入GCP的API和服务内的Cloud Speech-to-Text。
4-2. 启用API。
4-3. 在认证信息中创建“+创建认证信息”,选择服务账号并创建服务账号。
4-4. 创建完后,添加密钥并获取JSON格式的秘钥。

5. 创建lambda函数

image.png

5-9. 代码借用了这个代码。稍微做了一些修改,以下是贴出来的。

const AWS    = require('aws-sdk');
const speech = require('@google-cloud/speech');
const client = new speech.SpeechClient();
var s3 = new AWS.S3({
    apiVersion: '2012-09-25'
});

exports.handler = function(event, context) {
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    var name = key.split('.')[0];
    var params = {
        Bucket: bucket,
        Key: key
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            var audioBytes = data.Body.toString('base64');
            const audio = { content: audioBytes };
            const config = {
                encoding: 'LINEAR16',
                sampeRateHertz: 16000,
                languageCode: 'ja-JP',
            };
            const request = {
                audio: audio,
                config: config,
            };

            client.recognize(request).then(
                data => {
                    const response = data[0];
                    const transcription = response.results.map(
                        result => result.alternatives[0].transcript
                    ).join('\n');
                console.log(name);
                console.log(transcription);

                }).catch(err => {
                    console.error('ERROR:', err);
                }
            );
        };
    });
}
image.png

结果

请通过 console.log(transcription) 将文字起稿结果输出到 transcription 中。请在 CloudWatch 日志中进行确认。

最终
最终, 我只需要一个选项

虽然成为了一个类似于参考文章的劣化版文章,但我把它作为备忘录来写了。
以下是改良点,相对于劣化版而言:
* 尝试将node_modules与函数代码一起压缩为zip,但未成功,于是从layer中加入(需要注意使用文件名nodejs)
* 添加了添加服务账号信息作为环境变量的步骤
* 简化和修复了源代码。

如果有任何错误,请务必留下评论。
下一次我想尝试做mp3的文字转录。
→(2020/06/30补充说明)我将使用Lambda调用Google Cloud Speech-to-Text来将保存在S3上的MP3文件进行文字转录。

请注意这一点

使用S3 + ElasticTranscoder + Lambda + Google Cloud Speech-to-Text API的组合,自动将视频音频转化成文本。

广告
将在 10 秒后关闭
bannerAds