簡體   English   中英

在javascript中通過麥克風發送聲音

[英]Send sound through microphone in javascript

我正在使用 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 中的答案:用於測試目的的假麥克風輸入沒有回答這個問題,我已經讀過那個了。

編輯2:

有一些事情需要考慮:

1)我正在尋找的解決方案可以包括使用另一種語言或工具。

2)我不能使用硬件來模擬麥克風輸入(例如:通過揚聲器輸出聲音以便麥克風可以拾取)

我認為您不需要使用JavascriptExecutor。

有一個解決您的問題的方法。

解:

請改用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(); 

        } 
    } 

第三步:

要啟用麥克風訪問,請使用以下參數:

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

上面的代碼將為您播放聲音,並且您的聊天聽眾可以收聽播放的音頻。

我對用 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 中返回承諾。 我沒有在此處添加解決方法以保持代碼盡可能簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM