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

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

ただいまの
回答率

90.33%

  • Node.js

    2006questions

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

  • Facebook

    415questions

    Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

  • Azure

    230questions

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

Facebook bot でbase64エンコードしたwavデータが"name_placeholder[url] should represent a valid URL"

解決済

回答 1

投稿 編集

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

Miz21358

score 5

実現したいこと

Botframework で作成したbot でAudioCard を使って、Facebook Messenger で音声を流したい

詳細

現在、Botframeworkを使って、Facebook Messenger botを作成しています。
AudioCardに、wavデータをbase64エンコードしたURLを指定して、音声を流そうとしていますが、エラーが発生しまています。
エミュレータでは問題なくAuidoCardを実行でき、音声を聞くことができました。

発生している問題・エラーメッセージ

 Microsoft Bot Framework

{"error":{"message":"(#100) name_placeholder[url] should represent a valid URL","type":"OAuthException","code":100,"fbtrace_id":"xxxxxx"}}

 Azure Web App

!And error ocurred Error: Request to 'https://facebook.botframework.com/v3/conversations/xxxxxx/activities/xxxxxx' failed: [400] Bad Request
    at Request._callback (D:\home\site\wwwroot\node_modules\botbuilder\lib\bots\ChatConnector.js:537:46)
    at Request.self.callback (D:\home\site\wwwroot\node_modules\request\request.js:186:22)
    at emitTwo (events.js:106:13)

該当のソースコード

console.log(result);

//Base64にエンコーディング
var base64 = Buffer.from(result.wave).toString('base64');

// console.log("base64");
// console.log(base64);

// URL生成
var wavUrl = util.format('data:%s;base64,%s', 'audio/wav', base64);

console.log("wavUrl");
console.log(wavUrl);

var speechCard = new builder.AudioCard(session)
                    .title(languageDoc.language_name + " ("+ dialectCountryName +")")
                    .text(inputText +" => "+ translatedText)
                    .media([
                        {url: wavUrl}
                    ]);
// Audioカードを発信する
var msg = new builder.Message(session).addAttachment(speechCard);
session.send(msg);

試したこと

1) クライアント側にwavデータを保存して再生

var file = path.join(os.tmpdir(), inputText +'.wav');
var wstream = fs.createWriteStream(file);
wstream.write(result.wave);
console.log('Text To Speech completed. Audio file written to', file)

var speechCard = new builder.AudioCard(session)
                 .title(languageDoc.language_name + " ("+ dialect")
                 .text(inputText +" => "+ translatedText)
                 .media([
                     {url: file}
                 ])

→ エミュレータではローカルに保存できていたが、サーバにアップロードしたコードからは保存できなかった。(当たり前ですが…)

2) サーバ側にwavデータを保存して再生

var file = './wav/'+ inputText +'.wav';
var wstream = fs.createWriteStream(file);

speechClient.synthesizeStream(translatedText, speechDoc.dialect_code, speechDoc.gender).then(resultStream => {
    resultStream.pipe(wstream);

    resultStream.on('end', function(){
        wstream.close();

        console.log('音声ファイル出力', file);

        var speechCard = new builder.AudioCard(session)
                            .title(languageDoc.language_name + " ("+ dialectCountryName +")")
                            .text(inputText +" => "+ translatedText)
                            .media([
                                {url: __dirname + file}
                            ])
        // スピーチカードを発信する
        var msg = new builder.Message(session).addAttachment(speechCard);
        session.send(msg);
    })
});

→ サーバ内の静的コンテンツURLの取得方法が分かりませんでした。

質問事項

Facebook Messenger で、base64 エンコードした wavデータを流すことは可能でしょうか?
もしくは、サーバ側で保存したwavファイルのURLを指定する方法はありますでしょうか?

解決策、調査方法、手がかり等、どのような小さな事でも構いませんので、何かご存じの方がいらっしゃいましたら、お手数をおかけして申し訳ありませんが、ご教授のほどよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

自己解決いたしました。

  • mp3に変換する
  • publicフォルダ内に配置する
  • base64エンコードではなく、自身の公開用URLをmediaに設定する

上記方法で、ひとまずAudioCardを投稿することができるようになりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

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

  • Node.js

    2006questions

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

  • Facebook

    415questions

    Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

  • Azure

    230questions

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