我正在try 将谷歌文本转语音API SynthesizeSpeech.audio_content的结果传递到前端语音echo框架(golang).

resp, err := client.SynthesizeSpeech(c.ctx, &req)
if err != nil {
    return nil, err
}
c.Blob(http.StatusOK, "audio/mp3", resp.AudioContent)

音频本身正常生成(我try 将其保存为服务器上的mp3并收听).但当我试图以这种方式获取客户端的数据时:

var options = {
  url: "/tts",
  method: "POST",
  contentType: 'application/json',
  responseType: 'audio/mp3',
  data: JSON.stringify(data),
 
  success: function (response) {
     console.log(response.length)
    
     var blob = new Blob([response], { type: 'audio/mp3' });
     console.log(blob.size)
     var blobUrl = URL.createObjectURL(blob);
     var audio = new Audio(blobUrl);

     audio.addEventListener('loadeddata', function() {
        
        audio.play();
     });

     audio.addEventListener('error', function(event) {
        console.error('Audio error:', event.target.error.message);
     });

     audio.load(); 
                          
  },
  error: function (xhr, status, error) {
    console.log(status, error)
    
  }
 }

 $.ajax(options);

我收到一个错误:prime.js:221音频错误:DEMUXER_WRIGHT_COULD_NOT_OPEN:FFmpegDemuxer:打开上下文失败

同样奇怪的是,在服务器端,发送前字节数组的大小例如为5664,但当我测量responding. long的大小时,除了blo.size是10591之外,我看到5375.

我还查看了Wireshark中的分析,并注意到客户的react 相当好.这是:

enter image description here

即使在浏览器达到5664之前,我们如何才能在wireshark级别上看到收到的数据的大小.

在浏览器调试器中,我看到以下数据:

enter image description here

数组似乎被浏览器损坏或修改了.你们觉得呢?

推荐答案

使用AJax将音频数据从Golang的Echo服务器传输到前端时遇到的问题似乎与浏览器解释数据的方式有关.您可能会考虑一些潜在问题和解决方案.

问题1:数据解释和转换 当您从服务器发送二进制数据(例如音频)时,服务器和客户端必须正确处理该数据,以确保数据不会被损坏或更改.

服务器端(Golang中的Echo):确保发送的数据格式正确,并且头设置正确.看起来您正在使用c.Blob(http.StatusOK,"audio/mp3",resp.AudioContent)正确地完成这部分.

客户端(JavaScript):数据需要被视为二进制.问题可能是jQuery(或浏览器)在解释AJAX响应时默认没有正确处理二进制数据.

解决方案:使用MLhttpsify处理二进制数据 与使用jQuery来处理二进制响应,不如使用原生的MQhttpResource更可靠,它可以对响应的处理方式提供更多控制,特别是对于二进制数据.以下是你可以做到的:

   var xhr = new XMLHttpRequest();

    xhr.open('POST', '/tts', true);
  
   xhr.responseType = 'blob'; // Important: Treat the response as a blob

    xhr.onload = function() {
   if (this.status === 200) {
   var blob = new Blob([this.response], { type: 'audio/mp3' });
   var blobUrl = URL.createObjectURL(blob);
   var audio = new Audio(blobUrl);
   audio.play();

   audio.addEventListener('error', function(event) {
    console.error('Audio error:', event.target.error.message);
       });
      }
     };

       xhr.onerror = function() {
       console.error('Request failed');
        };

        xhr.setRequestHeader('Content-Type', 'application/json');
        xhr.send(JSON.stringify(data));

额外判断 内容类型:确保客户端请求上的内容类型设置正确.如果您发送的是SON数据,则它应该是"app/json",但请确保您发送的内容与服务器端的预期相匹配.

错误处理:audio元素中的错误事件处理是一个很好的实践.这可以帮助诊断浏览器是否发现blob以某种方式不可接受.

控制台日志(log)记录:使用console.log(blo.size)来访问很好.您还可以直接在xhr. onstart函数中记录This. respect,以查看响应是否符合您的期望,然后再将其转换为blob.

通过切换到MLhttpResource并显式地将responseType设置为"blob",您可以避免jQuery处理二进制数据的潜在问题,这些问题可能会导致您所观察到的转换或损坏.

Javascript相关问答推荐

如何使用React渲染器放置根dis?

创建1:1比例元素,以另一个元素为中心

主要内部的ExtJS多个子应用程序

JS、C++和C#给出不同的Base 64 Guid编码结果

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

如何使覆盖div与可水平滚动的父div相关?

自定义高图中的x轴标签序列

我们如何从一个行动中分派行动

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

引用在HTMLAttributes<;HTMLDivElement>;中不可用

扩展类型的联合被解析为基类型

覆盖加载器页面避免对页面上的元素进行操作

按什么顺序接收`storage`事件?

JavaScript将字符串数字转换为整数

是否设置以JavaScript为背景的画布元素?

有没有办法在R中创建一张具有多个色标的热图?

Chrome上的印度时区名S有问题吗?

我们是否可以在reactjs中创建多个同名的路由

更改管线时不渲染组件的react

如何阻止外部脚本进入顶层导航