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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Twilio

Twilioは電話・SMS・ビデオ・チャット・SNS連携等、様々なコミュニケーションチャネルの融合を可能とするクラウドコミュニケーションAPIサービスです。 従来は大規模な設備投資が必要だった電話と連携したシステムも、汎用的な開発言語で容易に開発が可能となり、 様々なコミュニケーションチャネルを活用したシステム構築が可能となります。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

0回答

1575閲覧

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

yy_tn

総合スコア299

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Twilio

Twilioは電話・SMS・ビデオ・チャット・SNS連携等、様々なコミュニケーションチャネルの融合を可能とするクラウドコミュニケーションAPIサービスです。 従来は大規模な設備投資が必要だった電話と連携したシステムも、汎用的な開発言語で容易に開発が可能となり、 様々なコミュニケーションチャネルを活用したシステム構築が可能となります。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

1グッド

1クリップ

投稿2021/10/14 07:44

編集2021/10/20 02:02

前提・実現したいこと

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の再起動等も何回もしているので、ずっと残っているというのもよくわかりません…

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

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

該当のソースコード

javascript

1const WebSocket = require("ws"); 2const express = require("express"); 3const app = express(); 4const server = require("http").createServer(app); 5const wss = new WebSocket.Server({ server }); 6const alawmulaw = require("alawmulaw"); 7const base64 = require("js-base64"); 8const path = require("path"); 9 10const { 11 SpeechRecognizer, 12 SpeechConfig, 13 AudioInputStream, 14 AudioConfig, 15 AudioStreamFormat, 16 ResultReason, 17 CancellationReason, 18} = require("microsoft-cognitiveservices-speech-sdk"); 19 20// Include Azure Speech to Text 21const speechConfig = SpeechConfig.fromSubscription("{Key}", "{Region}"); 22speechConfig.speechRecognitionLanguage = "ja-JP"; 23 24// Handle Web Socket Connection 25wss.on( 26 "connection", 27 (connection = (ws) => { 28 console.log("New Connection Initiated"); 29 30 // Configure Transcription Request 31 const azurePusher = AudioInputStream.createPushStream(AudioStreamFormat.getWaveFormatPCM(8000, 16, 1)); 32 const audioConfig = AudioConfig.fromStreamInput(azurePusher); 33 const recognizer = new SpeechRecognizer(speechConfig, audioConfig); 34 35 recognizer.recognizing = (s, e) => { 36 console.log(`RECOGNIZING: Text=${e.result.text}`); 37 }; 38 39 recognizer.recognized = (s, e) => { 40 if (e.result.reason == ResultReason.RecognizedSpeech) { 41 console.log(`RECOGNIZED: Text=${e.result.text}`); 42 43 wss.clients.forEach((client) => { 44 if (client.readyState === WebSocket.OPEN) { 45 client.send( 46 JSON.stringify({ 47 event: "interim-transcription", 48 text: e.result.text, 49 }) 50 ); 51 } 52 }); 53 } else if (e.result.reason == ResultReason.NoMatch) { 54 console.log("NOMATCH: Speech could not be recognized."); 55 } 56 }; 57 58 recognizer.canceled = (s, e) => { 59 console.log(`CANCELED: Reason=${e.reason}`); 60 61 if (e.reason == CancellationReason.Error) { 62 console.log(`"CANCELED: ErrorCode=${e.errorCode}`); 63 console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`); 64 console.log("CANCELED: Did you update the key and location/region info?"); 65 } 66 67 recognizer.stopContinuousRecognitionAsync(); 68 }; 69 70 recognizer.sessionStopped = (s, e) => { 71 console.log("\n Session stopped event."); 72 recognizer.stopContinuousRecognitionAsync(); 73 }; 74 75 recognizer.startContinuousRecognitionAsync( 76 () => { 77 console.log("Continuous Reco Started"); 78 }, 79 (err) => { 80 console.trace("err - " + err); 81 recognizer.close(); 82 recognizer = undefined; 83 } 84 ); 85 86 ws.on( 87 "message", 88 (incoming = (message) => { 89 const msg = JSON.parse(message); 90 switch (msg.event) { 91 case "connected": 92 console.log(`A new call has connected.`); 93 94 break; 95 96 case "start": 97 console.log(`Starting Media Stream ${msg.streamSid}`); 98 break; 99 100 case "media": 101 // Write Media Packets to the recognize stream 102 let streampayload = base64.decode(msg.media.payload); 103 let mulawdata = Buffer.from(streampayload); 104 105 let pcmdata = Buffer.from(alawmulaw.mulaw.decode(mulawdata)); 106 azurePusher.write(pcmdata.buffer); 107 108 // console.log("\n---------pcm " + pcmdata.length.toString() + "----------"); 109 110 //2 let rawPcm = alawmulaw.mulaw.decode(msg.media.payload); 111 //2 let uintView = new Uint8Array(rawPcm.buffer); 112 //2 azurePusher.write(uintView); 113 114 break; 115 116 case "stop": 117 console.log(`Call Has Ended`); 118 azurePusher.close(); 119 recognizer.stopContinuousRecognitionAsync(); 120 recognizer.close(); 121 break; 122 } 123 }) 124 ); 125 }) 126); 127 128//Handle HTTP Request 129app.get("/", (req, res) => res.sendFile(path.join(__dirname, "/index.html"))); 130 131app.post("/", (req, res) => { 132 res.set("Content-Type", "text/xml"); 133 134 res.send(` 135 <Response> 136 <Start> 137 <Stream url="wss://${req.headers.host}/"/> 138 </Start> 139 <Say voice="alice" language="ja-JP">次の60秒間のオーディオをWebSocketからストリーミングします</Say> 140 <Pause length="60" /> 141 </Response> 142 `); 143}); 144 145console.log("Listening at Port 8080"); 146server.listen(8080); 147

2021/10/20 追記

html

1<!DOCTYPE html> 2<html> 3 4<head> 5 <title>Twilio MediaStreams</title> 6</head> 7 8<body> 9 <h1>Twilio MediaStreams</h1> 10 <h3> 11 リアルタイムで話した内容がテキストに変換されます 12 </h3> 13 <p id="transcription-container"></p> 14 <script> 15 document.addEventListener("DOMContentLoaded", event => { 16 webSocket = new WebSocket("ws://localhost:8080"); 17 webSocket.onmessage = function(msg) { 18 const data = JSON.parse(msg.data); 19 if (data.event === "interim-transcription") { 20 document.getElementById("transcription-container").innerHTML = 21 data.text; 22 } 23 }; 24 }); 25 </script> 26</body> 27 28</html>
Tak1wa👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2021/10/19 15:23

index.htmlの内容も開示可能でしょうか?
yy_tn

2021/10/20 02:06

index.htmlを追記しました。画面の方はただ結果を表示しているだけですので、nodeの方の実行ログの通りに表示されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問