144 lines
4.4 KiB
Python
144 lines
4.4 KiB
Python
|
|
#!/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)
|