8.2. 获取 CEPD 音标
在 Github 上有一个开源的仓库,提供了《剑桥英语发声词典》的 json 格式数据库:
将这个仓库里的 cam_dict.refined.json 下载并保存到本地某个位置。
我写了一个 Alfred 的 workflow,使用的是 macOS 系统自带的 python3:/usr/bin/python3
,通过设定关键字启动一个 Python 脚本,查询某个单词(甚至整个句子)在《剑桥英语发声词典》(CEPD)中的音标。
下载这个文件之后,导入 Alfred。
在使用之前要注意:
- 修改各个 Python 脚本内的
cam_dict.refined.json
的文件路径。
这个 workflow 可用的启动关键字分别是:
cams
:查询音标(美式发音)camk
:查询音标(英式发音)camsd
:用浏览器打开 CEPD 真人示范录音(美式发音)在线网址camkd
:用浏览器打开 CEPD 真人示范录音(英式发音)在线网址camw
:用浏览器打开 CEPD 查询页面ipa
:返回 CMU(卡耐基梅隆大学)音标库中的音标
以下是查询音标的 workflow(启动关键字为 cams
)中的 python 脚本:
python
#
# NOTE: Python 2 is deprecated in macOS, and has been removed from macOS 12.3+
#
import sys
import json
# 假设你的 JSON 数据库是一个 JSON 文件,我们将从文件中加载数据
# 如果 JSON 数据在内存中或其他格式,你可能需要修改这部分代码
def load_json_database(file_path):
records = []
with open(file_path, 'r') as file:
for line in file:
try:
record = json.loads(line)
records.append(record)
except json.JSONDecodeError as e:
print(f"Error parsing JSON: {e}")
return records
# 在 JSON 数据库中检索 word
def search_in_json_database(database, search_word, region):
for record in database:
# 检查 word 字段是否匹配
if record.get('word') == search_word:
# 找到匹配项后,获取美式发音信息
pos_items = record.get('pos_items', [])
for pos_item in pos_items:
pronunciations = pos_item.get('pronunciations', [])
for pronunciation in pronunciations:
if pronunciation.get('region') == region:
# 找到美式发音,返回相关信息
return {
'pronunciation': pronunciation.get('pronunciation'),
'audio': pronunciation.get('audio')
}
# 如果没有找到匹配的 word 字段,返回 'not exist'
return 'not exist'
# cam_dict.refined.json 的文件路径
json_db_file_path = '/Users/joker/github/camdict/cam_dict.refined.json'
# 要检索的单词
search_word = sys.argv[1]
region = "us"
json_database = load_json_database(json_db_file_path)
# replace punctuations in text with space
punctuations = ",.?!;"
for p in punctuations:
search_word = search_word.replace(p, " ")
words = [word for word in search_word.split() if word.strip() != '']
phonetics = []
for w in words:
# 检索并获取结果
w = w.strip().lower()
if w[-1] in punctuations:
w = w.rstrip(",.?!;")
result = search_in_json_database(json_database, w, region)
if result == 'not exist':
phonetics.append(w+"*")
else:
phonetics.append(result['pronunciation'])
returnvalue = ''
for p in phonetics:
returnvalue += p + ' '
sys.stdout.write(returnvalue.strip())