EGO-LOG

40代2児の父。主にプログラム学習と開発、仮想通貨、メタバース、たまに関係ないことを綴る。

Laravel投稿サイト構築.91 -音声キャスト機能実装 1.録音機能確認-

今回から音声による読みあげ機能(キャストと呼ぶ)を実装していく。

 

仕様はこんな感じ。

  • テーマのタイトル、テーマの内容、返信の内容について音声を読み上げる。
  • 投稿した本人はキャストできない。
  • 複数のユーザがキャスト投稿できる(いずれ承認制にする予定)。

 

bladeファイルの修正

-----

//録音ボタン

    <form action="{{route('thread.store')}}" method="POST">
        @csrf
        <div class="d-flex align-items-left">
          <div id="rec_thread_title{{$thread->thread_id}}">
            <button type="button" v-if="status=='ready'" @click="startRecording{{$thread->thread_id}}">録音を開始する</button>
            <button  type="button" v-if="status=='recording'" @click="stopRecording{{$thread->thread_id}}">録音を終了する</button>
      </div>
          <div class="align-items-right my-3">
            <input class="btn-post mb-2 px-2 py-1 lh-1 rounded text-dark font-bold link-hover cursor-pointer fs-6" type="submit" value="アップロード">
            <button type="button" class="mb-2 ms-3 px-2 py-1 lh-1 rounded text-dark font-bold link-hover cursor-pointer fs-6" data-bs-dismiss="modal">閉じる</button>
          </div>
        </div>
    </form>
</div>

-----

Vueにて録音機能を実装

-----

<script>
  new Vue({
      el: '#rec_thread_title{{$thread->thread_id}}',
      data: {
          // 1.変数を宣言する部分
          status: 'init',     // 状況
          recorder: null,     // 音声にアクセスする "MediaRecorder" のインスタンス
          audioData: ,      // 入力された音声データ
          audioExtension: ''  // 音声ファイルの拡張子
      },
      methods: {
          startRecording{{$thread->thread_id}}() {
              this.status = 'recording';
              this.audioData = ;
              this.recorder.start();
          },
          stopRecording{{$thread->thread_id}}() {
              this.recorder.stop();
              this.status = 'ready';
          },
          getExtension(audioType) {
              let extension = 'wav';
              const matches = audioType.match(/audio\/([^;]+)/);

              if(matches) {
                  extension = matches[1];
              }
              return '.'+ extension;
          }
      },
      mounted() {
          navigator.mediaDevices.getUserMedia({ audio: true })
              .then(stream => {
                  this.recorder = new MediaRecorder(stream);
                  this.recorder.addEventListener('dataavailable', e => {
                      this.audioData.push(e.data);
                      this.audioExtension = this.getExtension(e.data.type);
                  });
                  this.recorder.addEventListener('stop', () => {
                      const audioBlob = new Blob(this.audioData);
                      const url = URL.createObjectURL(audioBlob);
                      let a = document.createElement('a');
                      a.href = url;
                      a.download = Math.floor(Date.now() / 1000) + this.audioExtension;
                      document.body.appendChild(a);
                      a.click();
                  });
                  this.status = 'ready';
              });
      }
  });
</script>

 

まずは録音ができることを確認。

 

 

現状は録音終了したらダウンロードボタンが表示される。

次回は録音内容をテーブルに保存する。

 

続く