#!/usr/bin/env python3 """ 使用真实的 MP3 文件测试 ASR """ import sys import os sys.path.append('.') import requests import base64 import logging # 设置日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def create_real_mp3(): """创建一个真实的 MP3 文件""" try: from pydub import AudioSegment from pydub.generators import Sine # 生成 3 秒的正弦波音频 duration_ms = 3000 frequency = 440 # A4 音符 # 生成音频 audio = Sine(frequency).to_audio_segment(duration=duration_ms) # 设置为 16kHz 单声道 audio = audio.set_frame_rate(16000).set_channels(1) # 导出为 MP3 mp3_file = "test_audio_real.mp3" audio.export(mp3_file, format="mp3", bitrate="64k") logger.info(f"创建真实 MP3 文件: {mp3_file}") return mp3_file except ImportError: logger.error("需要安装 pydub: pip install pydub") logger.info("使用备用方案:创建简单的 MP3 头") # 创建一个最小的 MP3 文件 # 这是一个有效的 MP3 文件头 mp3_data = bytearray([ 0xFF, 0xFB, 0x90, 0x00, # MP3 同步字和头信息 ]) # 添加一些音频数据 mp3_data.extend(b'\x00' * 1000) mp3_file = "test_audio_simple.mp3" with open(mp3_file, 'wb') as f: f.write(mp3_data) logger.info(f"创建简单 MP3 文件: {mp3_file}") return mp3_file def test_mp3_asr(): """测试 MP3 ASR""" # 创建 MP3 文件 mp3_file = create_real_mp3() try: # 读取 MP3 文件 with open(mp3_file, 'rb') as f: mp3_data = f.read() logger.info(f"MP3 文件大小: {len(mp3_data)} 字节") # 转换为 base64 mp3_base64 = base64.b64encode(mp3_data).decode('utf-8') logger.info(f"Base64 编码长度: {len(mp3_base64)}") # 准备请求数据 request_data = { 'audio_data': mp3_base64, 'format': 'mp3' } # 发送请求到后端 url = "http://192.168.1.141:30102/voice/call/asr" headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer test_token' } logger.info(f"发送 ASR 请求到: {url}") response = requests.post(url, json=request_data, headers=headers, timeout=60) logger.info(f"响应状态码: {response.status_code}") logger.info(f"响应内容: {response.text}") if response.status_code == 200: result = response.json() logger.info(f"✅ ASR 请求成功") logger.info(f"识别结果: {result}") if 'data' in result and 'text' in result['data']: text = result['data']['text'] logger.info(f"🎯 识别文本: {text}") # 检查结果 if "未识别到语音内容" in text or "音频中未检测到有效语音" in text: logger.info("✅ MP3 格式正确,但没有检测到语音(这是预期的,因为是纯音调)") return True elif "音频格式解码失败" in text or "DECODE_ERROR" in text: logger.error("❌ MP3 格式有问题") return False else: logger.info("✅ ASR 处理成功") return True else: logger.warning("响应格式不符合预期") return False else: logger.error(f"❌ ASR 请求失败: {response.status_code}") return False except Exception as e: logger.error(f"❌ 测试失败: {e}") import traceback logger.error(f"错误堆栈: {traceback.format_exc()}") return False finally: # 清理文件 try: if os.path.exists(mp3_file): os.remove(mp3_file) except: pass if __name__ == "__main__": logger.info("开始测试真实 MP3 ASR...") success = test_mp3_asr() if success: logger.info("🎉 MP3 ASR 测试成功!") else: logger.error("💥 MP3 ASR 测试失败") sys.exit(1)