197 lines
6.2 KiB
Python
197 lines
6.2 KiB
Python
import json
|
||
from typing import List, Dict, Any
|
||
import asyncio
|
||
|
||
from dashscope.audio.asr import VocabularyService
|
||
|
||
|
||
|
||
class AliyunHotwordManager:
|
||
"""阿里云热词管理类"""
|
||
|
||
def __init__(self, api_key: str = None):
|
||
"""初始化热词管理器
|
||
|
||
Args:
|
||
api_key: 阿里云API密钥。如不提供,将尝试从环境变量或配置中获取
|
||
"""
|
||
self.api_key = "sk-7a50eca6856d4afb968ac3bf512f6d1b"
|
||
self._service = VocabularyService(api_key=self.api_key)
|
||
self.default_prefix = "talkingq"
|
||
self.default_model = "gummy-chat-v1" # 默认使用gummy-chat-v1模型
|
||
self._default_vocabulary_id = None
|
||
|
||
async def create_vocabulary(self,
|
||
hotwords: List[Dict[str, Any]],
|
||
prefix: str = None,
|
||
model: str = None) -> str:
|
||
"""创建热词表
|
||
|
||
Args:
|
||
hotwords: 热词列表,每个热词是一个字典,包含text、lang等字段
|
||
prefix: 热词表前缀,默认使用self.default_prefix
|
||
model: 目标模型,默认使用self.default_model
|
||
|
||
Returns:
|
||
热词表ID
|
||
"""
|
||
prefix = prefix or self.default_prefix
|
||
model = model or self.default_model
|
||
|
||
loop = asyncio.get_event_loop()
|
||
vocabulary_id = await loop.run_in_executor(
|
||
None,
|
||
lambda: self._service.create_vocabulary(
|
||
target_model=model,
|
||
prefix=prefix,
|
||
vocabulary=hotwords
|
||
)
|
||
)
|
||
|
||
|
||
|
||
return vocabulary_id
|
||
|
||
async def list_vocabularies(self, prefix: str = None,
|
||
page_index: int = 0,
|
||
page_size: int = 10) -> List[Dict]:
|
||
"""查询所有热词表
|
||
|
||
Args:
|
||
prefix: 热词表前缀,如果设置则只返回该前缀的热词表
|
||
page_index: 页码索引
|
||
page_size: 每页大小
|
||
|
||
Returns:
|
||
热词表列表
|
||
"""
|
||
loop = asyncio.get_event_loop()
|
||
result = await loop.run_in_executor(
|
||
None,
|
||
lambda: self._service.list_vocabularies(
|
||
prefix=prefix,
|
||
page_index=page_index,
|
||
page_size=page_size
|
||
)
|
||
)
|
||
|
||
return result
|
||
|
||
async def query_vocabulary(self, vocabulary_id: str) -> Dict[str, Any]:
|
||
"""查询指定热词表内容
|
||
|
||
Args:
|
||
vocabulary_id: 热词表ID
|
||
|
||
Returns:
|
||
热词表内容
|
||
"""
|
||
loop = asyncio.get_event_loop()
|
||
result = await loop.run_in_executor(
|
||
None,
|
||
lambda: self._service.query_vocabulary(vocabulary_id)
|
||
)
|
||
|
||
return result
|
||
|
||
async def update_vocabulary(self, vocabulary_id: str,
|
||
hotwords: List[Dict[str, Any]]) -> None:
|
||
"""更新热词表
|
||
|
||
Args:
|
||
vocabulary_id: 要更新的热词表ID
|
||
hotwords: 新的热词列表
|
||
"""
|
||
loop = asyncio.get_event_loop()
|
||
await loop.run_in_executor(
|
||
None,
|
||
lambda: self._service.update_vocabulary(
|
||
vocabulary_id=vocabulary_id,
|
||
vocabulary=hotwords
|
||
)
|
||
)
|
||
|
||
|
||
|
||
async def delete_vocabulary(self, vocabulary_id: str) -> None:
|
||
"""删除热词表
|
||
|
||
Args:
|
||
vocabulary_id: 要删除的热词表ID
|
||
"""
|
||
loop = asyncio.get_event_loop()
|
||
await loop.run_in_executor(
|
||
None,
|
||
lambda: self._service.delete_vocabulary(vocabulary_id)
|
||
)
|
||
|
||
|
||
async def get_or_create_default_vocabulary(self) -> str:
|
||
"""获取或创建默认热词表
|
||
|
||
如果已经有默认热词表ID,直接返回;否则创建一个新的热词表
|
||
|
||
Returns:
|
||
热词表ID
|
||
"""
|
||
if self._default_vocabulary_id:
|
||
return self._default_vocabulary_id
|
||
|
||
vocabularies = await self.list_vocabularies(prefix=self.default_prefix)
|
||
|
||
if vocabularies and len(vocabularies) > 0:
|
||
self._default_vocabulary_id = vocabularies[0].get('vocabulary_id')
|
||
return self._default_vocabulary_id
|
||
|
||
default_hotwords = [
|
||
{"text": "变成", "weight": 4, "lang": "zh"},
|
||
|
||
]
|
||
|
||
vocabulary_id = await self.create_vocabulary(default_hotwords)
|
||
self._default_vocabulary_id = vocabulary_id
|
||
|
||
return vocabulary_id
|
||
|
||
async def add_hotwords_to_vocabulary(self, vocabulary_id: str,
|
||
new_hotwords: List[Dict[str, Any]]) -> None:
|
||
"""向现有热词表添加新热词
|
||
|
||
Args:
|
||
vocabulary_id: 热词表ID
|
||
new_hotwords: 要添加的新热词列表
|
||
"""
|
||
current_vocab = await self.query_vocabulary(vocabulary_id)
|
||
current_hotwords = current_vocab.get('vocabulary', [])
|
||
|
||
updated_hotwords = current_hotwords + new_hotwords
|
||
|
||
await self.update_vocabulary(vocabulary_id, updated_hotwords)
|
||
print(f"成功添加 {len(new_hotwords)} 个热词到热词表 {vocabulary_id}")
|
||
|
||
|
||
hotword_manager = AliyunHotwordManager()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import asyncio
|
||
|
||
async def main():
|
||
vocabulary_id = await hotword_manager.get_or_create_default_vocabulary()
|
||
print(f"默认热词表ID: {vocabulary_id}")
|
||
|
||
vocabulary = await hotword_manager.query_vocabulary(vocabulary_id)
|
||
print(f"更新前热词表内容: {json.dumps(vocabulary, ensure_ascii=False, indent=2)}")
|
||
|
||
new_hotwords = [
|
||
{"text": "豚豚崽", "weight": 4, "lang": "zh"},
|
||
{"text": "Tuntunzai", "weight": 4, "lang": "en"}
|
||
]
|
||
|
||
await hotword_manager.add_hotwords_to_vocabulary(vocabulary_id, new_hotwords)
|
||
|
||
updated_vocabulary = await hotword_manager.query_vocabulary(vocabulary_id)
|
||
print(f"更新后热词表内容: {json.dumps(updated_vocabulary, ensure_ascii=False, indent=2)}")
|
||
|
||
asyncio.run(main())
|