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),99))
  31. x.start()
  32. return {'msg':'ok'}
  33. def makeAvatar(name_hash,avatar):
  34. call_anchor(name_hash,avatar)
  35. shutil.copy(dir_anchor+name_hash+".mp4",tool_dest+name_hash+'.mp4')
  36. notify_choozmo('avatar at www.choozmo.com:8168/tools/'+name_hash+'.mp4')
  37. os.remove(dir_sound+name_hash+".mp3")
  38. @router.post("/get_material/", tags=["tools"])
  39. async def get_material(text_in: text_in):
  40. x = threading.Thread(target=memberOfQueue, args=(text_in.text,text_in.lang,text_in.avatar))
  41. x.start()
  42. return {'msg':'Pleas wait'}
  43. def memberOfQueue(txt,lang,avatar):
  44. q.put(compose(txt,lang,avatar))
  45. def compose(txt,lang,avatar):
  46. name_hash = str(time.time()).replace('.','')
  47. makeMP3(name_hash,txt,lang)
  48. call_anchor(name_hash,avatar)
  49. shutil.copy(dir_sound+name_hash+".mp3",tool_dest+name_hash+'.mp3')
  50. shutil.copy(dir_anchor+name_hash+".mp4",tool_dest+name_hash+'.mp4')
  51. os.remove(dir_sound+name_hash+".mp3")
  52. os.remove(dir_anchor+name_hash+".mp4")
  53. notify_choozmo('sound at www.choozmo.com:8168/tools/'+name_hash+'.mp3')
  54. notify_choozmo('avatar at www.choozmo.com:8168/tools/'+name_hash+'.mp4')
  55. def makeMP3(name_hash,txt,lang):
  56. if lang==0:
  57. tts = gTTS(txt)
  58. tts.save(dir_sound+name_hash+"raw.mp3")
  59. else:
  60. tts = gTTS(txt,lang='zh-tw')
  61. tts.save(dir_sound+name_hash+"raw.mp3")
  62. #speed up
  63. ff = ffmpy.FFmpeg(inputs={dir_sound+name_hash+"raw.mp3": None}
  64. , outputs={dir_sound+name_hash+".mp3": ["-filter:a", "atempo=1.2"]})
  65. ff.run()
  66. os.remove(dir_sound+name_hash+"raw.mp3")
  67. def call_anchor(name_hash,avatar):
  68. conn = rpyc.classic.connect("192.168.1.111",18812)
  69. ros = conn.modules.os
  70. rsys = conn.modules.sys
  71. fr=open(dir_sound+name_hash+".mp3",'rb')# voice
  72. #warning!!! file my be replaced by other process
  73. fw=conn.builtins.open('/tmp/output.mp3','wb')
  74. while True:
  75. b=fr.read(1024)
  76. if b:
  77. fw.write(b)
  78. else:
  79. break
  80. fr.close()
  81. fw.close()
  82. val=random.randint(1000000,9999999)
  83. ros.chdir('/home/jared/to_video')
  84. ros.system('./p'+str(avatar)+'.sh '+str(val)+' &')
  85. while True:
  86. print('waiting...',val,',nh:',name_hash)
  87. if ros.path.exists('/tmp/results/'+str(val)):
  88. break
  89. time.sleep(5)
  90. fr=conn.builtins.open('/tmp/results/'+str(val)+'.mp4','rb')
  91. fw=open(dir_anchor+name_hash+".mp4",'wb')
  92. while True:
  93. b=fr.read(1024)
  94. if b:
  95. fw.write(b)
  96. else:
  97. break
  98. fr.close()
  99. fw.close()
  100. def notify_choozmo(msg):
  101. #'WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD' is ChoozmoTeam
  102. glist = ['WekCRfnAirSiSxALiD6gcm0B56EejsoK89zFbIaiZQD']
  103. for gid in glist:
  104. headers = {"Authorization": "Bearer " + gid,"Content-Type": "application/x-www-form-urlencoded"}
  105. r = requests.post("https://notify-api.line.me/api/notify",headers=headers, params={"message": msg})