def func(参数1,参数2): # def 用来定义函数及函数名,参数1和参数2就是定义时的形参,也就是未来调用函数时必需要传入的参数 变量1 = 参数1+参数2 return 变量1
# *args 就是 将未定义且多余的 位置参数记录在内,偷偷的告诉你,args是个元祖,里面记录着你个函数传递的多余位置参数 # **kwargs 就是 将多余的关键字参数记录在内,kwargs 实际上是个dict哦,里面大概就是{"name":"python","age":1+1+1+1+1+1+18}
def args_func(a,b,*args): # args 里面保存着除了ab以外的全部多余参数 print(args) # 这回知道是元组了吧 for i in args: print(i) args_func(1,2,3,4,5,6) # 这里调用的时候1,2分别传递给a,b,那么3456就会保存在args里面哦
def kwargs_func(a, b, **kwargs): # kwargs 里面保存着除了ab以外其余关键字传入参的参数 print(kwargs) # 这回知道是字典了吧 for k, v in kwargs: print(k, v) kwargs_func(1, 2, c=3, d=4, e=5) # 这里调用的时候,12分别传递给a,b 那么c=3,d=4,e=5 就会保存在**kwargs里面哦
def args_kwargs_func(*args, **kwargs): # 这里必定要注意*args 要在 **kwargs以前 print(args) print(kwargs) args_kwargs_func(1, 2, a=1, b=2) # 12存入args a=1,b=2 存入kwargs,这里要注意的是关键字传参以后,不能够在位置传参了
两个栗子:python
2.1 列表推导式: mysql
li = [i for i in range(10)] # 简单的列表推导式,就是在列表内写一个for循环对吧 print(li) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] lis = [i for i in range(10) if i % 2 == 0] # 这是带if 条件的列表推导式 print(lis) # [0, 2, 4, 6, 8
2.2 生成器推导式:程序员
gener = (i for i in range(10)) # 简单的生成器推导式,就是在元组内写一个for循环对吧 print(gener) # <generator object <genexpr> at 0x04F9B3C0> geners = (i for i in range(10) if i % 2 == 0) # 这是带if 条件的生成器推导式 print(geners) # <generator object <genexpr> at 0x04F9B3F0>
从上述来看,列表推导式和生成器推导式只是[] 与 () 的区别算法
可是实际上,生成器推导式的效率很是高,但可控性不好,好比不直观,用一次就没了sql
相对而言列表推导式的效率比较低,可是可控性强,能够反复利用,并且数据显示很直观shell
字符串之json模块json
import json # 咱们作一个字典 dic = { "name": "Dragon", "age": 20, "hobby": ["摩托车", "骑车"], "other": { "say": "hello", "see": "beautiful girl", } } json_dic = json.dumps(dic) # json序列化 print(type(json_dic), json_dic) # <class 'str'> {"name": "Dragon", "age": 20, "hobby": ["\u6469\u6258\u8f66", "\u9a91\u8f66"], "other": {"say": "hello", "see": "beautiful girl"}} loads_dic = json.loads(json_dic) # json 反序列化 print(type(loads_dic), loads_dic) # <class 'dict'> {'name': 'Dragon', 'age': 20, 'hobby': ['摩托车', '骑车'], 'other': {'say': 'hello', 'see': 'beautiful girl'}}
os模块,集成了不少操做系统的方法,好比建立文件夹,拼接路径,删除文件,建立文件等等flask
import os os.path.join("a","b") # 组合路径 a/b os.system("ls") # 执行系统命令 os.sep() # 获取当前操做系统的路径分隔符 os.path.dirname(__file__) # 获取当前文件的所在目录
os补充:vim
import os os.getcwd() # 获取当前工做目录,即当前python脚本工做的目录路径 os.chdir("dirname") # 改变当前脚本工做目录;至关于shell下cd os.curdir() # 返回当前目录: ('.') os.pardir() # 获取当前目录的父目录字符串名:('..') os.makedirs('dir1/dir2') # 可生成多层递归目录 os.removedirs('dirname1') # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') # 生成单级目录;至关于shell中mkdir dirname os.rmdir('dirname') # 删除单级空目录,若目录不为空则没法删除,报错;至关于shell中rmdir dirname os.listdir('dirname') # 列出指定目录下的全部文件和子目录,包括隐藏文件,并以列表方式打印 os.remove("file_name") # 删除一个文件 os.rename("oldname", "new") # 重命名文件/目录 os.stat('path/filename') # 获取文件/目录信息 os.sep() # 操做系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep() # 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep() # 用于分割文件路径的字符串 os.name() # 字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") # 运行shell命令,直接显示 os.environ() # 获取系统环境变量 os.path.abspath(path) # 返回path规范化的绝对路径 os.path.split(path) # 将path分割成目录和文件名二元组返回 os.path.dirname(path) # 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) # 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) # 若是path存在,返回True;若是path不存在,返回False os.path.isabs(path) # 若是path是绝对路径,返回True os.path.isfile(path) # 若是path是一个存在的文件,返回True。不然返回False os.path.isdir(path) # 若是path是一个存在的目录,则返回True。不然返回False os.path.join(path1[, path2[, ...]]) # 将多个路径组合后返回,第一个绝对路径以前的参数将被忽略 os.path.getatime(path) # 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间
f = open("123.txt","rb") #打开文件句柄 print(f.read()) # 读取文件内容 f.close() # 关闭文件句柄
打开文件时,须要指定文件路径和以何等方式打开文件,打开后,便可获取该文件句柄,往后经过此文件句柄对该文件操做。windows
打开文件的模式有:
"+" 表示能够同时读写某个文件
"b"表示以字节的方式操做
注:以b方式打开时,读取到的内容是字节类型,写入时也须要提供字节类型
# 文件上下文操做 with open("123.txt","rb") as f: # 文件句柄f 自动打开关闭文件句柄 f.read() # 读取文件内容(所有) with open("123.txt","rb") as f: f.read() #读取文件内容(所有) f.readline() # 读取文件中一行文件 f.readlines() # 读取文件中全部行 ["1","2"] f.write("666") # 写入文件内容 f.writelines("666") # 写入一行文件 f.flush()# 刷新文件 f.seek(10) # 移动光标到10位置 f.truncate(6) # 从光标当前位置截取6位 f.tell() # 获取当前光标位置
预备环境: 1.FFmpeg: 连接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w6hk 2.baidu-aip: pip install baidu-aip
此篇是人工智能应用的重点,只用现成的技术不作底层算法,也是让初级程序员快速进入人工智能行业的捷径
目前失眠上主流的AI技术提供公司有不少,BAT和只能问答的图灵机器人等,另外提一点:主作语音的科大讯飞是佼佼者但它是有偿使用
这里咱们采用百度的彻底免费接口
开启人工智能技术的大门 : http://ai.baidu.com/
首先进入控制台,注册一个百度的帐号(百度帐号通用)
开通一下咱们百度AI开放平台的受权
而后找到已开通服务中的百度语音
这里省去自行建立应用过程
进入管理应用,牢记下述3个值,后面实例接口时会用上
首先我们要 pip install baidu-aip 安装一个百度人工智能开放平台的Python SDK实在是太方便了,这也是为何咱们选择百度人工智能的最大缘由
在工程目录下,就能够看到s1.mp3这个文件了,可用播放器试听效果
上面我们测试了一个语音合成的例子,那么就从语音合成开始入手
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/25 18:28 # @Author : MJay_Lee # @File : ai.py # @Contact : limengjiejj@hotmail.com from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11721488' API_KEY = 'RSs9MrcwhhdndG6vLHN9Q9dC' SECRET_KEY = 'RpQwPMiPUYXYNOFb0bmFIHORNj4t6Nb0' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) res = client.synthesis( "智能语音的第一个示例", # text,合成的文本,使用UTF-8编码,请注意文本长度必须小于1024字节 "zh", # lang,语言,中文:zh 英文:en 1, # ctp,客户端信息这里就写1 { # 这是一个dict类型的参数,里面的kv是关键,以下: "vol":5, # 合成音频文件的准音量 "spd":4, # 语速,0~9,默认为5,中语速 "pit":8, # 语调音调,0~9,默认为5,中语调 "per":4, # 发音人选择,0为女声,1为1男声,3为度逍遥,4为度丫丫,默认为普通女声 } ) if not isinstance(res,dict): with open("audio.mp3","wb")as f: f.write(res) else: print(res) ''' # 错误返回示例: { 'err_detail': 'Params error.', 'err_msg': 'parameter error.', 'err_no': 501, 'err_subcode': 29, 'tts_logid': 3204603220 } '''
技术上,代码上的任何疑虑均可以从官方文档中获得答案
baidu-aip Python SDK 语音合成技术文档 : https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top
刚才咱们作了一个语音合成的例子,借此可继续展开说明
这里与百度进行一次加密校验,认证你是合法用户,合法的应用
AipSpeech 是百度语音的客户端,认证成功以后,客户端都将被开启,这里的client就是已经开启的百度语音的客户端
res就是我们音频文件的byte流
若是失败,res就会是个字典,如上图的 #错误返回示例。
用百度语音客户端中的synthesis方法,并提供相关参数
成功能够获得音频文件,失败则返回一段错误信息
重点看一下 synthesis 这个方法 , 从 https://ai.baidu.com/docs#/TTS-Online-Python-SDK/top 来得到答案吧
从参数入手分析:
至此,人工只能中的语音合成技术点到为止了。
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/25 18:28 # @Author : MJay_Lee # @File : ai.py # @Contact : limengjiejj@hotmail.com from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11721488' API_KEY = 'RSs9MrcwhhdndG6vLHN9Q9dC' SECRET_KEY = 'RpQwPMiPUYXYNOFb0bmFIHORNj4t6Nb0' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 读取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 识别本地文件 res = client.asr(get_file_content('audio.pcm'), 'pcm', 16000, { 'dev_pid': 1536, }) print(res) ''' # res内容 { 'corpus_no': '6594294686519761176', 'err_msg': 'success.', 'err_no': 0, 'result': ['陈杰陈杰你好'], 'sn': '995932809701535353876' } '''
声音这个东西格式太多样化了,若是要想让百度的SDK识别我们的音频文件,就要想办法转变成百度SDK能够识别的格式PCM
已知能够实现自动化转换格式而且屡试不爽的工具 : FFmpeg
FFmpeg 环境变量配置:
首先你要解压缩,而后找到bin目录,
个人目录是 C:\my_AI\ai_voice\ffmpeg-20180619-a990184-win64-shared\bin
以window10为例,配置环境变量
尝试一下是否配置成功
看到这个界面就算配置成功了
ffmpeg 这个工具能够将wav wma MP3 等音频文件转换为pcm无压缩音频文件,测试过程以下:
# 作一个测试,首先要打开windows的录音机,录制一段音频(说普通话) # 如今假设录制的音频文件的名字为 audio.wav 放置在 c:\myaudio\ # 而后咱们用命令行对这个 audio.wav 进行pcm格式的转换而后获得 audio.pcm # 命令是 : ffmpeg -y -i audio.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 audio.pcm
在录音文件所在目录下,执行上述命令,而后打开目录,就能够看到pcm文件了
好了,换个环境
以mac为例,配置环境变量
自行安装brew,而后导入ffmpeg
brew install ffmpeg
切换root用户
su root
成功切换至root用户后,添加ffmpeg至环境变量
vim /etc/profile # 进入profile文件,将ffmpeg绝对路径添加至export中,以下: export "PATH=/usr/local/mysql/bin:/anaconda3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/tools/unrar:/usr/local/Cellar/ffmpeg/4.0.2/bin/ffmpeg"
最后重启服务便可
source /etc/profile
接下来步骤同windows同样,找到目标文件,执行事先制定好的pcm文件命令便可获得咱们须要的pcm文件
那么, pcm文件已经获得了,进入正题
百度语音识别SDK的应用:
asr函数须要四个参数,第四个参数能够忽略,自有默认值,参照一下这些参数是作什么的
# 第一个参数: speech 音频文件流 创建包含语音内容的Buffer对象, 语音文件的格式,pcm 或者 wav 或者 amr。(虽然说支持这么多格式,可是只有pcm的支持是最好的) # 第二个参数: format 文件的格式,包括pcm(不压缩)、wav、amr (虽然说支持这么多格式,可是只有pcm的支持是最好的) # 第三个参数: rate 音频文件采样率 若是使用刚刚的FFmpeg的命令转换的,你的pcm文件就是16000 # 第四个参数: dev_pid 音频文件语言id 默认1537(普通话 输入法模型)
最后再看看返回结果:
成功的dict中 result 就是咱们要的识别文本
失败的dict中 err_no 就是咱们要的错误编码,错误编码表明什么呢?
若是err_no不是0的话,就参照一下错误码表
到此百度AI语音部分的调用就结束了。
补充:mac环境中,自动执行mp3文件,要改用指令:os.system("open xueshuohua.mp3")
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/27 15:31 # @Author : MJay_Lee # @File : ai_xueshuohua.py # @Contact : limengjiejj@hotmail.com import os from aip import AipSpeech """ 你的 APPID AK SK """ APP_ID = '11721488' API_KEY = 'RSs9MrcwhhdndG6vLHN9Q9dC' SECRET_KEY = 'RpQwPMiPUYXYNOFb0bmFIHORNj4t6Nb0' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 自动化交互将本身说的音频内容转换为pcm文件 file_name = "audio" cmd_str = f"ffmpeg -y -i {file_name}.m4a -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {file_name}.pcm" os.system(cmd_str) # 读取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 识别本地文件 res = client.asr(get_file_content('audio.pcm'), 'pcm', 16000, { 'dev_pid': 1536, }) # 提取本身说的内容 text = res['result'][0] # 合成ai的音频文件对象 speech = client.synthesis(text,'zh',1,{ 'spd': 4, 'vol': 8, 'pit': 8, 'per': 4 }) # 建立ai的音频文件 with open("xueshuohua.mp3","wb") as f: f.write(speech) os.system("xueshuohua.mp3")
Python 很强大其缘由就是由于它庞大的三方库 , 资源是很是的丰富 , 固然也不会缺乏关于音频的库
关于音频, PyAudio 这个库, 能够实现开启麦克风录音, 能够播放音频文件等等,此刻咱们不去了解其余的功能,只了解一下它如何实现录音的
首先
pip install pyaudio
(补充flask理论先)