Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件

Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件,第1张

概述本示例的过程是: 1. 音频转文本 2. 利用文本获取情感倾向分析结果 3. 利用文本获取关键词提取 首先是讯飞的语音识别模块。在这里可以找到非实时语音转写的相关文档以及 Python 示例。我略作了

本示例的过程是:

1. 音频转文本

2. 利用文本获取情感倾向分析结果

3. 利用文本获取关键词提取

 

首先是讯飞的语音识别模块。在这里可以找到非实时语音转写的相关文档以及 Python 示例。我略作了改动,让它可以对不同人说话作区分,并且作了一些封装。

语音识别功能

weblfasr_python3_demo.py 文件:

  1 #!/usr/bin/env python  2  -*- Coding: utf-8 -*-  3 """  4 讯飞非实时转写调用demo(语音识别)  5   6 import base64  7  hashlib  8  hmac  9  Json 10  os 11  time 12  13  requests 14  15 lfasr_host = 'http://raasr.xfyun.cn/API' 16  17  请求的接口名 18 API_prepare = /prepare 19 API_upload = /upload 20 API_merge = /merge 21 API_get_progress = /getProgress 22 API_get_result = /getResult 23  文件分片大下52k 24 file_pIEce_sice = 10485760 25  26  ——————————————————转写可配置参数———————————————— 27  参数可在官网界面(https://doc.xfyun.cn/rest_API/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.HTML)查看,根据需求可自行在gene_params方法里添加修改 28  转写类型 29 lfasr_type = 0 30  是否开启分词 31 has_participle = false 32 has_seperate = true 33  多候选词个数 34 max_alternatives = 35  子用户标识 36 suID = '' 37  38  39 class SliceIDGenerator: 40     """slice ID生成器 41  42     def __init__(self): 43         self.__ch = aaaaaaaaa` 44  45     def getNextSliceID(self): 46         ch = self.__ch 47         j = len(ch) - 1 48         while j >= 0: 49             cj = ch[j] 50             if cj != z': 51                 ch = ch[:j] + chr(ord(cj) + 1) + ch[j + 1:] 52                 break 53             else 54                 ch = ch[:j] + a' + ch[j + 1 55                 j = j - 1 56         self.__ch = ch 57         return self. 58  59  60  RequestAPI(object): 61     (self,appID,secret_key,upload_file_path): 62         self.appID = appID 63         self.secret_key = secret_key 64         self.upload_file_path = upload_file_path 65  66      根据不同的APIname生成不同的参数,本示例中未使用全部参数您可在官网(https://doc.xfyun.cn/rest_API/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.HTML)查看后选择适合业务场景的进行更换 67     def gene_params(self,APIname,taskID=None,slice_ID=None): 68         appID = self.appID 69         secret_key = self.secret_key 70         upload_file_path = self.upload_file_path 71         ts = str(int(time.time())) 72         m2 = hashlib.md5() 73         m2.update((appID + ts).encode(utf-8)) 74         md5 = m2.hexdigest() 75         md5 = bytes(md5,enCoding=) 76          以secret_key为key,上面的md5为msg, 使用hashlib.sha1加密结果为signa 77         signa = hmac.new(secret_key.encode(),md5,hashlib.sha1).digest() 78         signa = base64.b64encode(signa) 79         signa = str(signa, 80         file_len = os.path.getsize(upload_file_path) 81         file_name = os.path.basename(upload_file_path) 82         param_dict = {} 83  84         if APIname == API_prepare: 85              slice_num是指分片数量,如果您使用的音频都是较短音频也可以不分片,直接将slice_num指定为1即可 86             slice_num = int(file_len / file_pIEce_sice) + (0 if (file_len % file_pIEce_sice == 0) else 1 87             param_dict[app_ID'] = 88             param_dict[signa signa 89             param_dict[ts ts 90             param_dict[file_len str(file_len) 91             param_dict[file_name file_name 92             param_dict[slice_num str(slice_num) 93         elif APIname == API_upload: 94             param_dict[ 95             param_dict[ 96             param_dict[ 97             param_dict[task_ID taskID 98             param_dict[slice_ID slice_ID 99          API_merge:100             param_dict[101             param_dict[102             param_dict[103             param_dict[104             param_dict[105         elif APIname == API_get_progress or APIname == API_get_result:106             param_dict[107             param_dict[108             param_dict[109             param_dict[110         param_dict[has_seperate has_seperate111         return param_dict112 113      请求和结果解析,结果中各个字段的含义可参考:https://doc.xfyun.cn/rest_API/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.HTML114     def gene_request(self,data,files=None,headers=115         response = requests.post(lfasr_host + APIname,data=data,files=files,1)">headers)116         result = Json.loads(response.text)117         if result["ok"] ==118              print("{} success:".format(APIname) + str(result))119             print(treating...120              result121         122              print("{} error:".format(APIname) + str(result))123             exit(0)124             125 126      预处理127      prepare_request(self):128         return self.gene_request(APIname=API_prepare,129                                  data=self.gene_params(API_prepare))130 131      上传132      upload_request(self,taskID,1)">133         file_object = open(upload_file_path,1)">rb134         try135             index = 1136             sig = SliceIDGenerator()137             while True:138                 content = file_object.read(file_pIEce_sice)139                 if not content or len(content) ==140                     141                 files = {142                     filename": self.gene_params(API_upload).get("143                     content: content144                 }145                 response = self.gene_request(API_upload,1)">146                                              data=self.gene_params(API_upload,taskID=taskID,1)">147                                                                    slice_ID=sig.getNextSliceID()),1)">148                                              files=files)149                 if response.get(') !=150                      上传分片失败151                     upload slice fail,response: ' + str(response))152                      False153                  print('upload slice ' + str(index) + ' success')154                 155                 index += 1156         finally157             file index: str(file_object.tell())158             file_object.close()159          True160 161      合并162      merge_request(self,taskID):163         return self.gene_request(API_merge,data=self.gene_params(API_merge,1)">taskID))164 165      获取进度166      get_progress_request(self,1)">167         return self.gene_request(API_get_progress,data=self.gene_params(API_get_progress,1)">168 169      获取结果170      get_result_request(self,1)">171         return self.gene_request(API_get_result,data=self.gene_params(API_get_result,1)">172 173      all_API_request(self):174          1. 预处理175         pre_result = self.prepare_request()176         taskID = pre_result[data]177          2 . 分片上传178         self.upload_request(taskID=taskID,upload_file_path=self.upload_file_path)179          3 . 文件合并180         self.merge_request(taskID=taskID)181          4 . 获取任务进度182         183              每隔20秒获取一次任务进度184             progress = self.get_progress_request(taskID)185             progress_dic = progress186             if progress_dic[err_no'] != 0 and progress_dic['] != 26605187                  print('task error: ' + progress_dic['Failed'])188                 return189             190                 data = progress_dic[191                 task_status = Json.loads(data)192                 if task_status[status'] == 9193                      print('task ' + taskID + ' finished')194                     195                 The task ' + taskID +  is in processing,task status:  str(data))196                 processing...197              每次获取进度间隔20S198             time.sleep(20199          5 . 获取结果200         return self.get_result_request(taskID=201 202 203  get_text_result(upload_file_path):204     205     封装该接口,获取接口返回的内容206     :param upload_file_path:207     :return: 识别出来的文本数据208     209     API = RequestAPI(appID=xxx",secret_key=upload_file_path)210      API.all_API_request()211 212 213  注意:如果出现requests模块报错:"nonetype" object has no attribute 'read',请尝试将requests模块更新到2.20.0或以上版本(本demo测试版本为2.20.0)214  输入讯飞开放平台的appID,secret_key和待转写的文件路径215 if __name__ == __main__216     result = get_text_result(input/xxx.m4a217     print(result)218     print(type(result))

appID 和 secret_key 需要你自己申请之后,配置上去。

配置好之后填写需要输入的音频,就可以运行该脚本作测试。

python weblfasr_python3_demo.py treating...treating...treating...treating...treating...The task e3e3284aee4a4e3b86a4fd506960e0f2 is in processing,task status: {":2,1)">desc音频并完成}processing...treating...The task e3e3284aee4a4e3b86a4fd506960e0f2 is 3,1)">音频写中}processing...treating...treating...{': [{"bg":"480","ed":"1810","onebest":"我好高兴!","speaker":"2"},{"bg":"1820","ed":"4440ebest":"啊明天就放假了!","speaker":"1"}]',1)">0,1)">Failed': None,1)">0}<class dict'>
情感倾向分析功能

这里是百度情感倾向分析的文档,可以选择 Python SDK 或者 API 接口,我选择的是 API 接口。并且我对它进行了一定程度的封装。

baIDu_sentiment.py 文件有如下代码:

 1  2  3  4 百度情感倾向分析: 5 get_sentiment_result 用于 demo 进行调用 6 # 参数    说明    描述 7 # log_ID    uint64    请求唯一标识码 8 # sentiment    int    表示情感极性分类结果,0:负向,1:中性,2:正向 9 # confIDence    float    表示分类的置信度,取值范围[0,1]10 # positive_prob    float    表示属于积极类别的概率 ,取值范围[0,1)">11 # negative_prob    float    表示属于消极类别的概率,取值范围[0,1)">12 13 14 15 16 17  get_sentiment_result(text):18     19     利用情感倾向分析API来获取返回数据20     :param text: 输入文本21     :return response: 返回的响应22     23     if text == ''24         return 25      请求接口26     url = https://aip.baidubce.com/oauth/2.0/token27      需要先获取一个 token28     clIEnt_ID = 29     clIEnt_secret = 30     params =31         grant_typeclIEnt_credentials,1)">32         clIEnt_ID: clIEnt_ID,1)">33         clIEnt_secret: clIEnt_secret34     }35     headers = {Content-Typeapplication/Json; charset=UTF-8}36     response = requests.post(url=url,params=params,1)">headers).Json()37     access_token = response[access_token38 39      通用版情绪识别接口40     url = https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify41      定制版情绪识别接口42      url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify_custom'43      使用 token 调用情感倾向分析接口44     params =45         : access_token46 47     payload = Json.dumps({48         text: text49     })50     headers = {51     response = requests.post(url=url,data=payload,1)">52      response53 54 55 56     print(get_sentiment_result(白日放歌须纵酒,青春作伴好还乡。57     思悠悠,恨悠悠,恨到归时方始休。'))

同样,你需要在百度创建应用,配置好你的 clIEnt_ID 和 clIEnt_secret。你也可以运行该脚本进行测试。

python baIDu_sentiment.py {log_ID2676765769120607830,1)">items': [{positive_prob0.537741,1)">confIDence0.245186,1)">negative_prob0.462259,1)">sentiment1}]}{4078175744151108694,1)">0.345277,1)">0.232717,1)">0.654723,1)">0}]}
关键词提取功能

在这里可以找到讯飞的关键词提取的接口文档和示例代码。同样我也略作了改动,进行了封装。

WebLtp_python3_demo.py 文件代码:

!/usr/bin/python -*- Coding: UTF-8 -*-讯飞关键词提取接口 6  7  urllib.request 8  urllib.parse 9 10 11 12  接口地址14 url = http://ltpAPI.xfyun.cn/v1/ke"15  开放平台应用ID16 x_appID = "xxx 开放平台应用接口秘钥18 API_key = 19  语言文本20 TEXT = 汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。天生丽质难自弃,一朝选在君王侧。21 22 23  get_keyword_result(text):24     25     这是讯飞官方文档给出的示例26 27     :return response: 返回对象28     29     30         31     body = urllib.parse.urlencode({': text}).encode(32     param = {type": dependent33     x_param = base64.b64encode(Json.dumps(param).replace(' '').encode(34     x_time =35     x_checksum = hashlib.md5(API_key.encode(') +36                              str(x_time).encode(37                              x_param).hexdigest()38     x_header = {X-AppID: x_appID,1)">39                 X-CurTime: x_time,1)">40                 X-Param: x_param,1)">41                 X-CheckSum: x_checksum}42     req = urllib.request.Request(url,body,x_header)43     result = urllib.request.urlopen(req)44     result = result.read()45     return result.decode(46 47 48 49     keyword_result = get_keyword_result(TEXT)50     (keyword_result)51     print(type(keyword_result))

配置好你的 x_appID 和 API_key。

注意:关键词提取还需要你在讯飞应用的后台设置白名单。

点击管理,配置好自己的公网 IP。试着运行一下脚本,会有如下输出:

python WebLtp_python3_demo.py {code0":{ke":[{score0.646word汉皇"},{0.634御宇0.633重色0.632王侧0.628思倾国0.601自弃0.600杨家0.588深闺人未识求不得0.586天生丽质"}]},1)">successsIDltp000aed03@dx589210907749000100str'>
把所有功能组合起来

用一个 Demo 把所有功能组合起来,并把结果存储到文件中。

demo.py 如下:

这是主要的demo流程是:  6 音频->讯飞语音识别API->文本  7 文本再作两种处理:  8     文本->百度情绪识别API->情绪识别的响应  9     文本->讯飞关键词提取API->关键词提取的响应 10  sys 12 from weblfasr_python3_demo  get_text_result 14 from baIDu_sentiment  get_sentiment_result 15 from WebLtp_python3_demo  get_keyword_result 硬编码选定需要离线分析的音频 18  以下是一些测试-------------------------- 19  SOURCE_PATH = 'input/test.mp3' 20  SOURCE_PATH = 'input/test.pcm' 21  SOURCE_PATH = 'input/test.m4a' 22  SOURCE_PATH = 'input/test.wav' 以上是一些测试-------------------------- 24  或者,通过命令行参数选定需要离线分析的音频 25  如:python demo.py test.wav 26 SOURCE_PATH = input/' + sys.argv[1 STEP 1: 调用讯飞语音识别 API 获取讯飞识别出来的响应 29 TEXT_RESulT = get_text_result(SOURCE_PATH) 30  31  32  save_file(data,destin): 33      34     数据持久化函数 35     :param data: 数据 36     :param destin: 目标路径 37     :return: None 38      39     data = str(data) 40     if data: 41         with open(destin,1)">w) as f: 42             f.write(data) 43  45  whole_method(): 46      47     将音频文本不作区分地提取(两个人的对话不做区分) 48  49      50      解析语音识别出来的数据 51     data_List = Json.loads(TEXT_RESulT[]) 52      text 用于拼接 53     text_result =  54     for data in data_List: 55         text_result += data[onebest 56     text_result: 57     text_result completed 58      把文本写入到文件中 59     save_file(text_result,1)">output/text_result.txt 60      STEP 2: 情感倾向分析 输入文本,使用情绪识别函数获取响应 62     sentiment_result = get_sentiment_result(text_result) 63      保存数据 64     save_file(sentiment_result,1)">output/sentiment_result.txt 65     sentiment_result completed STEP 3: 关键词提取 输入文本,调用讯飞提取关键词的接口,对文本做关键词提取 68     keyword_result = get_keyword_result(text_result) 69      70     save_file(keyword_result,1)">output/keyword_result.txt 71     keyword_result completed 72  73  74  seperate_method(): 75      76     将音频文本作区分地提取(区分两个人的对话) 77  78      79     data_List = Json.loads(TEXT_RESulT[ 80     text_result1 =  81     text_result2 =  82      假设有两个人,把文本分别做整合 83      print(data) 85         if data[speaker'] == 1 86             text_result1 += data[ 87          88             text_result2 += data[ 89     text_result1 90     text_result2 91     text_result1 text_result2 completed 92     save_file(text_result1,1)">output/text_result1.txt 93     save_file(text_result2,1)">output/text_result2.txt 94      95      96      A 的对话 97     sentiment_result1 = get_sentiment_result(text_result1) 98     save_file(sentiment_result1,1)">output/sentiment_result1.txt 99     result_get_result1 completed100      B 的对话101     sentiment_result2 = get_sentiment_result(text_result2)102     save_file(sentiment_result2,1)">output/sentiment_result2.txt103     result_get_result2 completed104     105      调用讯飞接口做文本的关键字提取106     107     keyword_result1 = get_keyword_result(text_result1)108     save_file(keyword_result1,1)">output/keyword_result1.txt109     keyword_result1 completed110     111     keyword_result2 = get_keyword_result(text_result2)112     save_file(keyword_result2,1)">output/keyword_result2.txtkeyword_result2 completed114 115 116 117      TEXT_RESulT:118         whole_method()119         seperate_method()

输出大致如下:

python demo.py test.mp3treating...treating...treating...treating...treating...The task 8552d13470ed4839b11e0f3693f296f9 is 音频合并完成}processing...treating......The task 8552d13470ed4839b11e0f3693f296f9 is 音频转写中}processing...treating...treating...text_result: 喂喂你好,是xxx的机主是吧?谁?呀我是xxx的工作人员,您在今天中午12点多在我们xxx提交了xxx是吧?那怎么?...那没有关系,我说您是否办理xxx?什么有什么有关系,啊有什么有关系啊。text_result completedsentiment_result completedkeyword_result completedtext_result1 喂喂你好,是xxx的机主是吧?呀我是xxx的工作人员,您在今天中午12点多在我们xxx提交了xxx是吧?...那没有关系,我说您是否办理xxx?text_result2 谁?那怎么?...什么有什么有关系,啊有什么有关系啊。text_result1 text_result2 completedresult_get_result1 completedresult_get_result2 completedkeyword_result1 completedkeyword_result2 completed

原文作者:雨先生
原文链接:https://www.cnblogs.com/noluye/p/11225024.html 
许可协议:知识共享署名-非商业性使用 4.0 国际许可协议

总结

以上是内存溢出为你收集整理的Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件全部内容,希望文章能够帮你解决Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存