44、云语音与云翻译:音频转文本及多语言翻译技术解析

云语音与云翻译:音频转文本及多语言翻译技术解析

1. 云语音 API 音频识别

云语音 API 能够将音频流转换为文本,不过在处理不同类型音频时,需要运用不同的方法。

1.1 连续语音识别

当处理大音频文件或者实时音频流时,无法将整个音频文件作为一个大块发送给 API 进行识别。此时,云语音 API 支持异步识别,它可以接受数据块,在处理过程中进行识别,并在音频流完成后返回最终结果。以下是相关代码示例:

const fs = require('fs');
const speech = require('@google-cloud/speech')({
  projectId: 'your-project-id',
  keyFilename: 'key.json'
});
const audioFilePath = 'gs://cloud-samples-tests/speech/brooklyn.flac';
const config = {
  encoding: 'FLAC',
  sampleRate: 16000,
  verbose: true
};
speech.startRecognition(audioFilePath, config).then((result) => { 
  const operation = result[0];                                 
  operation.on('complete', (results) => {                         
   console.log('This audio file says: "' + results[0].transcript + '"',
   '(with ' + Math.round(results[0].confidence) + '% confidence)');
  });
});

在这个示例中,使用 startRecognition 方法启动流式识别,该方法返回一个“长时间运行的操作”,在识别过程中会触发事件,完成后返回识别的文本。

1.2 自定义词汇和短语提示

由于语言不断发展,新词汇和俚语不断涌现,云语音 API 可能无法识别这些新内容。为了帮助 API 更好地识别,可以传递一些有效短语的建议,这些建议将被添加到 API 的排名系统中。以下是一个示例:

const config = {
  encoding: 'FLAC',
  sampleRate: 16000,
  verbose: true,
  speechContext: { phrases: [   
    "the Brooklynne Bridge"
  ]}
};

运行此脚本后,API 会使用提供的替代拼写,但置信度会有所降低,因为存在多个高得分结果,这使得 API 在选择时的信心降低。

此外,云语音 API 还提供了脏话过滤功能,通过在配置中设置 profanityFilter 属性为 true ,可以将识别出的脏话“星号化”,只保留第一个字母。

1.3 定价说明

云语音 API 遵循谷歌云平台的计费模式,仅根据使用量收费。计费依据是发送给 API 进行识别的音频文件长度,以分钟为单位。每月前 60 分钟为免费额度,超出部分每分钟收费 2.4 美分。目前,API 会将音频输入向上取整到最接近的 15 秒增量进行计费,即每 15 秒收费 0.6 美分。

2. InstaSnap 视频字幕案例

假设 InstaSnap 应用增加了录制和分享视频的功能,现在要根据视频中的音频内容生成建议标签。具体步骤如下:
1. 用户录制并上传视频,并输入字幕。
2. 服务器将音频轨道从视频轨道中分离出来,并将其格式化为普通音频格式。
3. 将音频内容发送到云语音 API 进行识别。
4. 云语音 API 返回转录文本,将其与用户输入的字幕结合。
5. 将所有文本(字幕和视频转录文本)发送到云自然语言 API。
6. 云自然语言 API 识别实体并检测情感,根据这些信息生成建议标签。
7. 将建议标签返回给用户。

以下是实现上述功能的代码:

const Q = require('q');                           
const speech = require('@google-cloud/speech')({
  projectId: 'your-project-id',
  keyFilename: 'key.json'
});
const getTranscript = (videoBuffer) => {
  const deferred = Q.defer();                     
  extractAudio(videoBuffer).then((audioBuffer,
  audioConfig) => {                  
    const config = {
      encoding: audioConfig.encoding, 
      sampleRate: audioConfig.sampleRate, 
      verbose: true
    };
    return speech.startRecognition(audioBuffer, config);
  }).then((result) => {
    const operation = result[0];
    operation.on('complete', (results) => {
      const result = results[0];
      const transcript = result.confidence >50 ? result.transcript : null;
      deferred.resolve(transcript);
    });
    operation.on('error', (err) => {   
      deferred.reject(err);
    });
  }).catch((err) => {
    deferred.reject(err);  
  });
  return deferred.promise;    
};

const language = require('@google-cloud/language')({
  projectId: 'your-project-id',
  keyFilename: 'key.json'
});
const getSentimentAndEntities = (content) => {
  const document = language.document(content);        
  const config = {entities: true, sentiment:true, verbose: true};
  return document.annotate(config).then(              
    return new Q(data[0]);  
    // { sentiment: {...}, entities: [...] }     
  });
};

const authConfig = {
  projectId: 'your-project-id',
  keyFilename: 'key.json'
};
const language = require('@google-cloud/language')(authConfig);
const speech = require('@google-cloud/speech')(authConfig);
const handleVideo = (video) => {
  Q.allSettled([                   
    getTranscript(video.buffer).then((transcript) => {    
      return getSentimentAndEntities(video.transcript);
    }),
    getSentimentAndEntities(video.caption)    
  ]).then((results) => {
    let suggestedTags = [];
    results.forEach((result) => {           
      if (result.state === 'fulfilled') {
        const sentiment = result.value.sentiment;
        const entities = result.value.entities;
        const tags = getSuggestedTags(sentiment, entities);
        suggestedTags = suggestedTags.concat(tags);    
      }
    });
    console.log('The suggested tags are', suggestedTags);
    console.log('The suggested caption is',
                '"' + caption + ' ' + suggestedTags.join(' ') + '"');
  });
};

以下是该流程的 mermaid 流程图:

graph LR
    A[用户录制并上传视频,输入字幕] --> B[分离音频轨道]
    B --> C[发送音频到云语音 API]
    C --> D[云语音 API 返回转录文本]
    D --> E[结合转录文本和字幕]
    E --> F[发送文本到云自然语言 API]
    F --> G[云自然语言 API 生成建议标签]
    G --> H[返回建议标签给用户]
3. 云翻译 API 概述

机器翻译旨在解决将一种语言的“概念表示”准确地翻译成另一种语言的问题。然而,人类语言的发展具有独特性,存在诸多复杂因素,如语言复杂度、俚语、方言、词汇无精确翻译以及语义歧义等,这使得翻译问题变得十分困难。

4. 云翻译 API 工作原理
4.1 传统方法

一种解决词汇和语法规则理解问题的方法是教计算机所有不同的单词对和语法规则,但由于语言的复杂性和不断演变,这种方法难以扩展。

4.2 统计机器翻译(SMT)

谷歌翻译在许多语言翻译中使用统计机器翻译(SMT)方法。SMT 基于罗塞塔石碑的概念,依靠数百万份至少有一对语言翻译的文档,扫描这些文档以识别常见模式,假设这些模式频繁出现则可能是原文和译文之间的匹配。例如,在大量英语和西班牙语书籍中,“house”和“casa”出现频率相似,那么当需要翻译“house”时,“casa”很可能是正确答案。

然而,SMT 方法存在缺点,它是逐句翻译而不是整体翻译,对于未在训练文档中出现过的单词无法翻译,翻译结果可能会显得生硬。例如,将德语句子“Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.”翻译成英语时,结果可能不太自然。

4.3 神经网络机器翻译(GNMT)

为了解决 SMT 的问题,谷歌采用了神经网络机器翻译(GNMT)系统。该系统基于神经网络,使用定制的硬件以保证速度,具有“覆盖惩罚”机制,避免神经网络忘记翻译句子的某些部分,并进行了许多技术优化以降低训练和存储成本。使用 GNMT 后,翻译结果更加流畅自然,例如上述德语句子的翻译变得更易读。

目前,谷歌翻译和云翻译 API 在常见语言(如英语与法语、德语等)的翻译中都使用神经网络技术。

以下是 SMT 和 GNMT 翻译效果对比表格:
| 翻译方法 | 优点 | 缺点 | 示例 |
| ---- | ---- | ---- | ---- |
| 统计机器翻译(SMT) | 基于大量文档识别模式,接近人工翻译 | 逐句翻译,结果生硬,无法处理未见过的单词 | “Probleme kann man niemals…” 翻译不自然 |
| 神经网络机器翻译(GNMT) | 翻译结果流畅自然 | 技术复杂,成本较高 | “Probleme kann man niemals…” 翻译更易读 |

5. 云翻译 API 定价计算

云翻译 API 的定价也是根据使用量来计算的。不过这里的使用量是指需要翻译的文本字符数。一般来说,它会有一个免费的字符额度,在这个额度内使用是不收费的。超出免费额度后,会按照每一定数量的字符收取一定的费用。具体的免费额度和收费标准可能会根据不同的套餐和时期有所变化。

6. 云翻译 API 应用案例:图像字幕翻译

假设我们有一个应用,需要对图像的字幕进行翻译,以满足不同语言用户的需求。以下是实现这个功能的步骤:

  1. 获取图像字幕 :从图像的元数据或者相关的数据库中获取字幕文本。
  2. 选择目标语言 :根据用户的设置或者应用的需求,确定要翻译成的目标语言。
  3. 调用云翻译 API :将字幕文本和目标语言信息发送给云翻译 API 进行翻译。
  4. 显示翻译结果 :将翻译后的字幕显示在图像旁边或者相关的界面上。

以下是一个简单的代码示例,使用 Node.js 调用云翻译 API 进行翻译:

const { Translate } = require('@google-cloud/translate').v2;

// 初始化翻译客户端
const translate = new Translate({
  projectId: 'your-project-id',
  keyFilename: 'key.json'
});

// 要翻译的文本
const text = 'This is an example caption';
// 目标语言
const target = 'es';

async function translateText() {
  // 调用翻译 API
  const [translation] = await translate.translate(text, target);
  console.log(`Translation: ${translation}`);
}

translateText().catch(console.error);

以下是该流程的 mermaid 流程图:

graph LR
    A[获取图像字幕] --> B[选择目标语言]
    B --> C[调用云翻译 API]
    C --> D[显示翻译结果]
7. 总结
  • 云语音 API :能够高效地将音频转换为文本,支持连续语音识别和自定义词汇提示等功能。在处理大音频文件和实时音频流时,异步识别功能非常实用。同时,通过自定义词汇可以提高对特定词汇的识别准确率,但可能会降低整体的置信度。此外,云语音 API 还提供了脏话过滤功能,并且其定价模式合理,根据使用的音频时长收费。
  • InstaSnap 视频字幕案例 :展示了云语音 API 和云自然语言 API 的结合应用,通过将视频中的音频内容转换为文本,并结合用户输入的字幕,利用云自然语言 API 生成建议标签,为视频内容的处理和推荐提供了有效的解决方案。
  • 云翻译 API :面对复杂的语言翻译问题,采用了统计机器翻译和神经网络机器翻译等方法。统计机器翻译基于大量文档识别模式,但存在翻译生硬和无法处理未见过单词的问题;而神经网络机器翻译则通过优化技术,使得翻译结果更加流畅自然。云翻译 API 在图像字幕翻译等场景中具有广泛的应用前景。

通过合理运用云语音 API 和云翻译 API,开发者可以为用户提供更加智能、便捷的音频和语言处理服务,满足不同场景下的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值