HarmonyOS之AI能力·语音识别技术

  • 语音识别功能提供面向移动终端的语音识别能力。它基于华为智慧引擎(HUAWEI HiAI Engine)中的语音识别引擎,向开发者提供人工智能应用层 API。该技术可以将语音文件、实时语音数据流转换为汉字序列,准确率达到 90% 以上(本地识别 95%)。
  • 语音识别技术,也称为自动语音识别(Automatic Speech Recognition, ASR),可以基于机器识别和理解,将语音信号转变为文本或命令。
  • 语音识别支持的输入文件格式有 wav 或 pcm。
  • 语音识别目前只支持普通话识别。
    [En]

    speech recognition currently only supports Putonghua recognition.*

  • 语音识别输入时长不能超过 20s。
  • 语音识别采样要求:采样率 16000Hz,单声道。
  • 语音识别引擎的使用必须初始化和释放处理,且调用必须在 UI 的主线程中进行。
  • 多线程调用:HUAWEI HiAI Engine 不支持同一应用使用多线程调用同一接口,这样会使某一线程调用 release 方法后,卸载模型,导致正在运行的另一些线程出错。故多线程执行同一功能达不到并行的效果。但是引擎支持使用多线程调用不同接口,如开启两个线程同时使用文档矫正和 ASR 接口。

  • 支持语音输入法、语音搜索、实时字幕、游戏娱乐、社交聊天、人机交互(如驾驶模式)等有语音识别需求的第三方应用开发。

    [En]

    support the development of third-party applications with speech recognition requirements, such as voice input method, voice search, real-time subtitles, games and entertainment, social chat, human-computer interaction (such as driving mode) and other scenarios.*

  • 语音输入法:直接语音输入需要输入的文本。也就是说,当用户说话时,语音识别引擎返回识别的汉字序列,这使得输入更加方便,解放了双手。
    [En]

    speech input method: input the text that needs to be entered directly by voice. That is, when the user speaks, the speech recognition engine returns the recognized sequence of Chinese characters, which makes the input more convenient and liberates the hands.*

  • 语音搜索:搜索内容直接语音输入,可在客服系统中进行关键词搜索,同时转录成文本,搜索效率更高。
    [En]

    Voice search: search content is entered directly by voice, which can be used for keyword search in customer service system and transcribed into text at the same time, making the search more efficient.*

  • 实时字幕:将直播、视频、直播语音等音频转换成实时字幕,降低理解成本,提升用户体验。
    [En]

    Real-time subtitles: convert live streaming, video, live speech and other audio into real-time subtitles to reduce understanding costs and enhance user experience.*

  • 驾驶模式:在驾驶过程中,握住方向盘,不能分心操作手机选择音乐和打电话。使用语音识别,只要你对手机说一个命令,比如说一个/下一个来剪歌,或者在听音乐的时候调节音量,你就可以被手机识别并执行相应的操作。
    [En]

    driving mode: in the process of driving, holding the steering wheel, can not distract to operate the mobile phone to choose music and make calls. Using speech recognition, as long as you say a command to the phone, such as saying one / the next to cut the song or adjust the volume while listening to music, you can be recognized by the phone and perform the corresponding operation.*

接口功能接口原型接口描述实例化ASR客户端对象Optional createAsrClient(Context context)实例化一个ASR客户端对象,该对象用于调用ASR引擎能力初始化ASR服务void init(AsrIntent intent, AsrListener asrListener)初始化ASR服务。传入回调,用于等待ASR功能接口的调用过程和结果;以及传入初始化参数,初始化ASR引擎开始听取和识别语音void startListening(AsrIntent asrIntent)开始听取和识别语音。如果识别的是音频文件,则读取文件识别。

如果识别PCM语音数据流,则结合writePcm(byte[], int)来识别。在调用此方法前,需要先调用init(AsrIntent, AsrListener)来初始化ASR引擎服务停止识别语音void stopListening()调用此方法,已经获取到的语音会完成识别,未获取到的语音将不再识别。

一般来说,在默认场景下,不需要调用此方法来停止识别,因为语音识别会自动判断语音是否已完成,然后自动停止识别。但是,您也可以在某个时刻调用此方法来手动停止识别。

[En]

In general, in the default scenario, there is no need to call this method to stop recognition, because speech recognition will automatically determine whether the speech has been completed, and then automatically stop recognition. However, you can also call this method to stop recognition manually at some point.

调用此方法前,需要先调用init(AsrIntent, AsrListener)来初始化ASR引擎服务。写入PCM数据流,进行语音识别void writePcm(byte[] bytes, int length)调用此方法,写入PCM语音数据流,并对PCM进行语音识别。

调用此方法前,需要先调用init(AsrIntent, AsrListener)来初始化ASR引擎服务。

在调用startListening(AsrIntent)}之后,将获取的PCM数据通过此方法来下发给ASR引擎处理。

PCM数据流长度存在限制:PCM数据流大小不能超过800KB,另外PCM数据流对应的音频长度不能超过20s。length代表有效长度,当前只支持1280或者640字节取消语音识别void cancel()取消语音识别,已经获取到的语音也不再识别。调用此方法前,需要先调用init(AsrIntent, AsrListener)来初始化ASR引擎服务销毁ASR服务void destroy()取消所有ASR任务,销毁ASR引擎服务。调用此方法后,无法再使用ASR服务。如果需要重新使用ASR服务,需要重新调用createAsrClient(Context)来创建 AsrClient实例

  • AsrListener 接口说明:

包名类名接口原型功能描述ohos.ai.asrAsrListenervoid onInit(PacMap params)ASR引擎初始化结束后,ASR的服务端会调用此回调接口处理初始化结果数据void onBeginningOfSpeech()ASR引擎检测到用户开始说话时,ASR服务端调用此回调接口void onRmsChanged (float rms)ASR引擎检测到音频输入的语音能量变化时,ASR服务端调用此回调接口处理语音能量void onEndOfSpeech()ASR引擎检测到用户说话停止时,调用此回调接口void onIntermediateResults(PacMap intermediateResults)ASR引擎语音识别过程中,当部分识别结果可以获取到时,调用此回调处理中间过程的识别结果void onError(int error)ASR语音识别过程中出现错误时,调用此回调接口void onResults(PacMap results)ASR引擎完成语音识别,调用此回调返回和处理完整的识别结果void onBufferReceived(byte[] buffer)ASR引擎每次接收到新输入的音频流时,会调用此回调接口处理接收到的语音流数据void onEvent(int eventType, PacMap params)ASR引擎检测到某些事件时,调用此接口上报事件给调用者void onEnd()ASR引擎识别结束时,调用此回调接口。但如果识别音频过程中被AsrClient类中的stopListening()或者cancel()方法打断,则不会调用此回调接口void onAudioStart()在音频开始时,ASR引擎服务端调用此回调接口void onAudioEnd()在音频结束时,ASR引擎服务端调用此回调接口

  • AsrListener 中的 onResults(PacMap results) 方法返回结果,结果封装在 json 格式中,需要解析得到。结果说明:

返回结果结果类型结果说明{“result”:[{“confidence”:0,”ori_word”:”你 好 “,”pinyin”:”NI3 HAO3 “,”word”:”你好。”}]}Json识别结果{“confidence”:xxx}Double识别结果的置信度{ “word”:”xxx”}String识别结果的文本内容

  • 示例结果(Json):
    {
        "engine_type":"local_engine",
        "result":[{"confidence":0,"ori_word":"你 好 ","pinyin":"NI3 HAO3 ","word":"你好。"}],
        "result_type":"lvcsr",
        "scenario_type":5
    }
  • AsrError 说明:

常量名取值错误码含义SUCCESS0表示在某个接口被调用成功时,在回调中会返回这个结果码ERROR_AUDIO3表示接口调用时,发生因音频读取导致的错误时,在回调中会返回的结果码ERROR_SERVER4表示接口调用时,ASR引擎服务端发生错误时,在回调中会返回的结果码ERROR_CLIENT5表示接口调用时,调用ASR的客户端发生错误时,在回调中会返回的结果码ERROR_SPEECH_TIMEOUT6表示ASR接口调用时,在设定的时间内没有语音输入时,在回调中会返回的结果码ERROR_NO_MATCH7表示ASR接口调用时,发生ASR的识别结果不匹配定义的json格式时,在回调中会返回的结果码ERROR_RECOGNIZER_BUSY8表示ASR接口调用时,ASR引擎正忙时,在回调中会返回的结果码ERROR_INVALID_PARAMS10表示ASR接口调用时,发生参数输入错误时,在回调中会返回的结果码ERROR_UNKNOWN11表示ASR接口调用时,发生未知错误时,在回调中会返回的结果码ERROR_GET_MODEL_PATH13表示ASR接口调用时,ASR模型路径获取失败时,在回调中会返回的结果码ERROR_RESULT_UNSUPPORTED15表示ASR接口调用时,设备上当前版本的ASR引擎不支持正在被调用的接口时,在回调中会返回的结果码ERROR_MODEL_NOT_MATCH16表示ASR接口调用时,当前设备中预置的ASR引擎应用和ASR模型不匹配时,在回调中会返回的结果码ERROR_INIT_FAIL23表示ASR接口调用时,发生ASR引擎初始化失败的错误时,在回调中会返回的结果码ERROR_NO_ASR30表示当前设备上没有ASR引擎,不支持ASR能力的调用时,在回调中会返回的结果码

    // 提供ASR引擎执行时所需要传入的参数类
    import ohos.ai.asr.AsrIntent;
    // 错误码的定义类
    import ohos.ai.asr.util.AsrError;
    // 加载语音识别Listener
    import ohos.ai.asr.AsrListener;
    // 提供调用ASR引擎服务接口的类
    import ohos.ai.asr.AsrClient;
    // ASR回调结果中的关键字封装类
    import ohos.ai.asr.util.AsrResultKey;
  • 创建一个 AsrClient 对象:context 为应用上下文信息,应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:
    AsrClient asrClient = AsrClient.createAsrClient(context).orElse(null);
  • 设置引擎参数:如果希望识别文件,音频文件需满足约束与限制,并设置音频类型为”ASR_SRC_TYPE_FILE”;如果希望识别音频流,则设置音频类型为”ASR_SRC_TYPE_PCM”:
    AsrIntent initIntent = new AsrIntent();
    initIntent.setAudioSourceType(AsrIntent.AsrAudioSrcType.ASR_SRC_TYPE_PCM);
  • 初始化ASR服务:其中,mMyAsrListener 为实现了 AsrListener 接口的实例对象:
    asrClient.init(initIntent, mMyAsrListener);
  • 开始识别:用户无需设置参数即可使用默认参数:
    [En]

    start to identify: users can use default parameters without setting parameters:*

    AsrIntent asrIntent = new AsrIntent();    // 设置后置的端点检测(VAD)时间    asrIntent.setVadEndWaitMs(2000);    // 设置前置的端点检测(VAD)时间    asrIntent.setVadFrontWaitMs(4800);    // 设置语音识别的超时时间    asrIntent.setTimeoutThresholdMs(20000);    asrClient.startListening(asrIntent);    // buffer需要替换为真实的音频数据    byte[] buffer = new byte[]{0, 1, 0, 10, 1};    // 对于长度大于1280的音频,需要多次调用writePcm分段传输    asrClient.writePcm(buffer, 1280);
  • 需要注意的是,startListening 或 writePcm 方法建议放在 mMyAsrListener 中 onInit() 方法内调用,保证初始化引擎成功之后再调用识别接口。如果希望识别音频文件,则不需要调用 writePcm 接口:
    AsrIntent asrIntent = new AsrIntent();    // 将FilePath修改为正确的地址,且文件路径需要给com.huawei.hiai进程授予可访问权限。    asrIntent.setFilePath("FilePath");    asrClient.startListening(asrIntent);
  • 取消或停止识别:
    asrClient.stopListening(); // 停止识别    asrClient.cancel(); // 取消识别
  • 释放引擎:
    asrClient.destroy();

Original: https://blog.csdn.net/Forever_wj/article/details/118341210
Author: ╰つ栺尖篴夢ゞ
Title: HarmonyOS之AI能力·语音识别技术

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/512874/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球