前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【语音识别】一键实现电话录音转word文档

【语音识别】一键实现电话录音转word文档

原创
作者头像
爱去西
发布2024-06-03 15:51:09
3640
发布2024-06-03 15:51:09
举报
文章被收录于专栏:猫窜游戏猫窜游戏

1, 开发背景

因从事律师工作,在诉讼业务中,经常会解除到当事人电话录音这一类的证据。苦于当事人提供的电话录音要么普通话不标准,要么直接就是方言,对话中的关键信息也难以定位。而在法庭的质证环节中,仅提交一份电话录音的文件,却不提供转写的文字版内容,显然是不会留给审判席人员好印象的。众所周知,律师最值钱的就是时间了,那么这样一份繁琐的转写录音文件的工作流程,能不能够使用AI的科技手段实现呢?

2, 推荐工具:腾讯云语音识别

腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转成文字的 PaaS 产品,能够为企业提供极具性价比的语音识别服务。被微信、王者荣耀、腾讯视频等大量内部业务使用,外部亦服务于呼叫中心录音转写、会议实时转写、语音输入法、数字人、互动直播、课堂内容分析等多个业务场景,产品具备丰富的行业落地经验。

录音文件识别极速版,是腾讯云语音识别(ASR)系列的子产品,可对时长2小时以内的录音文件进行识别,通常30分钟音频可在10秒内完成识别,适用于短视频快速生成字幕、快速语音转写质检、新闻语音转写等转写时效性较高的场景。

3, 开发前准备(本文以python语言为例)

3.1 开通接口

在调用语音识别相关接口前,您需要进入 语音识别控制台,进行实名认证和人脸认证,认证完成后,阅读《用户协议》后勾选“我已阅读并同意《用户协议》”,然后单击【立即开通】,即可一键开通录音文件识别、实时语音识别、一句话识别、录音文件识别极速版、语音流异步识别服务接口,如需开通营业执照核验或增值税发票核验功能,可前往官网页服务介绍页申请开通,审核通过后即可使用该服务。

3.2 开发工具

Python 2.7, 3.6-3.9 版本

VScode或其他集成开发环境

Git

一段测试录音文件。

4,进入实践

4.1 新建项目文件夹,并下载SDK包:tencentcloud-speech-sdk-python

在项目目录中进入终端(使用CMD或者GIT BASH),输入命令如下:

代码语言:txt
复制
git clone https://github.com/TencentCloud/tencentcloud-speech-sdk-python.git

4.2 安装相关依赖

终端中输入命令如下安装该分包的依赖

代码语言:txt
复制
pip install --upgrade tencentcloud-sdk-python-common tencentcloud-sdk-python-asr

4.3 用IDE打开tencentcloud-speech-sdk-python/examples/asr/flashexample.py文件,修改并测试

官方SDK的示例中已经给出了参考的代码,本文出于教学及测试的目的,仅对已有代码修改即可。

首先来到示例代码的第12-16行,填写相关账户信息,若之前没有开通API密钥,请先进入 API 密钥管理页面 新建密钥

代码语言:python
复制
# 注意:使用前务必先填写APPID、SECRET_ID、SECRET_KEY,否则会无法运行!!!
APPID = "125861****"
SECRET_ID = "****jIcgU1HI2VhcHfndEYcPxEExPbWA****"
SECRET_KEY = "****wykFagX8UaS5SZQ3QXTAaolj****"
ENGINE_TYPE = "8k_zh" # 引擎模型类型,默认为非电话场景16k_zh,中文通用。

此时,我们已经完成了测试语音识别API功能的基本条件,在flashexample.py文件目录下打开CMD,输入

python flashexample.py命令,运行

代码语言:txt
复制
C:\Users\XXXX\Desktop\record2text\tencentcloud-speech-sdk-python\examples\asr>python flashexample.py
request_id:  6657fc0349377b7eeee72cb0
channel_id:  0
北京科技馆。

即可得到包括request_id(请求ID),channel_id(声道标识)及北京科技馆。(text类型的语音识别结果)

注:SDK包中,flashexample.py文件目录下已默认包含test.wav文件。

至此,我们的项目已完成了1/3的目标,接下来只需要使用一段真正的电话录音进行语音识别操作,并把输入内容按照我们期望的格式,保存为word文档即可。

4.4 增加请求设置参数,开启说话人分离功能

首先,我们需要实现的目标是将电话的录音转为可以直接使用的word文档,就需要开启说话人分离功能

在源代码中40行的下方增加以下代码

代码语言:python
复制
req.set_speaker_diarization(1) #添加设置该参数,是否开启说话人分离(目前支持中文普通话引擎),默认为0,0:不开启,1:开启。

这样我们得到的响应内容就会有sentence_list内容,即句子/段落级别的识别结果列表,我们才能从中分离出说话人的ID,以及对话的起始时间等内容

4.5 修改音频文件类型及文件来源

由于SDK中自带的音频文件非常的简短且只有一句话,是无法测试目前我们期望达成的目标内容的;

此处需自行准备一段电话的录音,以备后续测试使用,本文中已在当前目录下存入test.mp3文件

找到源代码中第38行,将目标音频的类型修改一致,此处以MP3格式为例,修改如下:

代码语言:python
复制
req.set_voice_format("mp3") #支持 wav、pcm、ogg-opus、speex、silk、mp3、m4a、aac、amr。

在代码第44行,设置音频文件目录:

代码语言:python
复制
audio = "./test.mp3"

4.6 修改代码的输出内容

从文章末端的代码可以看出,该示例打印的结果是遍历输出了所有声道中的识别结果,并且仅打印了text部分

代码语言:python
复制
        for channl_result in resp["flash_result"]:
            print("channel_id: ", channl_result["channel_id"])
            print(channl_result["text"])

这显然不是我们想要的。首先,sentence_list部分才是我们所需要的,其次,本次项目没有多声道,也无需遍历,于是改写代码如下:

代码语言:python
复制
        flash_result = resp["flash_result"][0]
        print(resp["audio_duration"],flash_result["sentence_list"])

现在再次运行该文件,可以得到以下结果:

代码语言:powershell
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* 287136 [{'text': '诶。', 'start_time': 11100, 'end_time': 11850, 'speaker_id': 0}, {'text': '喂,你好,李先生是吧。', 'start_time': 11960, 'end_time': 13470, 'speaker_id': 1}, {'text': '啊,对啊,你好。', 'start_time': 13920, 'end_time': 14790, 'speaker_id': 0}, {'text': '华夏银行这里啊。', 'start_time': 14790, 'end_time': 16030, 'speaker_id': 1}, {'text': '您好,我们就是跟您个电话回访一下,就是这段时间那个公安那边有跟您联系吗?', 'start_time': 16440, 'end_time': 21350, 'speaker_id': 1}, {'text': '刚才我是不是给你打的电话呀。', 'start_time': 24080, 'end_time': 26130, 'speaker_id': 0}, {'text': '刚刚。', 'start_time': 26280, 'end_time': 27170, 'speaker_id': 1}, {'text': '好像没有吧。', 'start_time': 27380, 'end_time': 29790, 'speaker_id': 1}, {'text': '你刚说什么是什么,打电话给我啊。', 'start_time': 34600, 'end_time': 37710, 'speaker_id': 0}, {'text': '就是我们这边是华夏银行啊,您之前不是说您的卡有问题吗?然后需要公安机关那边帮您,我们要我们帮您 联系公安机关那边进行核实嘛。', 'start_time': 37960, 'end_time': 45750, 'speaker_id': 1}, {'text': '核实,你应该联系我就 。', 'start_time': 48820, 'end_time': 51650, 'speaker_id': 0}, {'text': '就近的公安局或者是说刑侦大队之类的。', 'start_time': 51920, 'end_time': 54770, 'speaker_id': 0}, {'text': '应该不是我们行,刚刚您和您打电话吧。', 'start_time': 55740, 'end_time': 58770, 'speaker_id': 1}, {'text': '啊,是。', 'start_time': 60320, 'end_time': 61170, 'speaker_id': 0}, {'text': '嗯,怎么说。', 'start_time': 61200, 'end_time': 62610, 'speaker_id': 0}, {'text': '就是我们这边是华夏银行嘛,之前 您不是有说有疑问询问这个卡的问题吗,是吗。', 'start_time': 63660, 'end_time': 68950, 'speaker_id': 1}, {'text': '哦哦, 然后我们现在给您回复啊。', 'start_time': 69660, 'end_time': 72130, 'speaker_id': 1}, {'text': '就是您这个卡哦,您之前这 个卡不是有过公安机关那边的冻结吗。', 'start_time': 72680, 'end_time': 77570, 'speaker_id': 1}, {'text': '然后呢,哦。', 'start_time': 79620, 'end_time': 80470, 'speaker_id': 0}, {'text': '然后呢,需要他我们先跟您反映,跟您说一下那个解决途径啊,您就跟。', 'start_time': 80470, 'end_time': 85610, 'speaker_id': 1}, {'text': '其实您这个问题也比较好解决,您就跟公 安机关那边进行一个核实,然后他们那边出个函给我,我们就帮您解就可以了,只要有那个函就可以了。', 'start_time': 85680, 'end_time': 93770, 'speaker_id': 1}, {'text': '我不跟你说了,我们在当地,你要我看飞机啊,我没有。', 'start_time': 95800, 'end_time': 99640, 'speaker_id': 0}, {'text': '安您,您如果不在当地的话,您看看公安机关那边人能不能核实一下,让他们出个函给我们就可以了。', 'start_time': 99640, 'end_time': 105770, 'speaker_id': 1}, {'text': '我们我我。', 'start_time': 106660, 'end_time': 107635, 'speaker_id': 0}, {'text': '我们去那边领也行,都可以的,您这个问题他需要出那个函我们才能解。', 'start_time': 107635, 'end_time': 112550, 'speaker_id': 1}, {'text': '我去跟谁联系?', 'start_time': 113140, 'end_time': 114550, 'speaker_id': 0}, {'text': '就就是那个呃,就近的户籍地派出所啊,或者是那个桂林反诈中心啊。', 'start_time': 115400, 'end_time': 120550, 'speaker_id': 1}, {'text': '就近的派出所,就是我们居住地的派出所啊。', 'start_time': 121360, 'end_time': 124390, 'speaker_id': 0}, {'text': '不是是是是您那个户籍地的那个派出所。', 'start_time': 124480, 'end_time': 127790, 'speaker_id': 1}, {'text': '哦,去户籍地派出所干嘛呢?', 'start_time': 128500, 'end_time': 130550, 'speaker_id': 0}, {'text': '嗯,他们我们公安机关那边就给我们电话回复啊,他需要您去那边联系啊。', 'start_time': 130960, 'end_time': 135810, 'speaker_id': 1}, {'text': '去核实啊。', 'start_time': 135920, 'end_time': 137070, 'speaker_id': 1}, {'text': '我我不在 ,我不在家里面,我在外地啊那。', 'start_time': 137600, 'end_time': 140900, 'speaker_id': 0}, {'text': '您在外地的话,您 看可不可以就是通过电话的形式跟他们核实啊,他们那边能不能出个函,如果您不方便去拿的话,我们帮您去拿也可以啊。', 'start_time': 140900, 'end_time': 149650, 'speaker_id': 1}, {'text': '只要有这个函就可以了。', 'start_time': 149800, 'end_time': 151370, 'speaker_id': 1}, {'text': '哦。', 'start_time': 152220, 'end_time': 152950, 'speaker_id': 0}, {'text': '可我我 试着联系一下吧,我看看那边是出个什么函,你说一下,我能笔记一下就是解。', 'start_time': 153000, 'end_time': 158040, 'speaker_id': 0}, {'text': '控银行账户的一个函,就是他们那边也会有盖章的。', 'start_time': 158040, 'end_time': 162270, 'speaker_id': 1}, {'text': '解控哪个解啊。', 'start_time': 162700, 'end_time': 164890, 'speaker_id': 0}, {'text': '解除的解, 解放的解,解。', 'start_time': 165160, 'end_time': 167350, 'speaker_id': 1}, {'text': '控解控银行账户的。', 'start_time': 167350, 'end_time': 170090, 'speaker_id': 0}, {'text': '对对对,他们那边有啊,对对对,他们那边账户。', 'start_time': 170090, 'end_time': 173425, 'speaker_id': 1}, {'text': '啊。', 'start_time': 173425, 'end_time': 174510, 'speaker_id': 0}, {'text': '它那个具体的名称,反正应该就是这个大致这个名称,然后会有他们公安局。', 'start_time': 174660, 'end_time': 180050, 'speaker_id': 1}, {'text': '啊,对,有。', 'start_time': 180050, 'end_time': 180870, 'speaker_id': 0}, {'text': '会有他们公安局的一个盖章的。', 'start_time': 180870, 'end_time': 182930, 'speaker_id': 1}, {'text': '如果他们他们我那边。', 'start_time': 183260, 'end_time': 184550, 'speaker_id': 1}, {'text': '是我户籍所在地就是一个小镇,诶,小镇那边能出这个东西吗?那那。', 'start_time': 184550, 'end_time': 189620, 'speaker_id': 0}, {'text': '那那您就去那个桂林反诈中心呗,反 诈中心那边山东路那边。', 'start_time': 189620, 'end_time': 195210, 'speaker_id': 1}, {'text': '我不在旁边呀。', 'start_time': 196200, 'end_time': 197850, 'speaker_id': 0}, {'text': '在当地。', 'start_time': 198400, 'end_time': 199350, 'speaker_id': 1}, {'text': '那反诈中心的那个电话,您稍等一下,我帮您看能不能看得到啊,我帮您查一下。', 'start_time': 200260, 'end_time': 205435, 'speaker_id': 1}, {'text': '确实是打不通那个电话打。', 'start_time': 205435, 'end_time': 207235, 'speaker_id': 0}, {'text': '不通吗?', 'start_time': 207235, 'end_time': 208270, 'speaker_id': 1}, {'text': '啊,那是那是8989318吧,我打不通啊。', 'start_time': 208980, 'end_time': 212880, 'speaker_id': 0}, {'text': '那那那那个9696110呢。', 'start_time': 212880, 'end_time': 215910, 'speaker_id': 1}, {'text': '那我问。', 'start_time': 217260, 'end_time': 218470, 'speaker_id': 0}, {'text': '刚才不是打了都没人接,好像打的人多了吧,现在没人接。', 'start_time': 218540, 'end_time': 223130, 'speaker_id': 0}, {'text': '嗯,那。', 'start_time': 223260, 'end_time': 224160, 'speaker_id': 0}, {'text': '您看 吧,您看他,您看可能再打几次,看一下情况怎么样,就是说如果他那边能出函,您不方便回来,他那边核实跟您核实情况核实清楚了。', 'start_time': 224160, 'end_time': 234170, 'speaker_id': 1}, {'text': '然后他们那边也同意出这个函了,您不方便回来拿, 那我们去拿也可以,没问题。', 'start_time': 234200, 'end_time': 239470, 'speaker_id': 1}, {'text': '嗯。', 'start_time': 239840, 'end_time': 240550, 'speaker_id': 0}, {'text': '对呀,我我先试一下我当地那个小镇上面那个派出所吧。', 'start_time': 241260, 'end_time': 245710, 'speaker_id': 0}, {'text': '嗯,那小镇的派出所可能可能还得还是得联系反诈中心这边。', 'start_time': 246160, 'end_time': 250770, 'speaker_id': 1}, {'text': '哦,那那我现在联系不上怎么办呢。', 'start_time': 251520, 'end_time': 254170, 'speaker_id': 0}, {'text': '嗯。', 'start_time': 254300, 'end_time': 255390, 'speaker_id': 0}, {'text': '那可能还得您再再多多试几次,因为是我他那还有这个函,我们银行才能解。', 'start_time': 255580, 'end_time': 261630, 'speaker_id': 1}, {'text': '现在是这个情况。', 'start_time': 261880, 'end_time': 262990, 'speaker_id': 1}, {'text': '那我多打几次吧,看看能不能啊,嗯。', 'start_time': 263480, 'end_time': 266100, 'speaker_id': 0}, {'text': '对啊,那他他那 边,然后如果他那边公安机关同意出的话,你让公安机关这边和我们这边再联系一下,我们去去帮你拿,然后帮您解,这都没问题。', 'start_time': 266100, 'end_time': 275950, 'speaker_id': 1}, {'text': '好可以啊,嗯嗯嗯,我试一下吧啊。', 'start_time': 276740, 'end_time': 278870, 'speaker_id': 0}, {'text': '您试一下啊,好的有好好。', 'start_time': 278870, 'end_time': 281360, 'speaker_id': 1}, {'text': '好好,嗯。', 'start_time': 281360, 'end_time': 281945, 'speaker_id': 0}, {'text': '好,再见。', 'start_time': 281945, 'end_time': 282635, 'speaker_id': 1}, {'text': '好好,再见。', 'start_time': 282635, 'end_time': 284030, 'speaker_id': 0}, {'text': '啊,不好意思啊。', 'start_time': 285500, 'end_time': 286490, 'speaker_id': 0}]
*/

现在,我们得到了通话的总时长,以及对话分离的对象数组,接下来,我们只要将得到的数据用合适的格式保存至word中,就完成任务了。

4.7 安装python的word库,并在项目中引用

在命令行中输入pip install python-docx安装相关依赖

代码语言:txt
复制
pip install python-docx

在项目flashexample.py的开头引入该依赖,添加代码如下:

代码语言:python
复制
from docx import Document

4.8 新建一个word文档,并添加标题“电话录音(文字版)、说明录音时长以及对话人”

在示例文件flashexample.py的末端,我们紧接着4.6步骤之后,添加如下代码:

代码语言:python
复制
        # 创建一个新的Word文档
        document = Document()
        # 添加一个标题
        document.add_heading('电话录音(文字版)', 0)
        # 添加一个段落
        document.add_paragraph(f'本次通话的总时长为:{resp["audio_duration"]/1000}秒')
        document.add_paragraph('A:\t\t\t\tB:\n')

4.9 加入通话内容

紧接着上面的代码,我们将之前得到的sentence_list数组加入遍历,写入word文档之中:

代码语言:python
复制
        for sentence_list in flash_result["sentence_list"]:
            document.add_paragraph(f'时间:{sentence_list["start_time"]/1000}-{sentence_list["end_time"]/1000}')
            if sentence_list["speaker_id"] == 0:
                document.add_paragraph(f'A:{sentence_list["text"]}')
            else:
                document.add_paragraph(f'B:{sentence_list["text"]}')        

4.10 保存word文档并运行测试

最后,加入以下命令保存word文档

代码语言:python
复制
        # 保存文档
        document.save('example.docx')

随后在命令行中输入python flashexample.py进行测试。

项目结构目录
项目结构目录

可以看到,项目目录下已经生成了我们的目标文件example.docx,我们打开验证一下

实际运行结果截图
实际运行结果截图

至此,我们已经完整的实现了电话录音转word文档的项目内容。

今后只需将录音保存至项目文件夹中,输入运行的命令,我们即可实现一键转化的功能!

5. 扩展内容(美化word文档)

5.1 设置段落居中

以输出的第二段内容为例,我们将输出的文字做居中处理,可以更改代码如下:

代码语言:python
复制
        # 添加一个段落
        paragraph = document.add_paragraph(f'本次通话的总时长为:{resp["audio_duration"]/1000}秒')
        # 设置段落居中对齐
        paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER

5.2 设置文章的字体大小、颜色以及是否为粗体

代码语言:python
复制
        # 设置字体颜色
        run = paragraph.runs[0]
        font = run.font
        font.size = Pt(13) # 设置字号
        font.bold = True #设置粗体
        font.color.rgb = RGBColor(255,0,0) #设置字体颜色为红色

更改后的效果:

更改段落为居中,字体大小为13号加粗红色
更改段落为居中,字体大小为13号加粗红色

以上便是使用腾讯云语音识别功能,完成一键实现通话录音转word文档的全部内容,感谢阅读。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1, 开发背景
  • 2, 推荐工具:腾讯云语音识别
  • 3, 开发前准备(本文以python语言为例)
    • 3.1 开通接口
      • 3.2 开发工具
      • 4,进入实践
        • 4.1 新建项目文件夹,并下载SDK包:tencentcloud-speech-sdk-python
          • 4.2 安装相关依赖
            • 4.3 用IDE打开tencentcloud-speech-sdk-python/examples/asr/flashexample.py文件,修改并测试
              • 4.4 增加请求设置参数,开启说话人分离功能
                • 4.5 修改音频文件类型及文件来源
                  • 4.6 修改代码的输出内容
                    • 4.7 安装python的word库,并在项目中引用
                      • 4.8 新建一个word文档,并添加标题“电话录音(文字版)、说明录音时长以及对话人”
                        • 4.9 加入通话内容
                          • 4.10 保存word文档并运行测试
                          • 5. 扩展内容(美化word文档)
                            • 5.1 设置段落居中
                              • 5.2 设置文章的字体大小、颜色以及是否为粗体
                              相关产品与服务
                              智能识别
                              腾讯云智能识别(Intelligent Identification,II)基于腾讯各实验室最新研究成果,为您提供视频内容的全方位识别,支持识别视频内的人物、语音、文字以及帧标签,对视频进行多维度结构化分析。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档