当前位置: 首页 > article >正文

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接口

@app.route('/sound', methods=['POST'])
def sound():
    file = request.files['file']
    # ... 处理文件
    return "SUCCESS"


http://www.kler.cn/a/511953.html

相关文章:

  • FPGA 21 ,深入理解 Verilog 中的基数,以及二进制数与十进制数之间的关系( Verilog中的基数 )
  • imbinarize函数用法详解与示例
  • 利用Ai,帮我完善了UsbCamera App的几个界面和设置功能
  • 三电平空间矢量详解
  • Redisson发布订阅学习
  • Docker部署Redis
  • UG NX二次开发(C#)-创建三维直线段并倒圆
  • 研1如何准备才能找到大厂实习?
  • Sudo命令的配置及使用
  • 【前端】CSS学习笔记(1)
  • Unity自学之旅01
  • JupyterLab 安装以及部分相关配置
  • WSL 2 自动更新 虚拟 IP 到 window hosts
  • 说说HashMap 的位操作以及HashSet的contains方法复杂度是多少?
  • std::forward实现原理与应用场景
  • Linux之socket编程(上)
  • Excel 技巧14 - 如何批量删除表格中的空行(★)
  • 工业现场数据实时采集:解锁工业智能化转型的关键
  • 深入理解Linux系统内存中文件结构以及缓冲区,模拟实现c语言库文件接口
  • 《重生到现代之从零开始的C++生活》—— 类和对象2
  • 【STM32-学习笔记-14-】FLASH闪存
  • 开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)
  • 力扣203题—— 移除链表元素
  • ovs实现lb负载均衡
  • 外部flash烧写算法学习笔记(一)
  • Linux:EXT2文件系统