質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.51%

Azure Speech To Textで言ってない言葉が返ってくる(誤変換、誤認識ではなく明らかに異なる)

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 89

score 276

前提・実現したいこと

AzureのSpeechToTextを利用して、入力音声のリアルタイムテキスト変換を行おうとしています。

発生している問題

実際に音声を自分で喋って入力しているんですが、「テストテスト」や「こんにちはよろしく」等の言葉を話しても、
テキスト変換されて返って来たものは、「もし」「もしもし」等になっています。以下実行ログです。

実行時のログ

node index_azure.js
Listening at Port 8080
New Connection Initiated
Continuous Reco Started
A new call has connected.
Starting Media Stream MZfbe576884cb91fd7b6bb2d40xxxxxxx
RECOGNIZING: Text=もし
RECOGNIZED: Text=もし。
RECOGNIZING: Text=もしもし
RECOGNIZED: Text=もしもし。
RECOGNIZING: Text=もし
RECOGNIZED: Text=もし。
RECOGNIZING: Text=もし
Call Has Ended
RECOGNIZED: Text=もし。
NOMATCH: Speech could not be recognized.

    Session stopped event.

実際に喋ったタイミングでテキストが返ってきて表示されるので、入力した音声自体は正しくAzure側に渡せていると思うのですが…

「もし」や「もしもし」等の言葉から察するに、過去にそう喋った内容がいつまでも出ている?のかなと
考えているのですが、nodeの再起動等も何回もしているので、ずっと残っているというのもよくわかりません…

何かテキストの取得方法が間違っている?と思いますが、エラーが出ているわけではないので
どのように対処すればいいのかわかりません。

何かわかりましたらお教え頂けると幸いです。
よろしくお願いいたします。

該当のソースコード

const WebSocket = require("ws");
const express = require("express");
const app = express();
const server = require("http").createServer(app);
const wss = new WebSocket.Server({ server });
const alawmulaw = require("alawmulaw");
const base64 = require("js-base64");
const path = require("path");

const {
  SpeechRecognizer,
  SpeechConfig,
  AudioInputStream,
  AudioConfig,
  AudioStreamFormat,
  ResultReason,
  CancellationReason,
} = require("microsoft-cognitiveservices-speech-sdk");

// Include Azure Speech to Text
const speechConfig = SpeechConfig.fromSubscription("{Key}", "{Region}");
speechConfig.speechRecognitionLanguage = "ja-JP";

// Handle Web Socket Connection
wss.on(
  "connection",
  (connection = (ws) => {
    console.log("New Connection Initiated");

    // Configure Transcription Request
    const azurePusher = AudioInputStream.createPushStream(AudioStreamFormat.getWaveFormatPCM(8000, 16, 1));
    const audioConfig = AudioConfig.fromStreamInput(azurePusher);
    const recognizer = new SpeechRecognizer(speechConfig, audioConfig);

    recognizer.recognizing = (s, e) => {
      console.log(`RECOGNIZING: Text=${e.result.text}`);
    };

    recognizer.recognized = (s, e) => {
      if (e.result.reason == ResultReason.RecognizedSpeech) {
        console.log(`RECOGNIZED: Text=${e.result.text}`);

        wss.clients.forEach((client) => {
          if (client.readyState === WebSocket.OPEN) {
            client.send(
              JSON.stringify({
                event: "interim-transcription",
                text: e.result.text,
              })
            );
          }
        });
      } else if (e.result.reason == ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be recognized.");
      }
    };

    recognizer.canceled = (s, e) => {
      console.log(`CANCELED: Reason=${e.reason}`);

      if (e.reason == CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you update the key and location/region info?");
      }

      recognizer.stopContinuousRecognitionAsync();
    };

    recognizer.sessionStopped = (s, e) => {
      console.log("\n    Session stopped event.");
      recognizer.stopContinuousRecognitionAsync();
    };

    recognizer.startContinuousRecognitionAsync(
      () => {
        console.log("Continuous Reco Started");
      },
      (err) => {
        console.trace("err - " + err);
        recognizer.close();
        recognizer = undefined;
      }
    );

    ws.on(
      "message",
      (incoming = (message) => {
        const msg = JSON.parse(message);
        switch (msg.event) {
          case "connected":
            console.log(`A new call has connected.`);

            break;

          case "start":
            console.log(`Starting Media Stream ${msg.streamSid}`);
            break;

          case "media":
            // Write Media Packets to the recognize stream
            let streampayload = base64.decode(msg.media.payload);
            let mulawdata = Buffer.from(streampayload);

            let pcmdata = Buffer.from(alawmulaw.mulaw.decode(mulawdata));
            azurePusher.write(pcmdata.buffer);

            // console.log("\n---------pcm " + pcmdata.length.toString() + "----------");

            //2 let rawPcm = alawmulaw.mulaw.decode(msg.media.payload);
            //2 let uintView = new Uint8Array(rawPcm.buffer);
            //2 azurePusher.write(uintView);

            break;

          case "stop":
            console.log(`Call Has Ended`);
            azurePusher.close();
            recognizer.stopContinuousRecognitionAsync();
            recognizer.close();
            break;
        }
      })
    );
  })
);

//Handle HTTP Request
app.get("/", (req, res) => res.sendFile(path.join(__dirname, "/index.html")));

app.post("/", (req, res) => {
  res.set("Content-Type", "text/xml");

  res.send(`
      <Response>
        <Start>
          <Stream url="wss://${req.headers.host}/"/>
        </Start>
        <Say voice="alice" language="ja-JP">次の60秒間のオーディオをWebSocketからストリーミングします</Say>
        <Pause length="60" />
      </Response>
    `);
});

console.log("Listening at Port 8080");
server.listen(8080);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る