900 句英语
4、让电脑朗读识别出来的文字,达到复诵效果。唾手可得的数据是网上公开的英语900句,这个数据拿来训练语音字典和语义模型非常合适,词汇量、语义语序都很般配。折中办法是,朗读前把数字替换为英文单词。...
所有飞行员都应该熟悉 900 个英语句子。 不过,这篇文章不是关于飞行员如何掌握陆地和空中呼叫的英语,而是关于AI时代如何教他们的计算机在驾驶舱中理解ICAO英语。
基本工具
1.Python是一种简单的计算机编程语言。 上手需要半天在线英语语音朗读器,理解需要一天。 如果你还没学会,未来十年你可能会遇到聊天障碍。
2.ChatGPT,网上有很多小程序,大部分都可以直接使用。 CSDN提供的ChitGPT也有同样的效果。 最大的好处就是可以直接写出高质量的代码,效率提高了一百倍。
基本思想
1、打开电脑麦克风进行监听。 如果您听到有人说话,请将其记录下来。 说话后,将录音保存为wav文件;
2、识别wav文件的声音并转换为文本并显示;
3、使用900个公共英语句子训练数据,提高识别率;
4、让电脑大声朗读识别出的文字,达到重复的效果。
实施过程
第一步是监控
将你的想法写入ChatGPT在线英语语音朗读器,生成的代码如下:
import pyaudio
import wave
import audioop
import math
# 设定参数
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
MIN_VOLUME = 500
# 实例化pyaudio对象
p = pyaudio.PyAudio()
# 打开麦克风录音
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* 开始录音")
# 定义一个空的缓冲区
frames = []
# 是否正在录音标志位
recording = False
# 循环录音
while True:
# 读取音频数据
data = stream.read(CHUNK)
# 计算音量大小
rms = audioop.rms(data, 2)
volume = math.log10(rms) * 20
print(volume)
# 如果音量大于阈值,则认为开始录音
if volume > MIN_VOLUME:
recording = True
# 如果正在录音,则将音频数据存入缓冲区
if recording:
frames.append(data)
# 如果音量小于阈值,并且正在录音,则认为录音结束
if volume < MIN_VOLUME and recording:
recording = False
print("* 录音结束")
# 停止录音
stream.stop_stream()
stream.close()
p.terminate()
# 保存音频文件
wf = wave.open("output.wav", 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
print("* 音频文件已保存")
# 退出循环
break
print("* 程序结束")
阅读理解代码后,我知道AI试图通过音量来区分语音,通过比较安静时和说话时的分贝数来决定是否录音。 录制后,保存为output.wav 文件。
但运行后发现无法录制。 我检查了代码,发现阈值MIN_VOLUME设置得太高了。 一般VOLUME在55左右,说话的时候达到70-80。 说完又回到55左右英语培训,于是启动阈值改为65,结束阈值为65-10,测试通过,现在可以正常录音了。
这部分也可以按主题进行优化,由于不是本文的重点,所以这里不再赘述。
第二步鉴定
请 ChatGPT 编写代码将 wav 文件中的语音识别为文本。 结果如下:
import speech_recognition as sr
# 创建识别器实例
r = sr.Recognizer()
# 定义音频文件路径
audio_file = 'audio.wav'
# 使用WAV格式打开音频文件
with sr.AudioFile(audio_file) as source:
# 从音频文件中读取数据
audio_data = r.record(source)
# 调用谷歌语音识别API识别音频并返回文字结果
text = r.recognize_google(audio_data, language='en-US')
# 打印识别结果
print(text)
没想到这么短的代码就能完成语音识别。 但是把audio.wav替换成output.wav后,直接报错,说Google无法访问。 查阅ChatGPT得知,这段代码开头调用的speech_recognition模块支持多种在线API,也支持本地模块。 现阶段在座舱内上网肯定是困难的,所以需要更换为本地模块Sphinx。
安装好pocketsphinx模块后,将代码中的google替换为sphinx,再次运行,就会发现英语语音识别是可以的。
然而,这个识别结果却非常令人震惊。
原始音频文本:遵循标准错过进近程序,现在能见度已改善,预计雷达矢量将进行另一次进近,右转航向 090 已清除在线英语语音朗读器,可向左 ILS 跑道 18 进场
识别结果:摔死了,我卡在了右边,你的程序可见性至高无上,现在希望给他们回信,谈论罗恩·亨宁斯在他的右侧临床上的一英寸时间尿液英语,而在左侧临床上则是错误的。
当然,英语英语陆空通话和普通的英语交流是有一定区别的。 再加上各国口音、背景噪音等原因,我们不能对结果期望太高。 但如此离谱的挫折显然是不可接受的,必须有解决办法。
第三步:了解狮身人面像
刚才提到,本地识别需要加载sphinx模块,它的全称是CMU Sphinx,是卡内基梅隆大学(CMU)的一个开源项目。 那么我们来了解一下Sphinx是如何处理语音的:
1.声学模型:将wav文件切成小段,分析每段的声音数据,以及相关的特征,形成特征向量(向量是一长串数字,每个字符串长度相等,类似于烤肉串,串串)不同);
2. 语音词典:分析每个单词由哪些声学模型组成以及在不同情况下有哪些变化。 可以利用机器学习算法来学习一些复杂的函数来完成映射功能。
3、语义模型:上述案例失败的一个重要原因是陆空通话的词序与正常英语不同。 词的顺序有一定的规律性,可以理解为语义模型,可以通过训练大量的句子得到。
一旦了解了Sphinx900 句英语,你就会知道,通过用数据训练上述三个模型,可以提高识别率。
第四步在线英语语音朗读器,训练实践
触手可及的数据是互联网上发布的 900 个英语句子。 这个数据非常适合训练语音词典和语义模型。 词汇量大小和语义词序都很合适。
卡内基梅隆大学直接提供培训工具。 要求非常简单。 只要提供几千个句子样本,但标点符号必须去掉。 考虑到逗号和句号是语音中的断点,我们首先根据逗号和句号将所有句子处理成短句,然后去掉句尾的标点符号,顺便去掉句首的空格。 ChatGPT给出的代码:
with open('9001.txt', 'r') as file:
lines = file.readlines()
new_lines = []
for line in lines:
line = line.strip()
if line:
if line[0] == ' ':
line = line[1:]
if line[-1] in ['.', ',', ';', ':', '!', '?']:
line = line[:-1]
new_lines.append(line)
with open('9002.txt', 'w') as file:
file.write('\n'.join(new_lines))
没有错误,直接得到结果。
接下来是处理陆地和空中呼叫的独特性:
1. 对比发现,单字母(一般用于滑行道和交通号码)、双字母(如NDB导航台的两字母代码)、三字母(如VOR台的三字母代码,但不包括CAT)均使用航空字母。 发音,为了避免训练错误,全部替换为航空词汇,例如A替换为Alpha,B替换为Bravo,……;
2. 900个句子中出现的具体单词包括:VOR、DME、NDB、ILS、LDA、QNH、RVR、ADS-B、RNAV、FMS、IMC、VMC、RVSM、CPDLC、MEA、RNP、GPS、CDU、RA、 EGT、GPWS、APU、FOD、ETA、CPR、ATC、SID、VHF、HF、ELT、EGT、AC、DC,这些都使用字母原来的发音,所以全部插上,以免误认为是航空字母发音,如VOR应改为VOR;
3.对于三字母CAT和其他四字母组合、五字母组合,使用单词的发音,不要改变;
4、检测跑道XX R或L,将R替换为Right,L替换为Left,XX代表跑道方向的两位数;
5.根据语言习惯,需要将00英尺和000英尺替换为百英尺和千英尺。
6、将小数点全部替换为decimal,并清除QNH后面的小数点。
上述1、2、4、5、6可以通过ChatGPT处理,4、5、6也可以手动处理。
import re
# 逐行读取文本文件
with open('9004.txt', 'r') as file:
lines = file.readlines()
# 查找每行前后均为空格的大写字母组合
replace_dict = {'A': 'alpha ', 'B': 'bravo ', 'C': 'Charlie ','D': 'Delta ','E': 'Echo ','F':'Foxtrot ',
'G': 'Golf ','H': 'Hotel ','I': 'India ','J':'Juliet ','K': 'Kilo ','L': 'Lima ',
'M': 'Mike ','N': 'November ','O': 'Oscar ','P': 'Papa ','Q': 'Quebec ','R': 'Romeo ',
'S': 'Sierra ','T': 'Tango ','U': 'Uniform ','V': 'Victor ','W': 'Whiskey ','X': 'X-Ray ',
'Y': 'Yankee ','Z': 'Zulu '}
for i in range(len(lines)):
matches = re.findall(r'\s([A-Z]{1,3})\s', lines[i])
#print(matches)
while 'CAT' in matches:
matches.remove('CAT')
for match in matches:
#print(match)
replace_str = match
# 将 A 替换成 alpha,B 替换成 bravo,C 替换成 Charlie
for old, new in replace_dict.items():
replace_str = replace_str.replace(old, new)
# 替换本行中匹配项
lines[i] = lines[i].replace(match, replace_str)
# 将修改后的文本保存到 9006.txt
with open('9006.txt', 'w') as file:
for line in lines:
file.write(line)
至此,900个句子的预处理已经完成。 考虑到实际需要,将数字0-9和字母AZ的每一行填入文本文件中,然后从网上下载全球航空公司呼号列表,从中选择100个熟悉的,填入文本文件并去CMU的网站进行语义模型训练:
等待几分钟,训练完成,数据打包下载,解压后,提取两个文件xxxx.lm和xxxx.dic。 前者是语义模型,后者是语音词典。
这时,我们会对词典文件xxxx.dic进行微调,将3、4、5、9、千的特殊发音全部修正,使其更加严谨。
在此计算机上找到 pocketsphinx-data 文件夹。 里面有一个en-US文件夹,也就是说之前使用的US- 英语模型现在需要更换。 复制这个文件夹并重命名为 Aviation,并排存放,输入 Aviation,看到两个文件 language-model.lm.bin 和 pronounciation-dictionary.dict,将数据包中的 xxxx.lm 重命名为前者学英语,将 xxxx.dic 重命名为后者,然后覆盖这两个文件。
音标词典和语义模型已更换,请重试:
import speech_recognition as sr
# 创建识别器实例
r = sr.Recognizer()
# 定义音频文件路径
audio_file = 'output3.wav'
# 使用WAV格式打开音频文件
with sr.AudioFile(audio_file) as source:
# 从音频文件中读取数据
audio_data = r.record(source)
# 调用谷歌语音识别API识别音频并返回文字结果(sphinx为本地,google为API)
text = r.recognize_sphinx(audio_data, language="aviation")
# 打印识别结果print(text)
string_to_save = text
file_name = "outext.txt"
with open(file_name, "w") as f:
f.write(string_to_save)
print("已保存字符串到文件 {} 中。".format(file_name))找到一个开放空间的对话录音,最好不超过 900 个句子,然后尝试以下操作:
原始音频文本:遵循标准错过进近程序,现在能见度已改善,预计雷达矢量将进行另一次进近,右转航向 090 已清除,可向左 ILS 跑道 18 进场
识别结果: 遵循标准复飞程序 现在能见度得到改善 预计雷达矢量大约右转 右转 航向 0900 已清除,可进入 ILS 跑道 18 左转
可以说训练成功了,看起来可以用,但这就是老师的标准录音。 如果换成自己的声音或者女声,误差又会开始增大。 需要考虑进一步的培训,包括:
1.通过向ChatGPT请求从公开的《航空通信程序指南》获取更多的句子样本,然后重新训练语音词典和语义模型,识别效果将不断增强;
2、考虑到噪音、日韩口音、美国口音、法国口音、东南亚口音等因素,可能需要训练声学模型。 这需要大量的记录数据,不是一个人能够完成的。 它需要一个团队。 有能力、有兴趣的人都可以做。 私信。
步骤 5 重复
继续要求ChatGPT编写代码并大声朗读文本:
import pyttsx3
import os
# 安装pyttsx3:pip install pyttsx3
# 安装pywin32:pip install pypiwin32
# 设置朗读语音
engine = pyttsx3.init()
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id) # 选择第一个语音引擎
# 读取txt文件
filename = 'outext.txt' # 更改为你的txt文件名
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
# 朗读英文文本
engine.say(content)
engine.runAndWait()
else:
print('文件不存在!')朗读很容易实现。 目前的BUG是数字是用中文读出的。 你需要了解原因。 一个折衷方案是在大声朗读之前用英文单词替换数字。
后记
我做这个软件纯粹是因为我想了解在人工智能的支持下梦想是如何实现的,如果不专业的人做专业的事情会发生什么。
以目前的技术,可以利用海量的QAR数据来训练操作模型,利用大量的通话录音来训练对话模型。 根据“十四五”规划,民航将在2025年全面实现飞行中宽带互联,届时将出现能听懂指令、能熟练操作的人员。 ,可以自由说话的AI副驾驶不会是什么新鲜事。
由于开发过程使用了大量的开源代码,因此所有内容都可以在许可限制下共享和开发。 请不要尝试基于此开发商业版本。
了解更多民航知识,请输入以下链接:
猜你喜欢
发表评论
评论列表