Spaces:
Running
Running
# -*- coding: utf-8 -*- | |
# Copyright © [2024] 程序那些事 | |
# | |
# All rights reserved. This software and associated documentation files (the "Software") are provided for personal and educational use only. Commercial use of the Software is strictly prohibited unless explicit permission is obtained from the author. | |
# | |
# Permission is hereby granted to any person to use, copy, and modify the Software for non-commercial purposes, provided that the following conditions are met: | |
# | |
# 1. The original copyright notice and this permission notice must be included in all copies or substantial portions of the Software. | |
# 2. Modifications, if any, must retain the original copyright information and must not imply that the modified version is an official version of the Software. | |
# 3. Any distribution of the Software or its modifications must retain the original copyright notice and include this permission notice. | |
# | |
# For commercial use, including but not limited to selling, distributing, or using the Software as part of any commercial product or service, you must obtain explicit authorization from the author. | |
# | |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
# | |
# Author: 程序那些事 | |
# email: flydean@163.com | |
# Website: [www.flydean.com](http://www.flydean.com) | |
# GitHub: [https://github.com/ddean2009/MoneyPrinterPlus](https://github.com/ddean2009/MoneyPrinterPlus) | |
# | |
# All rights reserved. | |
# | |
# | |
import requests | |
import hmac | |
import hashlib | |
import base64 | |
import time | |
import random | |
import os | |
import json | |
#录音识别极速版使用 | |
class FlashRecognitionRequest: | |
def __init__(self, engine_type): | |
self.engine_type = engine_type | |
self.speaker_diarization = 0 | |
self.hotword_id = "" | |
self.customization_id = "" | |
self.filter_dirty = 0 | |
self.filter_modal = 0 | |
self.filter_punc = 0 | |
self.convert_num_mode = 1 | |
self.word_info = 0 | |
self.voice_format = "" | |
self.first_channel_only = 1 | |
self.reinforce_hotword = 0 | |
self.sentence_max_length = 0 | |
def set_first_channel_only(self, first_channel_only): | |
self.first_channel_only = first_channel_only | |
def set_speaker_diarization(self, speaker_diarization): | |
self.speaker_diarization = speaker_diarization | |
def set_filter_dirty(self, filter_dirty): | |
self.filter_dirty = filter_dirty | |
def set_filter_modal(self, filter_modal): | |
self.filter_modal = filter_modal | |
def set_filter_punc(self, filter_punc): | |
self.filter_punc = filter_punc | |
def set_convert_num_mode(self, convert_num_mode): | |
self.convert_num_mode = convert_num_mode | |
def set_word_info(self, word_info): | |
self.word_info = word_info | |
def set_hotword_id(self, hotword_id): | |
self.hotword_id = hotword_id | |
def set_customization_id(self, customization_id): | |
self.customization_id = customization_id | |
def set_voice_format(self, voice_format): | |
self.voice_format = voice_format | |
def set_sentence_max_length(self, sentence_max_length): | |
self.sentence_max_length = sentence_max_length | |
def set_reinforce_hotword(self, reinforce_hotword): | |
self.reinforce_hotword = reinforce_hotword | |
class FlashRecognizer: | |
''' | |
reponse: | |
字段名 类型 | |
request_id string | |
status Integer | |
message String | |
audio_duration Integer | |
flash_result Result Array | |
Result的结构体格式为: | |
text String | |
channel_id Integer | |
sentence_list Sentence Array | |
Sentence的结构体格式为: | |
text String | |
start_time Integer | |
end_time Integer | |
speaker_id Integer | |
word_list Word Array | |
Word的类型为: | |
word String | |
start_time Integer | |
end_time Integer | |
stable_flag: Integer | |
''' | |
def __init__(self, appid, credential): | |
self.credential = credential | |
self.appid = appid | |
def _format_sign_string(self, param): | |
signstr = "POSTasr.cloud.tencent.com/asr/flash/v1/" | |
for t in param: | |
if 'appid' in t: | |
signstr += str(t[1]) | |
break | |
signstr += "?" | |
for x in param: | |
tmp = x | |
if 'appid' in x: | |
continue | |
for t in tmp: | |
signstr += str(t) | |
signstr += "=" | |
signstr = signstr[:-1] | |
signstr += "&" | |
signstr = signstr[:-1] | |
return signstr | |
def _build_header(self): | |
header = dict() | |
header["Host"] = "asr.cloud.tencent.com" | |
return header | |
def _sign(self, signstr, secret_key): | |
hmacstr = hmac.new(secret_key.encode('utf-8'), | |
signstr.encode('utf-8'), hashlib.sha1).digest() | |
s = base64.b64encode(hmacstr) | |
s = s.decode('utf-8') | |
return s | |
def _build_req_with_signature(self, secret_key, params, header): | |
query = sorted(params.items(), key=lambda d: d[0]) | |
signstr = self._format_sign_string(query) | |
signature = self._sign(signstr, secret_key) | |
header["Authorization"] = signature | |
requrl = "https://" | |
requrl += signstr[4::] | |
return requrl | |
def _create_query_arr(self, req): | |
query_arr = dict() | |
query_arr['appid'] = self.appid | |
query_arr['secretid'] = self.credential.secret_id | |
query_arr['timestamp'] = str(int(time.time())) | |
query_arr['engine_type'] = req.engine_type | |
query_arr['voice_format'] = req.voice_format | |
query_arr['speaker_diarization'] = req.speaker_diarization | |
query_arr['hotword_id'] = req.hotword_id | |
query_arr['customization_id'] = req.customization_id | |
query_arr['filter_dirty'] = req.filter_dirty | |
query_arr['filter_modal'] = req.filter_modal | |
query_arr['filter_punc'] = req.filter_punc | |
query_arr['convert_num_mode'] = req.convert_num_mode | |
query_arr['word_info'] = req.word_info | |
query_arr['first_channel_only'] = req.first_channel_only | |
query_arr['reinforce_hotword'] = req.reinforce_hotword | |
query_arr['sentence_max_length'] = req.sentence_max_length | |
return query_arr | |
def recognize(self, req, data): | |
header = self._build_header() | |
query_arr = self._create_query_arr(req) | |
req_url = self._build_req_with_signature(self.credential.secret_key, query_arr, header) | |
r = requests.post(req_url, headers=header, data=data) | |
return r.text |