https://a.storyblok.com/f/270183/127734/5c2b44174f/multitrack-call-transcription_1200x675.jpg

分割録音によるマルチトラック通話テープ起こし

最終更新日 May 10, 2021

所要時間:1 分

4月に発表した 分割録音がNexmo Voice APIの一部として利用可能になったと発表しました。スプリット・レコーディングは、会話をステレオで録音し、それぞれのチャンネルに参加者を1人ずつ配置することができます。これにより、テープ起こしのような一般的なユースケースをより簡単に扱うことができます。

参加者が2人以上いる場合、最初の参加者はチャンネル0に、他の参加者はチャンネル1になる。

Nexmoが1つ、2つではなく、3つ(!)のチャンネルを別々に録音できるようになったと言ったらどうだろう?それで満足ですか?4つもサポートできると言ったらどうだろう?5つも?Nexmoは最大32チャンネルまでのレコーディングに対応できるようになりました。Nexmoは32チャンネルのオーディオを提供することができます。

前回と同じように、簡単なユースケースを一緒に見ていきましょう。このシナリオでは、AliceがBobとCharlieと仕事のプロジェクトについて話し合う必要があり、通話を録音するのが良いアイデアだと全員が合意しています。これを実現するために、AliceはNexmoを使ってBobとCharlieに接続し、会話を録音する小さなNode.jsアプリケーションを作りました。

この記事のコードはすべて Github.

アプリケーションのブートストラップ

最初にすべきことは、新しいアプリケーションを作成し、依存関係をすべてインストールすることだ。そのために npmを使ってプロジェクトを初期化し expressそして body-parserをインストールしてHTTPリクエストを処理し dotenvでアプリケーションの設定を行います。また nexmoクライアントをインストールする必要があります。 @google-cloud/speech音声を書き起こすために。

npm init -y
npm install express body-parser dotenv nexmo @google-cloud/speech --save

すべての依存関係をインストールしたら、アプリケーションを作成し、人々が電話できる番号を借りる必要がある。

Nexmoは、アプリケーション内でイベントが発生すると、アプリケーションにHTTPリクエストを送信します。例えば、電話が鳴り始めた時、電話に出た時、通話録音が可能になった時などです。そのためにはNexmoがお客様のアプリケーションにアクセスできる必要がありますが、アプリケーションがラップトップ上でローカルに動作している場合は困難です。インターネット経由でローカルのアプリケーションを公開するには ngrok.詳しくは ngrokの紹介ブログ記事をご覧ください。

を実行してサーバを公開します。 ngrok http 3000.に似たテキストが表示されるはずです。 http://2afec62c.ngrok.io -> localhost:3000.最初のセクションがあなたのngrok URLで、この記事の残りの部分に必要なものです。

ようやくNexmoアプリケーションを作成し、番号をリンクする準備が整いました。以下の例では http://2afec62c.ngrok.ioを自分のngrok URLに置き換える必要があります:

# Create an application
nexmo app:create "MultiTranscription" http://2afec62c.ngrok.io/webhooks/answer http://2afec62c.ngrok.io/webhooks/event --keyfile private.key
# Application created: aaaaaaaa-bbbb-cccc-dddd-0123456789ab <- Make a note of this, you'll need it later

# Purchase a number
nexmo number:buy --country_code GB
# Number purchased: 442079460005 <- You'll need this too

# Link our number to our application
nexmo link:app NUMBER APPLICATION_ID

購入した電話番号に電話をかけると、Nexmoはその電話の処理方法を調べるために http://[id].ngrok.io/webhooks/answerにリクエストします。まだそのアプリケーションを構築していないので、通話は失敗する。

インバウンドコールへの対応

インバウンドコールを処理するアプリケーションを作ってみよう。

ファイルを作成し index.jsファイルを作成し、以下に示すコードを入力する。これで requireすべての依存関係を設定し、Nexmoクライアントを設定し、新しいインスタンスを作成します。 expressインスタンスを作成します:

require("dotenv").config();

const express = require("express");
const bodyParser = require("body-parser");
const Nexmo = require("nexmo");

const nexmo = new Nexmo({
    apiKey: "not_used", // Voice applications don't use the API key or secret
    apiSecret: "not_used", 
    applicationId: process.env.NEXMO_APPLICATION_ID,
    privateKey: process.env.NEXMO_PRIVATE_KEY_PATH
});

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

次に /webhooks/answerエンドポイントを作成する必要があります。 NCCOを返します。NCCOでは connectBobとCharlieの電話番号を自動的にダイヤルして会話に追加するアクションと、Nexmoに通話を録音するように指示するアクションを使います。 recordアクションを使います。

アクションは recordアクションはマジックが起こる場所です。Nexmoにオーディオを別々のチャンネルに分割するように指示します。 split: conversationを設定することで、オーディオを3つのチャンネルに分割します。 channels: 3.

app.get('/webhooks/answer', (req, res) => {
    return res.json([
        {
            action: 'connect',
            endpoint: [{
                type: 'phone',
                number: process.env.BOB_PHONE_NUMBER
            }]
        },
        {
            action: 'connect',
            endpoint: [{
                type: 'phone',
                number: process.env.CHARLIE_PHONE_NUMBER
            }]
        },
        {
            "action": "record",
            "eventUrl": [`${req.protocol}://${req.get('host')}/webhooks/recording`],
            "split": "conversation",
            "channels": 3,
            "format": "wav"
        }
    ]);
});

しかし、アプリケーションを設定する前に、エンドポイントの作成を終わらせましょう。

を作成する。 /webhooks/eventエンドポイントを作成します。 イベントを作成する。今のところ、やることは、受け取ったパラメータをログに記録し、それを受け取ったことを 204レスポンスを返します。

app.post('/webhooks/event', (req, res) => {
    console.log(req.body);
    return res.status(204).send("");
});

最後に/webhooks/recordingエンドポイントを実装する必要がある。このURLはNCCOの recordアクションで定義され、録音が利用可能になると通知されます。後で自動的に音声を書き起こしますが、今はリクエストパラメータを記録して、何が利用可能かを確認できるようにしましょう。

app.post('/webhooks/recording', (req, res) => {
    transcribeRecording(req.body);
    return res.status(204).send("");
});

function transcribeRecording(params) {
    console.log(params);
}

app.listen(3000, () => console.log(`Listening`))

この時点で、やるべきことはただひとつ。 .envファイルにアプリケーションに必要な情報を入力します。あなたの application_idまた、テストに必要なボブやチャーリーの電話番号も必要です。ファイルを作成し .envファイルを作成し、アプリケーションIDと電話番号を自分の値に置き換えてください:

NEXMO_APPLICATION_ID="aaaaaaaa-bbbb-cccc-dddd-0123456789ab"
NEXMO_PRIVATE_KEY_PATH="./private.key"

BOB_PHONE_NUMBER="442079460000"
CHARLIE_PHONE_NUMBER="442079460001"

GOOGLE_APPLICATION_CREDENTIALS="./google_creds.json"

まだファイルを作成していませんが、Google credentialsの行を追加してください。次のセクションで作成します。

これができたら、アプリケーションをテストすることができます。 node index.jsを実行し、購入したNexmo番号に電話をかけてみてください。ファイルに追加した2つのNumbersに自動的に電話がかかるはずです。 .envファイルに追加した2つの番号に自動的に電話をかけるはずです。 /webhooks/recordingエンドポイントが録音URLを受け取るはずです。

グーグルとの接続

GoogleのSpeech-To-Textサービスを使って通話録音を書き起こします。これを始めるには、次のものが必要です。 Googleクラウドの認証情報を生成するを生成する必要があります。Googleが提供するJSONファイルをダウンロードし、名前を google_creds.jsonにリネームして index.js.これは、Google SDKが認証情報を取得するために読み込もうとするファイルです。

音声データを書き起こすために、Google Speech APIに接続し、期待される言語、録音のチャンネル数、音声ストリームそのものを渡します。あなたの transcribeRecordingメソッドを以下のコードに更新します:

function transcribeRecording(params) {
    const client = new speech.SpeechClient();

    const config = {
        encoding: `LINEAR16`,
        languageCode: params.language,
        audioChannelCount: params.channelCount,
        enableSeparateRecognitionPerChannel: true,
    };

    const request = {
        config: config,
        audio: {
            content: params.audio.toString('base64'),
        }
    };

    return client.recognize(request);
}

これは promiseを返します。これは、書き起こしが利用可能になったときに解決されます。音声SDKを使用する前に、それを要求する必要があります。 requireセクションに追加します:

const speech = require('@google-cloud/speech').v1p1beta1;

この時点で音声を書き起こす準備が整いました。最後のステップは、Nexmoから録音をフェッチすることです。 /webhooks/recordingそして、その音声をGoogleのテープ起こしサービスに送ります。そのために nexmo.files.getメソッドを使い、返された音声を transcribeRecordingメソッドに渡します:

app.post('/webhooks/recording', (req, res) => {
    nexmo.files.get(req.body.recording_url, (err, audio) => {
        if (err) { console.log(err); return; }

        transcribeRecording({
            "language": "en-US",
            "channelCount": 3,
            "audio": audio,
        }).then((data) => {
            const response = data[0];
            const transcription = response.results
                .map(
                    result =>
                    ` Channel Tag: ` +
                    result.channelTag +
                    ` ` +
                    result.alternatives[0].transcript
                )
                .join('n');
            console.log(`Transcription: n${transcription}`);
        });
    });
    return res.status(204).send("");
});

オーディオをパラメータとして渡すだけでなく、以下のように transcribeRecordingメソッドに 3チャンネルがあること、そして en-US言語モデルを使用して書き起こしたいことを伝えます。Google speech SDKによってプロミスが解決されると、その結果を読み、音声がどのチャンネルから来たかを含む会話の書き起こしを出力する。

今Nexmoの番号に電話すると、ボブとチャーリーの両方につながります。通話が終わったら電話を切り、Nexmoから録音ウェブフックが送られてくるのを待ちます。それが届くと、その音声をGoogleに送り、文字起こしがコンソールに表示されます。私の場合はこんな感じです:

Transcription:
Channel Tag: 1 this is channel one
Channel Tag: 2 and this is channel two
Channel Tag: 3 and a test from channel three
Channel Tag: 1 great

結論

わずか76行のコードで、自動文字起こし機能を備えた電話会議システムを構築しました。通話を自動的に書き起こすだけでなく、各チャンネルを別々に書き起こすので、通話中に誰が何を言ったかを知ることができます。通話を録音する際に利用できるオプションの詳細については record actionNCCOリファレンスまたは をご覧ください。の実装例をご覧ください。

シェア:

https://a.storyblok.com/f/270183/384x384/1c8825919c/mheap.png
Michael Heapヴォネージの卒業生

マイケルはポリグロット・ソフトウェア・エンジニアであり、システムの複雑性を軽減し、より予測可能なものにすることに尽力している。さまざまな言語やツールを使いこなし、ユーザーグループやカンファレンスで世界中の聴衆と技術的な専門知識を共有している。日々、マイケルはVonageの元開発者支持者であり、あらゆるテクノロジーについて学び、教え、書くことに時間を費やしている。