【问题标题】:Send sound through microphone in javascript在 javascript 中通过麦克风发送声音
【发布时间】:2020-01-05 01:30:12
【问题描述】:

我正在使用 Selenium 在具有音频聊天的网络上模拟用户。我需要模拟用户通过麦克风讲话。

我只收到了关于在 javascript 中收听麦克风的问题,但没有关于使用 javascript 通过麦克风发送声音的问题。

我目前的尝试是这样的:

首先我检查 AudioContext 是否可用

private boolean isAudioContextSupported() {
  JavascriptExecutor js = (JavascriptExecutor) getDriver();
  Object response = js.executeAsyncScript(
  "var callback = arguments[arguments.length - 1];" +
  "var context;" + 
  "try {" + 
  "  window.AudioContext = window.AudioContext||window.webkitAudioContext;" + 
  "  context = new AudioContext();" +
  "  callback('');" +
  "}" + 
  "catch(e) {" + 
  "  callback('Web Audio API is not supported in this browser');" + 
  "}");
  String responseAsString = response == null?"":(String)response;
  return responseAsString.isEmpty();
}

其次,我尝试这样做以从 url 获取音频

JavascriptExecutor js = (JavascriptExecutor) getDriver();
Object response = js.executeAsyncScript(
  "var callback = arguments[arguments.length - 1];" +
  "window.AudioContext = window.AudioContext || window.webkitAudioContext;" + 
  "var context = new AudioContext();" +
  "var url = '<ogg file url>';" +
  "var request = new XMLHttpRequest();" +
  "request.open('GET', url, true);" + 
  "request.responseType = 'arraybuffer';" +
  "request.onload = function() {" + 
  "  context.decodeAudioData(request.response, function(buffer) {" + 
  "  <send the buffer data through the microphone>" +
  "}, callback(request.statusText));" + 
  "};" + 
  "request.send();" +
  "callback('OK');"
);

我缺少的部分是如何通过麦克风发送缓冲区数据(从 ogg 文件中获取)。

编辑:

Chrome: fake microphone input for test purpose 中的答案没有回答这个问题,我已经看过了。

编辑 2:

有几点需要考虑:

1) 我正在寻找的解决方案可能包括使用其他语言或工具。

2) 我无法使用硬件来模拟麦克风输入(例如:通过扬声器输出声音以便麦克风可以拾取)

【问题讨论】:

  • 所提供的链接没有回答问题,它只是显示--use-fake-device-for-media-stream 选项,而实际上没有提供发送声音的方法。该答案中的链接是使用java通过麦克风发送声音的代码。
  • Java标签无效,如果读取代码,主要问题在javascript中,java代码只是一个包装器。

标签: javascript selenium webrtc web-audio-api


【解决方案1】:

我认为你不需要使用 JavascriptExecutor。

有一个 hack 可以解决您的问题。

解决方案:

改用java。

第 1 步:

执行聊天语音监听器。

第 2 步:

现在以编程方式播放随机语音。

使用:import javazoom.jl.player.Player;

public void playAudio(String audioPath)  { 

        try {
            FileInputStream fileInputStream = new FileInputStream(audioPath);
            Player player = new Player((fileInputStream));
            player.play();
            System.out.println("Song is playing");
        }catch (Exception ex)  { 
            System.out.println("Error with playing sound."); 
            ex.printStackTrace(); 

        } 
    } 

第 3 步:

要启用麦克风访问,请使用以下参数:

options.addArguments("use-fake-ui-for-media-stream"); 

以上代码将为您播放声音,您的聊天听众可以收听播放的音频。

【讨论】:

  • 我会试试这个,然后再告诉你它是否有效。非常感谢
  • 嗨,我缺少关于第一步的信息,聊天监听器是什么?
  • 您说[我正在使用 Selenium 模拟具有音频聊天的网络上的用户。] 有一些按钮或实用程序可以触发音频聊天。点击按钮后,它会自动触发您的笔记本电脑/设备语音系统监听器。
  • 好的,我了解音频聊天部分。但是我没有得到一些东西,Player 对象与麦克风有什么关系?这段代码不会只是通过计算机的扬声器输出音频吗?
  • 是的,它会通过扬声器播放音频,正如我已经告诉过你的那样,它只是一个 hack。
【解决方案2】:

我不太了解使用 Java 运行 Selenium。但看起来您可以在运行测试之前执行任意 JavaScript 代码。我猜你的代码在某些时候确实会调用getUserMedia() 来获取麦克风输入。因此,如果您只是将该函数替换为返回音频文件的MediaStream 的函数,它可能会起作用。

navigator.mediaDevices.getUserMedia = () => {
    const audioContext = new AudioContext();

    return fetch('/your/audio/file.ogg')
        .then((response) => response.arrayBuffer())
        .then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer))
        .then((audioBuffer) => {
            const audioBufferSourceNode = audioContext.createBufferSource();
            const mediaStreamAudioDestinationNode = audioContext.createMediaStreamDestination();

            audioBufferSourceNode.buffer = audioBuffer;
            // Maybe it makes sense to loop the buffer.
            audioBufferSourceNode.loop = true;

            audioBufferSourceNode.start();

            audioBufferSourceNode.connect(mediaStreamAudioDestinationNode);

            return mediaStreamAudioDestinationNode.stream;
        });
};

也许您还必须禁用自动播放策略才能使其正常工作。

不幸的是,Safari 的代码需要稍微复杂一些,因为decodeAudioData() 不会在 Safari 中返回承诺。我没有在此处添加解决方法以使代码尽可能简单。

【讨论】:

  • 我会尽快尝试。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多