智能座舱HMI语音自动化测试技术和实现

一  语音测试概述:

随着人工智能和物联网技术的迅猛发展,智能座舱已经成为现代汽车中的重要组成部分。语音交互作为智能座舱的核心功能之一,正日益受到用户和汽车制造商的关注。

车载语音交互具备的独特优势:降低驾驶者对车内设备的操作依赖、增加驾驶安全系数,完善车载语音的用户体验,保证语音的准确,稳定性,是当前智能座舱系统成功的关键。

语音交互是智能汽车的重要入口,其功能覆盖车载导航、蓝牙电话、FM、空调、车控、影音等部分。

二  语音交互主要测试场景:

呼叫功能
测试座舱语音助手的呼叫功能,包括识别用户的语音指令并正确拨打电话。

唤醒/误唤醒功能测试
通过唤醒指令唤醒测试,量化唤醒的成功率、唤醒时间以及误唤醒的情况。

导航功能
测试语音导航功能,验证座舱语音助手能否准确理解并执行用户的导航指令。

多媒体控制
测试座舱语音助手在控制音乐、收听广播、调节音量等方面的表现。

多音区交互
不同座位的乘客都可以和车机系统进行语音交互,在交互过程中乘客之间互不干扰,同时系统还能准确定位当前说话人的位置信息。

车辆控制
测试语音交互是否能够准确执行开关车门、调整空调温度等操作。

个性化设置
测试座舱语音助手是否能够识别和适应不同用户的语音指令和偏好设置。

噪音环境测试
模拟在噪音环境场景中,如早高峰市区、高速路等语音交互各功能的表现情况。

方言/口音
测试不同地区的方言或者口音在语音交互过程的车机的表现。

三实现方案:

语音交互设备主要实现语音合成、语音识别、语音唤醒、文字转语音功能测试、交互控制以及频率、响应时间、识别率等性能测试。视觉识别设备用于判断语音指令下发后,被测设备UI界面的变化是否与指令一致,比如播放音乐、视频,语音唤醒等等。同样,总线设备也是用于判断语音指令下发后,被测设备收到车机信号后的反馈动作是否与指令一致,比如关车窗、打开车灯等等,从多维度判断执行结果。

    

         由于硬件方面缺失,我们采用极简的方案来做的。

          将用例中的文字转换为语音并保存为文件,我们采用的edge_tts,是一个基于微软 Edge 浏览器语音合成技术的 Python 库,可以免费生成高质量的语音输出。

先把对应的

        async def generate_audio_async() -> None:
            """异步生成语音"""
            communicate = edge_tts.Communicate(text, 'zh-CN-XiaoyiNeural', rate=rate)
            await communicate.save("E:/media/case1.mp3")

        # 异步执行生成音频
        asyncio.run(generate_audio_async())

应该使用人工嘴播放,我们简单的使用蓝牙音箱来播放

由于我们的验证采用语音的日志打印来判断(严格应该使用ASR,和摄像头监控是否执行响应的动作)

然后使用Pydub 播放音乐

def play_audio(file_path):
    audio = AudioSegment.from_file(file_path)
    play(audio)

# 使用示例
play_audio("music.mp3")

使用日志筛选对应的关键字,来判断语音测试执行是否成功

    def capture_voice_log(self):
        """
        抓取日志中语音助手的回复语
        :return:
        """
        adb_process = subprocess.Popen(
            "adb shell".split(),
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,  # 使用 text 代替 universal_newlines,Python 3.7+ 推荐使用
            encoding='utf-8'
            # bufsize=1 # 设置缓冲区大小
        )

        # 抓日志
        adb_process.stdin.write('logcat -d |grep startSpeak\n')#关键字
        adb_process.stdin.flush()
        last_reply = None
        output, _ = adb_process.communicate()
        # 分析日志,并获取其最后一次回复语
        for line in output.splitlines():
            reply = self.match_reply_by_find(line)
            if reply:
                last_reply = reply  # 更新最后一条回复

        adb_process.stdin.close()
        adb_process.stdout.close()
        adb_process.stderr.close()
        return last_reply

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fish_study_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值