asr.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import asyncio
  2. import json
  3. from typing import Optional, Any
  4. from sqlalchemy import select
  5. from app.config.config import settings
  6. from app.models.db import get_async_session
  7. from app.models.asr import AsrRecordStatus, AsrRecordTypes, AsrRecord, AsrRecordModel
  8. from app.errors.base import ParamsError
  9. from app.utils.common import uuid_generate
  10. from app.utils.httpbase import HttpBase
  11. class AsrRecordService:
  12. @staticmethod
  13. async def get_asr_record(record_id: int) -> Optional[AsrRecord]:
  14. async with get_async_session() as session:
  15. result = await session.execute(
  16. select(AsrRecord).where(AsrRecord.id == record_id)
  17. )
  18. return result.scalar_one_or_none()
  19. @staticmethod
  20. async def list_asr_records(page: int, page_size: int) -> Optional[AsrRecord]:
  21. async with get_async_session() as session:
  22. result = await session.execute(
  23. select(AsrRecord).offset((page - 1) * page_size).limit(page_size)
  24. )
  25. return result.scalars().all()
  26. @staticmethod
  27. async def create_offline_asr_record(asr_record: AsrRecordModel) -> Optional[AsrRecord]:
  28. async with get_async_session() as session:
  29. record = AsrRecord(
  30. id=await uuid_generate(),
  31. task_id=asr_record.task_id,
  32. meeting_id=asr_record.meeting_id,
  33. file_url=asr_record.file_url,
  34. type=AsrRecordTypes.OFFLINE,
  35. status=AsrRecordStatus.PROCESSING,
  36. )
  37. session.add(record)
  38. await session.commit()
  39. return record
  40. @staticmethod
  41. async def create_realtime_asr_record(asr_record: AsrRecordModel) -> Optional[AsrRecord]:
  42. async with get_async_session() as session:
  43. record = AsrRecord(
  44. task_id=asr_record.task_id,
  45. file_url=asr_record.file_url,
  46. type=AsrRecordTypes.REALTIME,
  47. status=AsrRecordStatus.PROCESSING,
  48. )
  49. session.add(record)
  50. await session.commit()
  51. return record
  52. @staticmethod
  53. async def update_asr_record(asr_record: AsrRecordModel) -> Optional[AsrRecord]:
  54. async with get_async_session() as session:
  55. if asr_record.id:
  56. result = await session.execute(
  57. select(AsrRecord).where(AsrRecord.id == asr_record.id)
  58. )
  59. record = result.scalar_one()
  60. elif asr_record.task_id:
  61. result = await session.execute(
  62. select(AsrRecord).where(AsrRecord.task_id == asr_record.task_id)
  63. )
  64. record = result.scalar_one_or_none()
  65. else:
  66. raise ParamsError(message="Either 'id' or 'task_id' must be provided to update the record.")
  67. if not record:
  68. raise ParamsError(message="Either 'id' or 'task_id' must be provided to update the record.")
  69. if asr_record.file_url:
  70. record.file_url = asr_record.file_url
  71. if asr_record.type:
  72. record.type = asr_record.type
  73. if asr_record.status:
  74. record.status = asr_record.status
  75. if asr_record.result_url:
  76. record.result_url = asr_record.result_url
  77. await session.commit()
  78. return record
  79. @staticmethod
  80. async def create_asr_task_async(asr_record: AsrRecordModel) -> Optional[Any]:
  81. url = f"http://{settings.meeting_file_base_url}/api/process_audio_async"
  82. try:
  83. res = await HttpBase.http_post(url, {"audio_url": asr_record.file_url, "hotwords": asr_record.hotwords}, {})
  84. print(res.status_code)
  85. print(res.text)
  86. if res and res.status_code == 200:
  87. return res.json()
  88. except Exception as e:
  89. print(e)
  90. return {}
  91. if __name__ =="__main__":
  92. async def a():
  93. res = await AsrRecordService.create_asr_task_async(AsrRecordModel(file_url="http://192.168.20.119:9000/aimeeting/e0df3b8befc342539257d5fa35d5b578.wav"))
  94. print(res)
  95. # print(res.status_code)
  96. # print(res.text)
  97. asyncio.run(a())