LLM(3) : 浏览器录制16K的音频并上传到后端

可被阿里云[qwen-audio-asr]大模型识别

HTML

复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>录音并上传</title>
	</head>
	<body>

		<button id="recordButton">开始/停止录音</button>
		<audio id="audioPlayback" controls style="display:none;"></audio>

		<script>
			let mediaRecorder;
			let audioChunks = [];
			let recording = false;

			document.getElementById('recordButton').addEventListener('click', () => {
				if (recording) {
					// 停止录音
					stopRecording();
				} else {
					// 开始录音
					startRecording();
				}
			});

			async function startRecording() {
				try {
					const stream = await navigator.mediaDevices.getUserMedia({
						audio: true
					});

					// 创建 MediaRecorder 实例,但不连接到任何音频输出
					mediaRecorder = new MediaRecorder(stream, {
						mimeType: 'audio/webm; codecs=opus'
					});

					mediaRecorder.ondataavailable = event => {
						audioChunks.push(event.data);
					};

					mediaRecorder.onstop = async () => {
						const audioBlob = new Blob(audioChunks, {
							type: 'audio/webm; codecs=opus'
						});
						const audioUrl = URL.createObjectURL(audioBlob);
						const audio = document.getElementById('audioPlayback');
						audio.src = audioUrl;
						audio.style.display = 'block';

						// 自动上传录音文件到后端接口
						await uploadAudioFile(audioBlob);

						// 清空 audioChunks 以便下次录音
						audioChunks = [];
					};

					mediaRecorder.start();
					recording = true;
					document.getElementById('recordButton').textContent = '停止录音';
				} catch (err) {
					console.error('Error accessing media devices.', err);
				}
			}

			function stopRecording() {
				if (mediaRecorder && mediaRecorder.state !== 'inactive') {
					mediaRecorder.stop();
					mediaRecorder.stream.getTracks().forEach(track => track.stop()); // 停止媒体流轨道
				}
				recording = false;
				document.getElementById('recordButton').textContent = '开始录音';
			}

			async function uploadAudioFile(blob) {
				const formData = new FormData();
				formData.append('file', blob, 'recording.webm');

				try {
					const response = await fetch('http://127.0.0.1:30025/sound', {
						method: 'POST',
						body: formData,
					});

					if (!response.ok) {
						throw new Error(`HTTP error! status: ${response.status}`);
					}

					const result = await response.json();
					console.log('Server response:', result);
				} catch (error) {
					console.error('There was a problem with the fetch operation:', error);
				}
			}
		</script>

	</body>
</html>

python接口

python 复制代码
@app.route('/sound', methods=['POST'])
def sound():
    file = request.files['file']
    # ... 处理文件
    return "SUCCESS"
相关推荐
EasyDSS12 小时前
从“听见”到“理解”:EasyDSS视频会议系统智能字幕、语音转写技术的深度剖析
音视频·语音识别·语音转写·ai摘要·点播技术·流媒体直播·智能字幕
Rabbit_QL16 小时前
【音频处理】从 AirPods 主动降噪到音频 Source Separation:同一个问题的两种工程解法
前端·人工智能·音视频
EasyGBS17 小时前
国标GB28181视频平台EasyGBS视频质量诊断插件(EasyVQD)详解
音视频·花屏·视频质量诊断·画面冻结·画面抖动·偏色检测·噪声检测
AI-小柒18 小时前
Seedance 2.0(即梦 2.0)深度解析:AI 视频进入「导演级」可控时代
大数据·人工智能·网络协议·tcp/ip·http·音视频
YYDataV数据可视化18 小时前
【P2P音视频通信系统】之TURN 服务详解
音视频·webrtc·实时音视频·ai编程
xhyu6119 小时前
【学习笔记】推荐系统 (5.排序:多目标模型、MMoE、融合预估分数、视频播放建模)
笔记·学习·音视频
灿宝宝lo19 小时前
阿里云OSS视频自动转码的配置详细步骤
阿里云·云计算·音视频
音视频牛哥20 小时前
Android终端如何用SmartGBD快速接入GB28181:把“非国标设备”变成“国标前端”
音视频·android gb28181·gb28181安卓端·smartgbd·gb28181对接·安卓对接gb28181·安卓gb28181记录仪
YYDataV数据可视化20 小时前
【P2P音视频通信系统】信令服务器之TCP与QUIC选型对比
服务器·音视频·p2p
TSINGSEE20 小时前
EasyGBS视频质量诊断:告别人工盯屏,AI智能巡检如何“主动”发现11种画质异常?
人工智能·音视频·实时音视频·视频质量诊断·画面冻结·画面抖动·偏色检测