You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备同时使用Web Speech API与navigator.mediaDevices兼容问题求助

Android端Web Speech API与MediaRecorder兼容性冲突问题

我需要在Android设备上实现以下功能:用户按住按钮时,同时通过Web Speech API将语音转写为文本,并使用navigator.mediaDevices录制语音。该功能在Windows系统上运行正常,但在Android设备中,Web Speech API与MediaRecorder存在兼容性问题。

问题表现

添加以下代码行后,语音识别功能直接失效:

rec = new MediaRecorder(stream); // 添加此行后语音识别功能损坏

提供的代码保留了这一行,用于复现Android设备上的异常情况。注意:请务必在Android设备上测试,代码并非为桌面端设计。

演示代码

HTML

<button id="start-recognition">按住说话(Android设备上测试并查看控制台)</button>

CSS

#start-recognition {
    width: 50%;
    height: 100px;
}

JavaScript

let audioChunks = [];
let rec;

let stopRecognize;

if(navigator.mediaDevices) {
        navigator.mediaDevices.getUserMedia({ audio: true })
        .then(stream => {
            console.log('OK')
            rec = new MediaRecorder(stream); // 添加此行后语音识别功能损坏
            // rec.ondataavailable = e => {
            //     audioChunks.push(e.data);
            //     if(rec.state == "inactive") {
            //         blob = new Blob(audioChunks, { type:'audio/x-mpeg-3' });
            //         recordedAudio.src = URL.createObjectURL(blob);
            //     }
            // }
        }).catch(err => {
            switch(err.name) {
                case 'NotAllowedError':
                    console.log('用户拒绝了录音权限!');
                  
                break; 
                default:
                    console.log('未连接麦克风:' + err.name);
          
                break;
            }
        });
    }

const isMobile = true;

async function Recognize() {
  console.log('Recognize')
    let recognitionAllowed = true;
    stopRecognize = function() {
        if(recognitionAllowed) {
            recognition.stop();
            recognitionAllowed = false; 
        }
    }

    var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
    var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList;
    var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent;
    var recognition = new SpeechRecognition();
    var speechRecognitionList = new SpeechGrammarList();
    recognition.grammars = speechRecognitionList;
    recognition.lang = 'en-GB';
    recognition.continuous = !isMobile;
    recognition.interimResults = true;
    recognition.maxAlternatives = 1;
    recognition.start();

    recognition.onresult = function(event) {
        window.interim_transcript = '';
        window.speechResult = '';
        for(var i = event.resultIndex; i < event.results.length; ++i) {
            if(event.results[i].isFinal) {
                speechResult += event.results[i][0].transcript;
                console.log(speechResult)
            } else {
                interim_transcript += event.results[i][0].transcript;
                console.log(interim_transcript)
            }
        }
    }

    recognition.onerror = function(event) {
        restartRecognition();
        console.log('识别错误:' + event.error);
    }

    recognition.onend = async function(event) { 
        restartRecognition();
    }

    function restartRecognition() {
        try { if(recognitionAllowed) recognition.start(); } catch(err) {}
    }

} 

const startRecognition = document.getElementById('start-recognition');
startRecognition.addEventListener('mousedown', handleRecognitionStart);
startRecognition.addEventListener('mouseup', handleRecognitionEnd);
startRecognition.addEventListener('touchstart', handleRecognitionStart);
startRecognition.addEventListener('touchend', handleRecognitionEnd);

function handleRecognitionStart(e) {
  console.log('handleRecognitionStart')
    const event = e.type;
    if(isTouchDevice && event == 'touchstart') {
        recognitionStart();
    } else if(!isTouchDevice && event == 'mousedown') {
        recognitionStart();
    }
}
const isTouchDevice = true;

function handleRecognitionEnd(e) {
    const event = e.type;
    if(isTouchDevice && event == 'touchend') {
        recognitionEnd();
    } else if(!isTouchDevice && event == 'mouseup') {
        recognitionEnd();
    }
}

function recognitionEnd() {
    resetRecognition();
}

function recognitionStart() {
  console.log('recognitionStart')
    Recognize();
    audioChunks = []; 
    // if(rec.state !== 'recording') rec.start();
}

function resetRecognition() {
  console.log('reset')
    if(typeof stopRecognize == "function") stopRecognize();
    // if(rec.state !== 'inactive') rec.stop();
}

内容的提问来源于stack exchange,提问作者Sara Ree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:45:32