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

# はじめに

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

# 前提

以下の手順は、IBM Cloud のアカウント持ってる前提。
IBM Cloud のアカウントは下記サイトから、ポチポチクリックしてたら登録できるはず。
[IBM Cloud - 日本 | IBM](https://www.ibm.com/jp-ja/cloud?utm_content=SRCWW&p1=Search&p4=43700057552711292&p5=e&gclid=CjwKCAjwgr6TBhAGEiwA3aVuIYYUXGRZwYyHW5zNY-PY3Hg7QUOJsGUXL63zgsutN9DUu2xpNbk6zBoCMO0QAvD_BwE&gclsrc=aw.ds)

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

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

カタログから、Speech to Text を探す。
![catalog-IBM-Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/01b0b77d-3ee7-25fd-0906-423a4017304f.png)

ロケーション等を選択してリソースを作成する。
![Speech-to-Text-IBM-Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/fd728bae-0a65-2c27-07a9-fd67b28e41aa.png)

リソース・リストから作成した Speech to Text リソースを選ぶ。
![IBM-Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/962996ec-c294-1afc-7c3b-7bc37d81d7aa.png)
![resource-IBM-Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/977045cc-d086-34e9-24e2-4520ee535edc.png)

API Key と URL を取得する。
![IBM-Watson-service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/d4b64029-f1f0-8851-eb3f-0ef6c0ea3c55.png)

# 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. [ここ](https://cloud.ibm.com/apidocs/speech-to-text?code=node#recognize)のコードをコピペして、
2. なんとなく、`require`しているところを`import`にして、
3. 不要なパラメータ削って、
4. apikey と serviceUrl を環境変数から取ってきた

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

```typescript
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`に文字起こし結果が入ってる。いい感じ。

```json
{
  "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](https://www.ibm.com/cloud/watson-speech-to-text)
ここに概要が書かれてる。

## API の仕様

[Speech to Text の入門 | IBM Cloud 資料](https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-gettingStarted#getting-started-tutorial)
ここに、API の仕様が書かれている。モデルのカスタマイズの仕方とかも書かれている。
入門らしく、`curl`で呼ぶ方法も書かれてるので、まずここから試すのが良さげ。
普通に使うなら、API 一回叩くだけで、transcribe してくれる。
[Amazon Transcribe](https://aws.amazon.com/jp/transcribe/)だと、S3 に保存して transcribe する感じやから、シンプルと言えばシンプルな気がする。設計の違いを垣間見れて面白い。良し悪しあるんやろなー。

## SDK の仕様

[Speech to Text - IBM Cloud API Docs](https://cloud.ibm.com/apidocs/speech-to-text?code=node#recognize)
SDK の仕様はここ。
言語ごとに Example も載ってる。ありがたや。

## Node.js の SDK

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

## 日本語の記事

あまりない。
[Speech To Text で音声認識してみた - Qiita](https://qiita.com/Haruka-Ogawa/items/a022cee97a7455e1e9eb) ってのがあったけど、古い SDK やった。
やっぱ、AWS とかに比べると情報が少ない・・・。

## サンプルコード

まずは公式の[SDK がある github](https://github.com/watson-developer-cloud/node-sdk#speech-to-text)と[SDK の使い方が書かれたサイト](https://cloud.ibm.com/apidocs/speech-to-text?code=node#recognize)をコピペするところから始めるのが良さげ。websocket 使ってストリーミング処理もできるみたい。試してないけど。websocket わからん。

# メモ
Zennに投稿してた記事をこっちにお引越しした（2022/11/04）