IBMのWatson Speech to TextをTypeScriptで呼び出してみた

11271 ワード

はじめに

IBMのWatson Speech to TextをTypeScriptで呼び出してみた。検索しても日本語情報少なめやったので記録。
記載してる内容は、公式サイトの抜粋なので、実際に使うときは最後のリンク先を要参照。

前提

以下の手順は、IBM Cloudのアカウント持ってる前提。
IBM Cloudのアカウントは下記サイトから、ポチポチクリックしてたら登録できるはず。
IBM Cloud - 日本 | IBM

IBM Cloudでリソースの登録とAPI Keyの取得

IBM Cloudでリソースの登録とAPI Keyの取得方法は以下の通り。
特に迷う部分はないと思う。

カタログから、Speech to Textを探す。

ロケーション等を選択してリソースを作成する。

リソース・リストから作成したSpeech to Textリソースを選ぶ

API KeyとURLを取得する。

Node.js x TypeScriptの設定

Node.js x TypeScriptの設定方法は以下の通り。
試しに使ってみるだけなら、ほぼほぼデフォルトで大丈夫やった。

下記コマンドを打って、環境を作る。
nodeのバージョンに合わせて、@types/nodeをインストールしてる。

npm init
node -v
npm install -D typescript @types/node@14
npx tsc --version
npx tsc --init
npm install ibm-watson@^7.0.0 
npm install -D ts-node

コード

コードは、以下の通り。

  1. ここのコードをコピペして、
  2. なんとなく、requireしているところをimportにして、
  3. 不要なパラメータ削って、
  4. apikeyとserviceUrlを環境変数から取ってきた

apikeyとserviceUrlは、上記手順でIBM Cloudから取得したものを使用。
linterに怒られてないからこれで大丈夫そう。

import fs from 'fs';
import SpeechToTextV1 from 'ibm-watson/speech-to-text/v1';
import { IamAuthenticator } from 'ibm-watson/auth';

const speechToText = new SpeechToTextV1({
    authenticator: new IamAuthenticator({
        apikey: process.env.SPEECH_TO_TEXT_APIKEY || '',
    }),
    serviceUrl: process.env.SPEECH_TO_TEXT_SERVICE_URL || '',
});

const recognizeParams = {
    audio: fs.createReadStream('audio-file.flac'),
    contentType: 'audio/flac',
};

speechToText.recognize(recognizeParams)
    .then(speechRecognitionResults => {
        console.log(JSON.stringify(speechRecognitionResults, null, 2));
    })
    .catch(err => {
        console.log('error:', err);
    });

実行

実行するときは、こんな感じ。.bashrcとか.zshrcとかで環境変数に登録してたら、npx ts-node index.tsでOK。

SPEECH_TO_TEXT_APIKEY=APIKEY SPEECH_TO_TEXT_SERVICE_URL=https://APIURL npx ts-node index.ts

結果はこんな感じのjsonで返ってくる。result.results[0].alternatives[0].transcriptに文字起こし結果が入ってる。いい感じ。

{
  "status": 200,
  "statusText": "OK",
  "headers": {
    "いろいろ": "省略"
  },
  "result": {
    "result_index": 0,
    "results": [
      {
        "final": true,
        "alternatives": [
          {
            "transcript": "several tornadoes touched down as a line of severe thunderstorms swept through Colorado on Sunday ",
            "confidence": 0.94
          }
        ]
      }
    ]
  }
}

おわりに

迷いながら試してたけど、整理してみたら、公式サイトの情報そのままな感じやった。まじめに、公式サイト見ろってことか。。。

参考

参考にしたサイト。公式サイト中心に。

サービスの概要

Speech to Text - IBM Watson | IBM
ここに概要が書かれてる。

APIの仕様

Speech to Textの入門 | IBM Cloud 資料
ここに、APIの仕様が書かれている。モデルのカスタマイズの仕方とかも書かれている。
入門らしく、curlで呼ぶ方法も書かれてるので、まずここから試すのが良さげ。
普通に使うなら、API一回叩くだけで、transcribeしてくれる。
Amazon Transcribeだと、S3に保存してtranscribeする感じやから、シンプルと言えばシンプルな気がする。設計の違いを垣間見れて面白い。良し悪しあるんやろなー。

SDKの仕様

Speech to Text - IBM Cloud API Docs
SDKの仕様はここ。
言語ごとにExampleも載ってる。ありがたや。

Node.jsのSDK

watson-developer-cloud/node-sdk: Node.js library to access IBM Watson services.
Node.jsのSDKのソースコードはここにある。
Watson APIs全部入りなので、Speech to Textのところ探して使う必要ある。

日本語の記事

あまりない。
Speech To Text で音声認識してみた - Qiita ってのがあったけど、古いSDKやった。
やっぱ、AWSとかに比べると情報が少ない・・・。

サンプルコード

まずは公式のSDKがあるgithubSDKの使い方が書かれたサイトをコピペするところから始めるのが良さげ。websocket使ってストリーミング処理もできるみたい。試してないけど。websocketわからん。