基于200I DK A2的--实时语音字幕生成器,视频文本摘录器

文章讨论了一个基于昇腾Altas200IDKA2的解决方案,通过语音侦听和socket传输实现实时会议中的语音转文字,包括字幕生成和文本摘要,但提到存在背景音乐干扰和模型选择的问题。作者寻求改进和交流意见。
摘要由CSDN通过智能技术生成

PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。

如果各位觉得写的还行,劳请各位老师们点赞收藏一波!!各位老师的鼓励是我坚持写作的动力!!

我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!

以下解决方案仅代表个人见解,如果有更好的方案,希望大家不吝提出,共同学习

问:做这个设计的目的是什么?想要解决怎样的痛点?

1.在学习的过程中,总会遇到一些视频并没有提供相应的字幕,导致理解上有些偏差

听课20分钟后,突然想起课程里提及的要点,但是记忆很模糊,想要去找到这个模糊的知识点巩固下

但是需要在原有视频中花较大时间去复原记忆点的位置

2.亦或是,实时网络会议过程,需要整理相应的文本摘要,或者是回顾老师,领导讲述的重点内容。

那么由于是实时视频,没有回放,没有录屏。无从下手

3.这个算是这个设计后续的升级版本,直接对英文进行在线翻译,解决全英语课堂的语言问题

问:怎么设计呢?设计思路是什么?

首先这个设计时基于昇腾Altas 200I DK A2 的speech-recognition实验,融入了语音侦听,socket传输功能

我的思路是,通过电脑声音录制中立体声混音特性,对电脑的Realtek High Definition Audio进行侦听

然后通过socket传输到Altas 200I DK A2, 通过生成模型实时推理,生成相应的字幕或是文本

问:本设计使用的流控是怎么样的呢?

个人觉得本设计使用的流控还是比较取巧,比较伪。并没有达到心目中真正的流翻译。

通过对音频进行pyaudio 进行 侦听,将实时固定chunk 以wav格式加密,然后通过socket传输到设备

再进行推理。所以会有多个wav 格式的数据传输至设备,使用ByteIO内存管理,不用写入内存

如果大家有更好的方法,可以多交流。

问:最终效果怎么样?

问:不足在哪里?

1.由于使用wenet,模型选择并非是大模型,可能会导致在部分专有名字上翻译不到位

2.如果存在背景音乐将会造成很大的干扰,需要独立人声后进行翻译更精准,可以用凤凰传奇的《奢香夫人》进行案例测试

3.当然对比微信语音翻译,在音乐文本翻译上确实弱一些。

4.如果可能,使用whisper模型进行测试可能会有更好效果

下面就贴具体代码,欢迎大家有更好解决方案,或者代码方案,能一起交流

问:电脑端的代码是怎么样的?

class Handle_Process(Process):
    def __init__(self,queue):
        super(Handle_Process, self).__init__()
        self.name = 'Handle_Process'
        self.thread = Event()
        self.queue = queue
        self.frames = []
        self.sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        ip_port=('192.168.137.100',55)
        self.sk.connect(ip_port)
        
    def stop(self):
        self.thread.set()
    
    def check(self):
        return self.thread.is_set()
    
    def handler(self):
        try:
            if not self.queue.empty():
                data = self.queue.get()
                self.frames = self.tranfer2wav(data)
                self.frames = self.frames + bytes('END', encoding = "utf8")
                self.sk.send(self.frames)#将发送的数据进行编码d
        except Exception as e:
            print(e)

    def compute_fbank(self,waveform,
                    sample_rate,
                    num_mel_bins=80,
                    frame_length=25,
                    frame_shift=10,
                    dither=0.0):
        """提取filter bank音频特征"""
        AMPLIFY_FACTOR = 1 << 15
        waveform = waveform * AMPLIFY_FACTOR
        mat = kaldi.fbank(waveform,
                        num_mel_bins=num_mel_bins,
                        frame_length=frame_length,
                        frame_shift=frame_shift,
                        dither=dither,
                        energy_floor=0.0,
                        sample_frequency=sample_rate)
        return mat

    def resample(self,waveform, sample_rate, resample_rate=16000):
        waveform = torchaudio.transforms.Resample(
            orig_freq=sample_rate, new_freq=resample_rate)(waveform)
        return waveform, resample_rate


    def tranfer2wav(self,data):
        chunk_description = b'RIFF'
        sub_chunk2_size = len(data)
        chunk_size = sub_chunk2_size + 44 - 8
        wave_description = b'WAVE'
        fmt_subchunk = b'fmt '
        sub_chunk1_size = 16
        audio_format = 1
        num_channels = 1
        sample_rate = 16000
        bits_per_sample = 16
        byte_rate = int(sample_rate * num_channels * bits_per_sample / 8)
        block_align = int(num_channels * bits_per_sample / 8)
        data_subchunk = b'data'
        

        buf = []
        buf.append(chunk_description)
        buf.append(struct.pack('<i', chunk_size))
        buf.append(wave_description)
        buf.append(fmt_subchunk)
        buf.append(struct.pack('<i', sub_chunk1_size))
        buf.append(struct.pack('<h', audio_format))
        buf.append(struct.pack('<h', num_channels))
        buf.append(struct.pack('<i', sample_rate))
        buf.append(struct.pack('<i', byte_rate))
   

        buf.append(struct.pack('<h', block_align))
        buf.append(struct.pack('<h', bits_per_sample))
        buf.append(data_subchunk)
        buf.append(struct.pack('<i', sub_chunk2_size))
        buf.append(data)
        buf = b''.join(buf)
        return buf
    

    
    def run(self):
        while True:
            try:
                if self.check():
                    self.sk.close()
                    break
                self.handler()
                time.sleep(0.01)
            except Exception as e:
                print(e)复制

问:设备端的代码是怎么样的?

    def transcribe(self):
        """执行模型推理,将录音文件转为文本。"""
        try:
            tcp_server_socket= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        except Exception as e:
            print(e)
            tcp_server_socket.close()
            exit()

        address=('192.168.137.100',55)
        tcp_server_socket.bind(address)
        tcp_server_socket.listen(3)
        total_recv_data = b''
        while True: 
            try:
                client_socket, clientAddr=tcp_server_socket.accept()
            except Exception as e:
                print(e)
                client_socket.close()
                tcp_server_socket.close()
                exit()
                
            while True:
                try:
                    recv_data = client_socket.recv(1024)
                    #print(len(recv_data))
                except Exception as e:
                    print(e)
                    client_socket.close()
                    tcp_server_socket.close()
                    exit()
                    
                if recv_data:
                    if len(recv_data) < 1024 and recv_data[-3:] == bytes('END', encoding = "utf8"):
                        total_recv_data = total_recv_data + recv_data
                        total_recv_data = total_recv_data[:-3]
                       
                        waveform, sample_rate = torchaudio.load(io.BytesIO(total_recv_data))
                        feature = compute_fbank(waveform, sample_rate)
                        feats_pad = feature.numpy().astype(np.float32)
                        feats_lengths = np.array([feature.shape[0]]).astype(np.int32)                             
                        
                        feats_pad = feature.unsqueeze(0)
                        feats_pad = feats_pad.numpy().astype(np.float32)
                        output = self.model.infer([feats_pad, feats_lengths])
                        txt = self.post_process(output)
                        print(txt)
                        total_recv_data = b''
                        
                    else:
                        total_recv_data = total_recv_data + recv_data

                    
                else:
                    break
            client_socket.close()
        tcp_server_socket.close()  复制

具体代码详见附件,上文只是粘贴部分代码

基于200I DK A2的--实时语音字幕生成器,视频文本摘录器_Atlas 200I DK A2_昇腾论坛 (hiascend.com)

希望大家能够多交流,提供更好的思路~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Atlas 200I DK A2是一款开发者工具套件,其中包含了一键制卡工具和模型适配工具。一键制卡工具可以将适配好开发板的镜像烧录到SD卡上,方便使用Atlas 200I DK A2进行开发。而模型适配工具则是一款集成了数据集管理、模型训练和模型打包等功能的工具,可以帮助开发者降低在模型开发过程中的学习成本和开发难度,快速构建典型的推理应用并部署到Atlas 200I DK A2上。\[1\]\[2\]\[3\]关于yolo的具体信息,可能需要进一步了解。 #### 引用[.reference_title] - *1* [【2023 · CANN训练营第一季】初识新一代开发者套件Atlas200I DK A2](https://blog.csdn.net/weixin_43589750/article/details/130535105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2---介绍Atlas 200I DK A2的基本使用](https://blog.csdn.net/qq_45257495/article/details/130797775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值