toolAvatarVoiceOnly.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from fastapi import APIRouter
  2. from pydantic import BaseModel
  3. from gtts import gTTS
  4. import ffmpy
  5. import random
  6. from typing import Optional
  7. from fastapi.staticfiles import StaticFiles
  8. from fastapi import FastAPI,File,Request,Response,UploadFile
  9. import util,os, math, time
  10. from pydantic import BaseModel
  11. from fastapi.templating import Jinja2Templates
  12. import queue, shutil
  13. import threading
  14. import rpyc
  15. import requests
  16. q = queue.Queue()
  17. router = APIRouter()
  18. class text_in(BaseModel):
  19. text: str
  20. lang: int #0:eng 1:zh
  21. avatar: int
  22. dir_sound = ''
  23. dir_anchor = ''
  24. tool_dest = '/var/www/html/tools/'
  25. @router.post("/genAvatar_uploadmp3/", tags=["tools"])
  26. async def genAvatar_uploadmp3(file: UploadFile = File(...)):
  27. name_hash = str(time.time()).replace('.','')
  28. with open(dir_sound+name_hash+".mp3", "wb+") as file_object:
  29. file_object.write(file.file.read())
  30. x = threading.Thread(target=makeAvatar, args=(str(name_hash),17))
  31. x.start()
  32. return {'msg':'ok'}
  33. def makeAvatar(name_hash,avatar):
  34. call_anchor(name_hash,avatar)
  35. notify_choozmo('avatar at www.choozmo.com:8168/tools/'+name_hash+'.mp4')
  36. os.remove(dir_sound+name_hash+".mp3")
  37. @router.post("/get_material/", tags=["tools"])
  38. async def get_material(text_in: text_in):
  39. x = threading.Thread(target=memberOfQueue, args=(text_in.text,text_in.lang,text_in.avatar))
  40. x.start()
  41. return {'msg':'Pleas wait'}
  42. def memberOfQueue(txt,lang,avatar):
  43. q.put(compose(txt,lang,avatar))
  44. def compose(txt,lang,avatar):
  45. name_hash = str(time.time()).replace('.','')
  46. makeMP3(name_hash,txt,lang)
  47. call_anchor(name_hash,avatar)
  48. shutil.copy(dir_sound+name_hash+".mp3",tool_dest+name_hash+'.mp3')
  49. shutil.copy(dir_anchor+name_hash+".mp4",tool_dest+name_hash+'.mp4')
  50. os.remove(dir_sound+name_hash+".mp3")
  51. os.remove(dir_anchor+name_hash+".mp4")
  52. notify_choozmo('sound at www.choozmo.com:8168/tools/'+name_hash+'.mp3')
  53. notify_choozmo('avatar at www.choozmo.com:8168/tools/'+name_hash+'.mp4')
  54. def makeMP3(name_hash,txt,lang):
  55. if lang==0:
  56. tts = gTTS(txt)
  57. tts.save(dir_sound+name_hash+"raw.mp3")
  58. else:
  59. tts = gTTS(txt,lang='zh-tw')
  60. tts.save(dir_sound+name_hash+"raw.mp3")
  61. #speed up
  62. ff = ffmpy.FFmpeg(inputs={dir_sound+name_hash+"raw.mp3": None}
  63. , outputs={dir_sound+name_hash+".mp3": ["-filter:a", "atempo=1.2"]})
  64. ff.run()
  65. os.remove(dir_sound+name_hash+"raw.mp3")
  66. def call_anchor(name_hash,avatar):
  67. conn = rpyc.classic.connect("192.168.1.111",18812)
  68. ros = conn.modules.os
  69. rsys = conn.modules.sys
  70. fr=open(dir_sound+name_hash+".mp3",'rb')# voice
  71. #warning!!! file my be replaced by other process
  72. fw=conn.builtins.open('/tmp/output.mp3','wb')
  73. while True:
  74. b=fr.read(1024)
  75. if b:
  76. fw.write(b)
  77. else:
  78. break
  79. fr.close()
  80. fw.close()
  81. val=random.randint(1000000,9999999)
  82. ros.chdir('/home/jared/to_video')
  83. ros.system('./p'+str(avatar)+'.sh '+str(val)+' &')
  84. while True:
  85. print('waiting...',val,',nh:',name_hash)
  86. if ros.path.exists('/tmp/results/'+str(val)):
  87. break
  88. time.sleep(5)
  89. fr=conn.builtins.open('/tmp/results/'+str(val)+'.mp4','rb')
  90. fw=open(dir_anchor+name_hash+".mp4",'wb')
  91. while True:
  92. b=fr.read(1024)
  93. if b:
  94. fw.write(b)
  95. else:
  96. break
  97. fr.close()
  98. fw.close()
  99. def notify_choozmo(msg):
  100. #'WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD' is ChoozmoTeam
  101. glist = ['WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD']
  102. for gid in glist:
  103. headers = {"Authorization": "Bearer " + gid,"Content-Type": "application/x-www-form-urlencoded"}
  104. r = requests.post("https://notify-api.line.me/api/notify",headers=headers, params={"message": msg})