• 【专用名词的离线语音识别在2024年底的解决方法调查-会议签到的补充】


    概要

    提示:这里可以添加技术概要
    这里只实现一个方面,每个android会议设备都可通过语音发送参会者姓名,自动转换成文字添加到人员名单.
    语音采集和发送,是通路.
    识别是核心.目前的模型和模块都是针对通用语言的,在这里不合适,我只要适合的名字,并且容易添加新的名字.
    最后能接受自主调节.
    听得懂指令. 看似需要AI支持了,难搞.

    解决问题的过程

    不行的一些参考

    . https://alphacephei.com/vosk/lm
    这是vosk的调整,明显还不支持中文

    https://github.com/Uberi/speech_recognition/blob/master/reference/pocketsphinx.rst#installing-other-languages
    这是pocketsphinx在speechrecognition中的表示,看似可以调整,但是难度有点太大了.
    如同vosp中说的端到端,复杂程度大,但是通用性好.可是我只想加个词典,居然这么难的吗.

    可以的一个package

    `提示: pocketsphinx 5.0.3
    这里 pypy:https://pypi.org/project/SpeechRecognition/
    原理就用里面的离线库 spinx
    准备中文库
    这里的中文库从:
    https://jaist.dl.sourceforge.net/project/cmusphinx/Acoustic%20and%20Language%20Models/Mandarin/cmusphinx-zh-cn-5.2.tar.gz?viasf=1
    来源
    https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Mandarin/

    它可以搭配 /SpeechRecognition/ 中的sphinx使用,然而 pocketsphinx却不行.

    然后借鉴这里https://blog.csdn.net/Zbreakzhong/article/details/109127837
    对中文单词进行编码

    将cmusphinx-zh-cn-5.2.tar.解压后放入
    ,\Lib\site-packages\speech_recognition\pocketsphinx-data\zh-CN
    仿照 en-US,为个别文件和文件夹命名.
    然后就可以更改根目录下dic文件
    演示

    段*栓 d uan4 h ong2 sh uan1
    石*阳 sh ix2 x iang4  ii ang2
    张*嘉 zh ang1 s ai4 j ia1
    

    准备好后

     import speech_recognition as sr
    
    # 创建Recognizer对象
    r = sr.Recognizer()
    
    # 从音频文件中识别语音
    def recognize_speech_from_file(file_path):
        with sr.AudioFile(file_path) as source:
            audio = r.record(source)  # 读取音频文件
            try:
                text = r.recognize_sphinx(audio, language='zh-CN')  # 使用Google语音识别引擎识别语音
                return text
            except sr.UnknownValueError:
                print("无法识别音频")
            except sr.RequestError as e:
                print("无法连接到Google语音识别服务:{0}".format(e))
    
    # 从麦克风实时录制并识别语音
    def recognize_speech_from_microphone():
        with sr.Microphone() as source:
            print("请开始说话...")
            audio = r.listen(source)  # 实时录制音频
            try:
                text = r.recognize_sphinx(audio, language='zh-CN')  # 使用Google语音识别引擎识别语音
                return text
            except sr.UnknownValueError:
                print("无法识别音频")
            except sr.RequestError as e:
                print("无法连接到Google语音识别服务:{0}".format(e))
    
    # 调用函数进行语音识别
    file_text = recognize_speech_from_file('audio.wav')
    print("音频文件识别结果:", file_text)
    
    mic_text = recognize_speech_from_microphone()
    print("麦克风实时识别结果:", mic_text)
    

    自定义词语的拼音转换

    使用pypinyin,由于一开始想,也许可以听得懂拼音.只是字错.所以想用听来的字,转成拼音, 比对字典文字的拼音. 写了一上午后发现,拼音是听不懂的. 错误率的一半以上…但是这部分代码,可以借给生成 spinx的单词注音用.
    目前来看 y, ii, w,uu, shi 是shix,需要一些这样的调节,其他都是一样的.另外取消了多音字的处理.

    from pypinyin import pinyin, lazy_pinyin, Style
    def name2py(name,duoyin=True):
       return  pinyin(name, heteronym=duoyin,style=Style.TONE3)
    #names内容一行一个人名,转换成, dic的注音版
    def getnames():
    with open("names.txt", 'r',encoding ='utf-8') as nf:
        lines=[ln.strip() for ln in nf.readlines()]
      return lines
    pinyin('中乐', heteronym=True,style=Style.TONE3)    
    
    
    
    nms=getnames()
    pys=list(map(name2py,nms))
     
    #test=[['gao1', 'gao4'], ['lei2', 'lei4']]
    #tar=[['gao1'],['lei2']]
    #r=find1py(tar,test) 
    def find1py(onepy,oneitem):
        
        if len(onepy)!=len(oneitem):
            return False
            
        for (i,j) in zip(onepy,oneitem):
            if i[0][-1].isdigit():
                i=i[0][:-1]
            print(j)
            print("i in "+i)
    
            if ','.join(j).find(i)==-1:
              return False
        return True         
            
    def godo(name,pys=pys,nms=nms):
        target = name2py(name,duoyin=False)
        for i,item in  enumerate(pys):
            print(item)
            if  find1py(target,item):
               return nms[i]
        return None
    def writedic():
       with open('zh.dic.txt','w') as wf:
          for i in nms[:30]:
             final=pinyin(i, heteronym=False,style=Style.INITIALS)
             rt=name2py(i,False)
             toget=i+" "
             
             for init ,r in zip(final,rt):
                 r=r[0].replace("zhi","zhix").replace("chi","chix").replace("shi","shix")
                 
                 r= r.replace(init[0],'')
                 r=r.replace('w','uu ').replace('y','ii ')
                 
                 toget+=fr"{init[0]} {r} "
             print (toget[:-1])
              
    
    #r=godo("含风",pys,nms)
     
    writedic() 
        
     
    
    
    

    遗留的问题

    忙音和部分语音会出现串位不知道为啥,有时候说一个人会出来两个
    还有就是网络接口的调节, 接受语音提供反馈,vosp自身有这个功能. 目前用的没有.

    遗留在问题很大继续调查

    词汇在10个以上时已经不知道怎么识别了。所以看了一下其它。
    https://cloud.tencent.com/document/product/1093/38416
    这是腾讯在方案,关于热词的接口,最多20个。

    这是一个深度学习的方案sherpa-ncnn
    https://blog.csdn.net/lstef/article/details/139680825
    我现在需要知道怎么搭建和训练模型。还需要一大堆语音数据去训练。

    小结

    提示:这里可以添加总结
    虽然已经结束了初步测试,但是还有性能和调优和网络化服务的需求.

  • 相关阅读:
    e2studio瑞萨笔记——ADC单次扫描多渠道
    买卖股票的最佳时机 II[中等]
    macbook m1 nacos集群启动失败报错的解决办法
    【MYSQL】5.7版本出错 this is incompatible with sql_mode=only_full_group_by
    PHP如何对二维数组(多维数组)进排序
    日志异常检测准确率低?一文掌握日志指标序列分类
    GEE入门篇|图像处理(二):在Earth Engine中进行波段计算
    git标签操作
    函数调用在嵌入式架构设计中的应用
    Python Flask实现蓝图Blueprint配置和模块渲染
  • 原文地址:https://blog.csdn.net/wjcroom/article/details/143283473