feat: 新增语音文件处理功能

This commit is contained in:
qinyong@9artedu.com 2026-06-26 13:43:35 +08:00
parent 699aea73a6
commit fe68f2761a
3 changed files with 64 additions and 2 deletions

View File

@ -117,10 +117,18 @@ class ASRVoiceProcessor:
await redis_client_manager.close() await redis_client_manager.close()
import argparse
async def main(): async def main():
# parser = argparse.ArgumentParser(description='ASR语音文件处理')
# parser.add_argument('--batch-size', type=int, default=10, help='每批处理数量')
# parser.add_argument('--max-records', type=int, default=None, help='最大处理记录数,默认处理所有')
# args = parser.parse_args()
processor = ASRVoiceProcessor() processor = ASRVoiceProcessor()
try: try:
await processor.process_voice_files(batch_size=10, max_records=10000) await processor.process_voice_files(batch_size=10, max_records=0)
finally: finally:
await processor.close() await processor.close()

View File

@ -0,0 +1,50 @@
import json
from datetime import datetime
from sqlalchemy import BigInteger, String, Text, Integer, TIMESTAMP, UniqueConstraint, Index
from sqlalchemy.orm import mapped_column
from app.models.mysql.archive_messages import Base
class ArchiveMediaFiles(Base):
__tablename__ = 'archive_media_files'
__table_args__ = {
'comment': '企微会话存档媒体文件表',
'mysql_charset': 'utf8mb4',
'mysql_collate': 'utf8mb4_unicode_ci'
}
id = mapped_column(BigInteger, primary_key=True, autoincrement=True, comment='自增主键')
msg_id = mapped_column(String(255), nullable=False, comment='企微消息 msgid')
archive_message_id = mapped_column(BigInteger, nullable=False, comment='archive_messages.id')
sdkfileid = mapped_column(Text, nullable=True, comment='企微媒体文件 sdkfileid')
cos_url = mapped_column(String(1024), nullable=False, comment='COS 文件访问 URL')
file_size = mapped_column(BigInteger, default=0, comment='文件大小(字节)')
file_type = mapped_column(String(32), nullable=True, comment='文件类型image/voice/video/file')
status = mapped_column(Integer, default=1, comment='状态1-有效 0-无效')
created_at = mapped_column(TIMESTAMP, nullable=False, default=datetime.now, comment='创建时间')
updated_at = mapped_column(TIMESTAMP, nullable=False, default=datetime.now, onupdate=datetime.now, comment='更新时间')
__table_args__ = (
UniqueConstraint('archive_message_id', name='uk_archive_msg_id'),
UniqueConstraint('msg_id', name='uk_msg_id'),
Index('idx_status', 'status'),
)
def to_dict(self):
return {
'id': self.id,
'msg_id': self.msg_id,
'archive_message_id': self.archive_message_id,
'sdkfileid': self.sdkfileid,
'cos_url': self.cos_url,
'file_size': self.file_size,
'file_type': self.file_type,
'status': self.status,
'created_at': self.created_at.isoformat() if self.created_at else None,
'updated_at': self.updated_at.isoformat() if self.updated_at else None
}
def __repr__(self):
return json.dumps(self.to_dict())

View File

@ -42,12 +42,13 @@ class ArchiveMediaFilesRepository:
result = await self.session.execute(query) result = await self.session.execute(query)
return result.scalar() or 0 return result.scalar() or 0
async def get_by_archive_message_id(self, archive_message_id: int) -> Optional[ArchiveMediaFiles]: async def get_by_archive_message_id(self, archive_message_id: int, file_type: str = "voice") -> Optional[ArchiveMediaFiles]:
""" """
根据 archive_message_id 查询媒体文件 根据 archive_message_id 查询媒体文件
Args: Args:
archive_message_id: 归档消息ID archive_message_id: 归档消息ID
file_type: 文件类型过滤默认 voice
Returns: Returns:
ArchiveMediaFiles 对象或 None ArchiveMediaFiles 对象或 None
@ -56,5 +57,8 @@ class ArchiveMediaFilesRepository:
ArchiveMediaFiles.archive_message_id == archive_message_id ArchiveMediaFiles.archive_message_id == archive_message_id
) )
if file_type:
query = query.where(ArchiveMediaFiles.file_type == file_type)
result = await self.session.execute(query) result = await self.session.execute(query)
return result.scalar_one_or_none() return result.scalar_one_or_none()