1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
#!/usr/bin/env python
import os
import sys
import random
import tempfile
import requests
sys.path.insert(0, os.path.abspath('.'))
import CloudFlare
use_find = False
def user_agent():
s = random.choice([
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36 Edg/91.0.864.48',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36',
])
return s
def doit(account_name, audio_data):
# We set the timeout because these AI calls take longer than normal API calls
cf = CloudFlare.CloudFlare(global_request_timeout=120)
try:
if account_name is None or account_name == '':
params = {'per_page': 1}
else:
params = {'name': account_name, 'per_page': 1}
accounts = cf.accounts.get(params=params)
except CloudFlare.exceptions.CloudFlareAPIError as e:
exit('/accounts %d %s - api call failed' % (e, e))
try:
account_id = accounts[0]['id']
except IndexError:
exit('%s: account name not found' % (account_name))
try:
if use_find:
# you can use this format:
r = cf.find('/accounts/:id/ai/run/@cf/openai/whisper').post(account_id, data=audio_data)
else:
# or you can use this format:
# @'s are replaced by at_ so .../@cf/... becomes .../at_cf/...
r = cf.accounts.ai.run.at_cf.openai.whisper.post(account_id, data=audio_data)
except CloudFlare.exceptions.CloudFlareAPIError as e:
exit('/ai.run %d %s - api call failed' % (e, e))
print('%s' % (r['text']))
# words = [word['word'] for word in r['words']]
# print('%s' % ('|'.join(words)))
# based on ... thank you to the author
# https://stackoverflow.com/questions/16694907/download-large-file-in-python-with-requests
def download_audio_file(url, referer, n_requested):
headers = {}
headers['Referer'] = referer
headers['User-Agent'] = user_agent()
# will be deleted once program exits
fp = tempfile.TemporaryFile(mode='w+b')
n_received = 0
# NOTE the stream=True parameter below
with requests.get(url, headers=headers, stream=True) as r:
r.raise_for_status()
for chunk in r.iter_content(chunk_size=16*1024):
fp.write(chunk)
n_received += len(chunk)
if n_received > n_requested:
break
# rewind the file so it's ready to read
fp.seek(0)
return fp
def default_audio_clip():
s = random.choice([
(
'https://www.americanrhetoric.com/mp3clipsXE/barackobama/barackobamapresidentialfarewellARXE.mp3',
'https://www.americanrhetoric.com/barackobamaspeeches.htm'
),
(
'https://archive.org/download/DoNotGoGentleIntoThatGoodNight/gentle.ogg',
'https://archive.org/details/DoNotGoGentleIntoThatGoodNight'
),
(
'https://www.nasa.gov/wp-content/uploads/2015/01/590333main_ringtone_eagleHasLanded_extended.mp3',
'https://www.nasa.gov/audio-and-ringtones/'
),
(
'https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3',
'https://www.nasa.gov/audio-and-ringtones/'
),
(
'https://upload.wikimedia.org/wikipedia/en/7/7f/George_Bush_1988_No_New_Taxes.ogg',
'https://en.wikipedia.org/wiki/File:George_Bush_1988_No_New_Taxes.ogg'
),
(
'https://archive.org/download/grand_meaulnes_2004_librivox/grandmeaulnes_01_alainfournier.mp3',
'https://archive.org/details/grand_meaulnes_2004_librivox/grandmeaulnes_01_alainfournier_128kb.mp3'
),
])
return s
def main():
if len(sys.argv) > 1 and sys.argv[1] == '-a':
del sys.argv[1]
account_name = sys.argv[1]
del sys.argv[1]
else:
account_name = None
if len(sys.argv) > 1:
url = sys.argv[1]
referer = url
else:
url, referer = default_audio_clip()
# we only grab the first 680KB of the file - that's enough to show working code
audio_fp = download_audio_file(url, referer, 680 * 1024)
audio_data = audio_fp.read()
print('%s: length=%d' % (url.split('/')[-1:][0], len(audio_data)))
doit(account_name, audio_data)
if __name__ == '__main__':
main()
|