<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
搜狗(目前好用,免費)
def textToAudio_Sougou(message, filePath): # https://ai.so gou.com/doc/?url=/docs/content/tts/references/rest/ ''' curl -X POST -H "Content-Type: application/json" --data '{ "appid": "xxx", "appkey": "xxx", "exp": "3600s" }' https://api.zhiyin.sogou.com/apis/auth/v1/create_token ''' token = 'xxx' headers = { 'Authorization' : 'Bearer '+token, 'Appid' : 'xxx', 'Content-Type' : 'application/json', 'appkey' : 'xxx', 'secretkey' : 'xxx' } data = { 'input': { 'text': message }, 'config': { 'audio_config': { 'audio_encoding': 'LINEAR16', 'pitch': 1.0, 'volume': 1.0, 'speaking_rate': 1.0 }, 'voice_config': { 'language_code': 'zh-cmn-Hans-CN', 'speaker': 'female' } } } result = requests.post(url=url, headers=headers, data=json.dumps(data, ensure_ascii=False).encode('utf-8')).content with open(filePath, 'wb') as f: f.write(result)
百度(現在收費了,送一定額度)
import base64 import json import os import time import shutil import requests class BaiduVoiceToTxt(): # 初始化函數 def __init__(self): # 定義要進行切割的pcm檔案的位置。speech-vad-demo固定好的,沒的選 self.pcm_path = ".\speech-vad-demo\pcm\16k_1.pcm" # 定義pcm檔案被切割後,分割成的檔案輸出到的目錄。speech-vad-demo固定好的,沒的選 self.output_pcm_path = ".\speech-vad-demo\output_pcm\" # 百度AI介面只接受pcm格式,所以需要轉換格式 # 此函數用於將要識別的mp3檔案轉換成pcm格式,並輸出為.speech-vad-demopcm16k_1.pcm def change_file_format(self,filepath): file_name = filepath # 如果.speech-vad-demopcm16k_1.pcm檔案已存在,則先將其刪除 if os.path.isfile(f"{self.pcm_path}"): os.remove(f"{self.pcm_path}") # 呼叫系統命令,將檔案轉換成pcm格式,並輸出為.speech-vad-demopcm16k_1.pcm change_file_format_command = f".\ffmpeg\bin\ffmpeg.exe -y -i {file_name} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {self.pcm_path}" os.system(change_file_format_command) # 百度AI介面最長只接受60秒的音視,所以需要切割 # 此函數用於將.speech-vad-demopcm16k_1.pcm切割 def devide_video(self): # 如果切割輸出目錄.speech-vad-demooutput_pcm已存在,那其中很可能已有檔案,先將其清空 # 清空目錄的檔案是先刪除,再建立 if os.path.isdir(f"{self.output_pcm_path}"): shutil.rmtree(f"{self.output_pcm_path}") time.sleep(1) os.mkdir(f"{self.output_pcm_path}") # vad-demo.exe使用相對路徑.pcm和.output_pcm,所以先要將當前工作目錄切換到.speech-vad-demo下不然vad-demo.exe找不到檔案 os.chdir(".\speech-vad-demo\") # 直接執行.vad-demo.exe,其預設會將.pcm16k_1.pcm檔案切割並輸出到.output_pcm目錄下 devide_video_command = ".\vad-demo.exe" os.system(devide_video_command) # 切換回工作目錄 os.chdir("..\") # 此函數用於將.speech-vad-demooutput_pcm下的檔案的檔名的時間格式化成0:00:00,000形式 def format_time(self, msecs): # 一個小時毫秒數 hour_msecs = 60 * 60 * 1000 # 一分鐘對應毫秒數 minute_msecs = 60 * 1000 # 一秒鐘對應毫秒數 second_msecs = 1000 # 檔名的時間是毫秒需要先轉成秒。+500是為了四捨五入,//是整除 # msecs = (msecs + 500) // 1000 # 小時 hour = msecs // hour_msecs if hour < 10: hour = f"0{hour}" # 扣除小時後剩餘毫秒數 hour_left_msecs = msecs % hour_msecs # 分鐘 minute = hour_left_msecs // minute_msecs # 如果不足10分鐘那在其前補0湊成兩位數格式 if minute < 10: minute = f"0{minute}" # 扣除分鐘後剩餘毫秒數 minute_left_msecs = hour_left_msecs % minute_msecs # 秒 second = minute_left_msecs // second_msecs # 如果秒數不足10秒,一樣在其前補0湊足兩位數格式 if second < 10: second = f"0{second}" # 扣除秒後剩餘毫秒數 second_left_msecs = minute_left_msecs % second_msecs # 如果不足10毫秒或100毫秒,在其前補0湊足三位數格式 if second_left_msecs < 10: second_left_msecs = f"00{second_left_msecs}" elif second_left_msecs < 100: second_left_msecs = f"0{second_left_msecs}" # 格式化成00:00:00,000形式,並返回 time_format = f"{hour}:{minute}:{second},{second_left_msecs}" return time_format # 此函數用於申請存取ai介面的access_token def get_access_token(self): # 此變數賦值成自己API Key的值 client_id = 'f3wT23Otc8jXlDZ4HGtS4jfT' # 此變數賦值成自己Secret Key的值 client_secret = 'YPPjW3E0VGPUOfZwhjNGVn7LTu3hwssj' auth_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret response_at = requests.get(auth_url) # 以json格式讀取響應結果 json_result = json.loads(response_at.text) # 獲取access_token access_token = json_result['access_token'] return access_token # 此函數用於將.speech-vad-demooutput_pcm下的單個檔案由語音轉成檔案 def transfer_voice_to_srt(self,access_token,filepath): # 百度語音識別介面 url_voice_ident = "http://vop.baidu.com/server_api" # 介面規範,以json格式post資料 headers = { 'Content-Type': 'application/json' } # 開啟pcm檔案並讀取檔案內容 pcm_obj = open(filepath,'rb') pcm_content_base64 = base64.b64encode(pcm_obj.read()) pcm_obj.close() # 獲取pcm檔案大小 pcm_content_len = os.path.getsize(filepath) # 介面規範,則體函義見官方檔案,值得注意的是cuid和speech兩個引數的寫法 post_data = { "format": "pcm", "rate": 16000, "dev_pid": 1737, "channel": 1, "token": access_token, "cuid": "1111111111", "len": pcm_content_len, "speech": pcm_content_base64.decode(), } proxies = { 'http':"127.0.0.1:8080" } # 呼叫介面,進行音文轉換 response = requests.post(url_voice_ident, headers=headers, data=json.dumps(post_data)) # response = requests.post(url_voice_ident,headers=headers,data=json.dumps(post_data),proxies=proxies) return response.text if __name__ == "__main__": # 範例化 baidu_voice_to_srt_obj = BaiduVoiceToTxt() # 自己要進行音文轉換的音視存放的資料夾 video_dir = ".\video\" all_video_file =[] all_file = os.listdir(video_dir) subtitle_format = "{\fscx75\fscy75}" # 只接受.mp3格式檔案。因為其他格式沒研究怎麼轉成pcm才是符合介面要求的 for filename in all_file: if ".mp3" in filename: all_video_file.append(filename) all_video_file.sort() i = 0 video_file_num = len(all_video_file) print(f"當前共有{video_file_num}個音訊檔需要轉換,即將進行處理請稍等...") # 此層for迴圈是逐個mp3檔案進行處理 for video_file_name in all_video_file: i += 1 print(f"當前轉換{video_file_name}({i}/{video_file_num})") # 將音視翻譯成的內容輸出到同目錄下同名.txt檔案中 video_file_srt_path = f".\video\{video_file_name[:-4]}.srt" # 以覆蓋形式開啟.txt檔案 video_file_srt_obj = open(video_file_srt_path,'w+') filepath = os.path.join(video_dir, video_file_name) # 呼叫change_file_format將mp3轉成pcm格式 baidu_voice_to_srt_obj.change_file_format(filepath) # 將轉換成的pcm檔案切割成多個小於60秒的pcm檔案 baidu_voice_to_srt_obj.devide_video() # 獲取token access_token = baidu_voice_to_srt_obj.get_access_token() # 獲取.speech-vad-demooutput_pcm目錄下的檔案列表 file_dir = baidu_voice_to_srt_obj.output_pcm_path all_pcm_file = os.listdir(file_dir) all_pcm_file.sort() j = 0 pcm_file_num = len(all_pcm_file) print(f"當前所轉檔案{video_file_name}({i}/{video_file_num})被切分成{pcm_file_num}塊,即將逐塊進行音文轉換請稍等...") # 此層for是將.speech-vad-demooutput_pcm目錄下的所有檔案逐個進行音文轉換 for filename in all_pcm_file: j += 1 filepath = os.path.join(file_dir, filename) if (os.path.isfile(filepath)): # 獲取檔名上的時間 time_str = filename[10:-6] time_str_dict = time_str.split("-") time_start_str = baidu_voice_to_srt_obj.format_time(int(time_str_dict[0])) time_end_str = baidu_voice_to_srt_obj.format_time(int(time_str_dict[1])) print(f"當前轉換{video_file_name}({i}/{video_file_num})-{time_start_str}-{time_end_str}({j}/{pcm_file_num})") response_text = baidu_voice_to_srt_obj.transfer_voice_to_srt(access_token, filepath) # 以json形式讀取返回結果 json_result = json.loads(response_text) # 將音文轉換結果寫入.srt檔案 video_file_srt_obj.writelines(f"{j}rn") video_file_srt_obj.writelines(f"{time_start_str} --> {time_end_str}rn") if json_result['err_no'] == 0: print(f"{time_start_str}-{time_end_str}({j}/{pcm_file_num})轉換成功:{json_result['result'][0]}") video_file_srt_obj.writelines(f"{subtitle_format}{json_result['result'][0]}rn") elif json_result['err_no'] == 3301: print(f"{time_start_str}-{time_end_str}({j}/{pcm_file_num})音訊質量過差無法識別") video_file_srt_obj.writelines(f"{subtitle_format}音訊質量過差無法識別rn") else: print(f"{time_start_str}-{time_end_str}({j}/{pcm_file_num})轉換過程遇到其他錯誤") video_file_srt_obj.writelines(f"{subtitle_format}轉換過程遇到其他錯誤rn") video_file_srt_obj.writelines(f"rn") video_file_srt_obj.close()
騰訊(收費的)
到此這篇關於Python語音識別API實現文字轉語音的幾種方法的文章就介紹到這了,更多相關Python 文字轉語音內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45