Επικολλήστε τη ροή, όχι τη σελίδα. Ο πραγματικός ήχος ενός σταθμού βρίσκεται σε διεύθυνση που καταλήγει σε .mp3, .aac ή .m3u8, και μόλις μια ζωντανή απομαγνητοφώνηση τη χρησιμοποιήσει, δεν χρειάζεται να ακούει κανείς.
Μια συντακτική ομάδα που παρακολουθεί τρεις ραδιοφωνικούς σταθμούς, δύο τηλεοπτικές ροές και μερικές ζωντανές μεταδόσεις στο YouTube έχει πρώτα πρόβλημα στελέχωσης και μετά πρόβλημα απομαγνητοφώνησης. Κάποιος πρέπει να ακούει, και κάποιος πρέπει να πατήσει την εγγραφή. Μια ζωντανή απομαγνητοφώνηση με ροή ως πηγή αναλαμβάνει και τα δύο: δώστε της τη διεύθυνση της ροής και ο διακομιστής την ανοίγει, την αποκωδικοποιεί και την απομαγνητοφωνεί καθώς μεταδίδεται, ώστε κανείς να μην χρειάζεται να κάθεται σε γραφείο όταν μια διάσκεψη Τύπου ξεκινά νωρίτερα. Το δύσκολο κομμάτι, όπως αποδεικνύεται, είναι να βρεθεί η διεύθυνση.
Μια ζωντανή απομαγνητοφώνηση μπορεί να παίρνει τον ήχο της από ροή που τραβά μόνος του ο διακομιστής: έναν ραδιοφωνικό σταθμό στο internet, μια λίστα αναπαραγωγής HLS (.m3u8), ένα manifest DASH (.mpd) ή ένα ζωντανό YouTube. Στο Dashboard, αυτό είναι μια νέα ζωντανή απομαγνητοφώνηση στο Transcriptions → New → Live, της οποίας η πηγή είναι μια ροή και όχι το μικρόφωνο. Η διεύθυνση ορίζεται τη στιγμή της δημιουργίας και δεν αλλάζει ποτέ, οπότε μια παρακολούθηση στήνεται μία φορά και ξεκινά όποτε ο σταθμός αξίζει να εγγραφεί.
Η διεύθυνση πρέπει να είναι η ίδια η ροή, όχι η ιστοσελίδα που την παίζει. Η σελίδα ενός σταθμού είναι HTML· ο ήχος που παίζει προέρχεται από αλλού, συνήθως από διακομιστή Icecast ή Shoutcast, και ο παίκτης της σελίδας βρίσκει αυτή τη διεύθυνση με JavaScript αφού φορτωθεί. Ψάξτε στον ιστότοπο για σύνδεσμο «Listen», «Direct stream» ή «Other players»: καταλήγει σε .mp3, .aac, .m3u, .m3u8 ή .pls. Ένα .pls ή .m3u επίσης δεν είναι ήχος. Είναι ένα σύντομο αρχείο κειμένου με λίγες γραμμές, καθεμία με τη διεύθυνση μιας ροής· υπάρχει για να μπορούν οι επιτραπέζιοι παίκτες να λαμβάνουν έναν μόνο σύνδεσμο, και το VocalStack απομαγνητοφωνεί τη ροή που ονομάζει. Αν επικολλήσετε τη σελίδα, το VocalStack ζητά τη σελίδα, βλέπει HTML στην απάντηση και σας το λέει. Κάθε σταθμός κρύβει τη ροή του με διαφορετικό τρόπο· τις περισσότερες φορές την κρύβει πίσω από ένα κουμπί με την ένδειξη «Listen», και αυτό είναι το μόνο πράγμα της σελίδας που δεν αξίζει να πατήσετε.
Δύο είδη συνδέσμων απορρίπτονται από την αρχή. Οι σύνδεσμοι σε σελίδες που παίζουν πολυμέσα, όπως Spotify, SoundCloud ή Twitch, απορρίπτονται πριν συνδεθεί οτιδήποτε. Οι ροές με προστασία πνευματικών δικαιωμάτων επίσης δεν υποστηρίζονται: μια λίστα αναπαραγωγής ή ένα manifest που χρειάζεται άδεια DRM αποτυγχάνει με μήνυμα που το λέει. Ορισμένες ροές απορρίπτουν επίσης αιτήματα από έξω από τη χώρα του σταθμού, οπότε μια διεύθυνση που παίζει στο γραφείο μπορεί να μην παίζει από διακομιστή στο εξωτερικό. Αν μια ροή παίζει σε πρόγραμμα περιήγησης αλλά όχι στο VocalStack, ο σταθμός αποκλείει άλλους παίκτες· ζητήστε από τον σταθμό μια διεύθυνση που επιτρέπεται να χρησιμοποιούν άλλες εφαρμογές. Τις περισσότερες φορές προσφέρουν ροή MP3, AAC ή HLS. Μόλις έχετε τη σωστή διεύθυνση, το επόμενο ερώτημα είναι αν τελειώνει ποτέ.
Μια ζωντανή ροή δεν τελειώνει ποτέ, άρα δεν είναι αρχείο. Η διάκριση έχει ιδιαίτερη σημασία για το YouTube. Μια ζωντανή μετάδοση στο YouTube που είναι στον αέρα ανήκει σε ζωντανή απομαγνητοφώνηση, και το Dashboard την ακολουθεί καθώς μεταδίδεται. Μια ζωντανή μετάδοση στο YouTube που έχει προγραμματιστεί αλλά δεν έχει ξεκινήσει εμφανίζεται ως Not live yet και μπορεί να εγγραφεί μόλις μπει στον αέρα. Ένα ολοκληρωμένο βίντεο είναι διαφορετικό πράγμα: έχει διάρκεια, οπότε απομαγνητοφωνείται ως αρχείο· επικολλήστε τον σύνδεσμο στο Transcriptions → New.
Η ίδια η λίστα αναπαραγωγής δείχνει ποιο είναι, και έτσι καταλαβαίνει οποιοσδήποτε παίκτης τη διαφορά. Μια ολοκληρωμένη λίστα HLS περιέχει την ετικέτα #EXT-X-ENDLIST ή #EXT-X-PLAYLIST-TYPE:VOD· μια ζωντανή δεν έχει καμία από τις δύο και συνεχίζει να μεγαλώνει, οπότε ο παίκτης την ξαναφορτώνει κάθε λίγα δευτερόλεπτα για νέα τμήματα. Ένα manifest DASH δηλώνει type="dynamic" όσο η μετάδοση είναι στον αέρα και type="static" μόλις γίνει εγγραφή. Ένα MP3 ή AAC από διακομιστή Icecast δεν έχει καθόλου διάρκεια· απλώς δεν σταματά ποτέ.
Από κώδικα, το GET /v1/transcriptions/probe?url= το διευκρινίζει πριν αποθηκευτεί οτιδήποτε. Το πεδίο kind της απάντησης είναι live για ζωντανό YouTube που είναι στον αέρα ή προγραμματισμένο, για ατέρμονη ροή HTTP, για λίστα HLS χωρίς τέλος ή για δυναμικό manifest DASH. Είναι file για ό,τι έχει τέλος, και unknown όταν το probe δεν μπορεί να το διακρίνει. Όταν ο σύνδεσμος δεν άνοιξε ως πολυμέσο, το ok είναι false και το problem είναι μια πρόταση που μπορείτε να δείξετε. Το probe δεν κρατά τίποτα και περιορίζεται σε 60 κλήσεις τον λεπτό.
Οι απομαγνητοφωνήσεις αρχείων τρέχουν πολλές φορές γρηγορότερα από την αναπαραγωγή του ήχου, οπότε μια ολοκληρωμένη ώρα τηλεόρασης δεν παίρνει μία ώρα. Μια ζωντανή ροή απομαγνητοφωνείται σε πραγματικό χρόνο, αλλά ο «πραγματικός χρόνος» ήδη τρέχει πίσω από τη μετάδοση, και αξίζει να ξέρετε κατά πόσο. Μια ροή Icecast φτάνει σε παίκτη λίγα δευτερόλεπτα μετά το μικρόφωνο. Τα HLS και DASH χωρίζονται σε τμήματα, και ένας παίκτης δεν ξεκινά μέχρι να κρατήσει δύο ή τρία τμήματα των περίπου έξι δευτερολέπτων το καθένα, οπότε μια ροή HLS είναι συνήθως 10 έως 30 δευτερόλεπτα πίσω από τη μετάδοση, πριν η απομαγνητοφώνηση προσθέσει τη δική της καθυστέρηση. Μια γραμμή που φαίνεται να φτάνει αργά οφείλεται συνήθως στην καθυστέρηση του σταθμού, όχι του απομαγνητοφωνητή. Μία ροή δημιουργεί μία εγγραφή· ένα γραφείο τρέχει πολλές, και όλες καταλήγουν στον ίδιο τόπο.
Κάθε ζωντανή απομαγνητοφώνηση καταλήγει στη βιβλιοθήκη Transcriptions, δίπλα σε κάθε αρχείο. Κάθε εγγραφή διατηρείται μαζί με την απομαγνητοφώνησή της, και μόλις οι λέξεις οριστικοποιηθούν γράφονται για αυτήν ένας τίτλος και μια σύνοψη, σε όλες τις γλώσσες. Η ομιλούμενη γλώσσα ανιχνεύεται αυτόματα, και οι ομιλητές μπορούν να αλλάξουν γλώσσα ανά πάσα στιγμή. Όπου γνωρίζετε τη γλώσσα, η ρητή ονομασία της βελτιώνει την ποιότητα της απομαγνητοφώνησης.
Η βιβλιοθήκη είναι αναζητήσιμη σε όλες τις γλώσσες: αναζητήστε σε κάθε απομαγνητοφώνηση, όποια και αν είναι η γλώσσα της, και πάρτε τα αποτελέσματα στη δική σας. Ένας συντάκτης που διαβάζει μόνο αγγλικά μπορεί να αναζητήσει στην πρωινή εκπομπή του ρουμανικού σταθμού το όνομα ενός υπουργού και να διαβάσει τα ευρήματα στα αγγλικά, με κάθε ένα να συνδέεται με την απομαγνητοφώνηση από την οποία προήλθε και με τον χρόνο που ειπώθηκε. Το όνομα του υπουργού θα γράφεται με τρεις τρόπους σε τρεις σταθμούς· η αναζήτηση με την αγγλική γραφή εξοικονομεί την ανάγνωση και των τριών.
Μια απομαγνητοφώνηση μπορεί να μεταφραστεί έως σε 10 γλώσσες ταυτόχρονα, ώστε η ίδια εγγραφή να διαβάζεται σε κάθε γλώσσα με την οποία δουλεύει το γραφείο. Ένα αποτέλεσμα αναζήτησης είναι χρήσιμο μόνο αν μπορείτε να το παραθέσετε.
Μια απομαγνητοφώνηση δεν είναι τοίχος από κείμενο. Το GET /v1/recordings/{id}/transcript του API επιστρέφει sentences, segments με χρονισμούς λέξεων και speakers, ώστε μια παράθεση να τοποθετείται στο δευτερόλεπτο πάνω στην εγγραφή. Το Dashboard αναπαράγει μια ζωντανή εγγραφή ακριβώς όπως έφτασε, με τον ήχο της, οπότε μια πρόταση μπορεί να ακουστεί πριν παρατεθεί.
Πριν εμπιστευτείτε οποιαδήποτε απομαγνητοφώνηση ραδιοφωνικού ήχου, από οποιοδήποτε σύστημα, αξίζει να ξέρετε δύο πράγματα. Η αναγνώριση ομιλίας σκοντάφτει περισσότερο σε κύρια ονόματα, τόπους και αριθμούς, δηλαδή ακριβώς σε αυτά που αναζητά ένας συντάκτης. Ένα όνομα που ο αναγνωριστής δεν έχει ξαναδεί βγαίνει ως η πλησιέστερη κοινή λέξη, και μια αναζήτηση με τη σωστή γραφή δεν το βρίσκει. Αναζητήστε αντί γι' αυτό μια χαρακτηριστική λέξη που ειπώθηκε στην ίδια ανάσα, και μετά διαβάστε γύρω από το εύρημα. Και το ραδιόφωνο δεν είναι μόνο ομιλία: μουσικά υπόστρωμα, τζίνγκλς και διαφημιστικά διαλείμματα παράγουν γραμμές που μοιάζουν με προτάσεις αλλά δεν είναι. Ελέγξτε τον ήχο πριν παραθέσετε.
Οι ετικέτες ομιλητών έχουν τρεις ρυθμίσεις: off, on ή When Needed, που εμφανίζει ετικέτες μόλις ακουστεί δεύτερος ομιλητής. Μπορείτε να ονομάσετε έναν ομιλητή σε μια εγγραφή (PUT /v1/recordings/{id}/speakers/{idx}), και μόλις η φωνή ενός ομιλητή καταχωρηθεί, οι μελλοντικές εγγραφές τον αναγνωρίζουν με το όνομά του. Για έναν σταθμό του οποίου οι παρουσιαστές επιστρέφουν κάθε πρωί, οι ετικέτες παύουν να είναι «Ομιλητής 2» μετά την πρώτη εβδομάδα. Μόλις ελεγχθεί η παράθεση, πρέπει να βγει από το κτίριο.
Κάθε μορφή στην καρτέλα Εξαγωγή μιας απομαγνητοφώνησης έχει ρόλο σε ένα γραφείο ειδήσεων. Το SRT πηγαίνει στον μοντέρ βίντεο, ώστε ένα απόσπασμα από τη ροή να έχει υπότιτλους· ένα μεταφρασμένο SRT τους έχει σε άλλη γλώσσα. Το Excel πηγαίνει στον ερευνητή, με μία γραμμή ανά πρόταση και τον χρόνο της, για φιλτράρισμα και σχολιασμό. Το PDF πηγαίνει στον συντάκτη που θέλει να διαβάσει όλη την ώρα στο τρένο. Το JSON πηγαίνει σε όποιον γράφει τα δικά του εργαλεία του γραφείου. Μέσω του API, η εξαγωγή είναι GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, με lang= για μεταφρασμένη έκδοση. Το Download audio δίνει την εγγραφή ως MP3 για το ίδιο το πακέτο.
Η παρακολούθηση μιας μετάδοσης για ρεπορτάζ είναι συνηθισμένη πρακτική στις ειδήσεις. Η αναδημοσίευση ενός αποσπάσματός της είναι άλλη πράξη. Διέπεται από τη δίκαιη χρήση (fair dealing ή fair use) εκεί όπου βρίσκεστε, και από τους δικούς της όρους του σταθμού, οπότε οι συνήθεις κανόνες του γραφείου για την παράθεση ανταγωνιστή ισχύουν και για τον ήχο του ανταγωνιστή. Όλα τα παραπάνω είναι λίγα κλικ στο Dashboard· για ένα γραφείο με είκοσι σταθμούς, καλύτερα είναι να γίνουν με script.
Όλη η διαδρομή βρίσκεται στο API, περιλαμβάνεται σε κάθε πρόγραμμα και χρεώνεται με το ίδιο ποσό με το Dashboard. Μια ζωντανή απομαγνητοφώνηση με πηγή ροή δημιουργείται αδρανής, ξεκινά με την πρώτη της εγγραφή και ελέγχεται μέσω HTTP. Επειδή ο διακομιστής τραβά τον ήχο, η έναρξη εγγραφής δεν επιστρέφει ροή για να τη στείλετε: δεν υπάρχει τίποτα από την πλευρά σας που στέλνει ήχο.
API=$VOCALSTACK_API_ORIGIN # the origin shown in the API reference
AUTH="Authorization: Bearer $VOCALSTACK_API_KEY"
# A live transcription whose source the server pulls itself.
TX=$(jq -n '{name: "Morning show", source: {kind: "stream", url: "https://example.org/live.mp3"},
settings: {speakerLabels: "auto"}}' \
| curl -sSf "$API/v1/transcriptions/live" -H "$AUTH" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" -d @- | jq -r .id)
# Start recording: the server opens the stream now.
REC=$(curl -sSf -X POST "$API/v1/transcriptions/$TX/recordings" -H "$AUTH" \
-H "Content-Type: application/json" -d '{}' | jq -r .recording.id)
# Later: pause, then stop (a live recording must be paused before it is stopped).
curl -sSf -X POST "$API/v1/recordings/$REC/pause" -H "$AUTH"
curl -sSf -X POST "$API/v1/recordings/$REC/stop" -H "$AUTH" -H "Content-Type: application/json" -d '{}'
# Search everything that was said, in English.
curl -sSfG "$API/v1/search" -H "$AUTH" --data-urlencode "q=budget" --data-urlencode "lang=en"
Το Idempotency-Key κάνει μια επαναλαμβανόμενη δημιουργία να επιστρέφει την πρώτη απομαγνητοφώνηση αντί για δεύτερη. Τα SDK για TypeScript και Python τυλίγουν τις ίδιες κλήσεις και κατεβάζονται από την περιοχή Developers· η αναφορά του API έχει κάθε διαδρομή και τα πλαίσιά της.
Ένας πράκτορας τεχνητής νοημοσύνης μπορεί να δουλεύει στη βιβλιοθήκη χωρίς καθόλου κώδικα. Ο διακομιστής MCP στο /v1/mcp δίνει στον πράκτορα ένα σύνολο εργαλείων· από αυτά, τέσσερα έχουν σημασία εδώ. Το search_transcriptions αναζητά ό,τι ειπώθηκε στις απομαγνητοφωνήσεις του λογαριασμού σε οποιαδήποτε γλώσσα και επιστρέφει τις αντίστοιχες γραμμές, με κάθε μία τη μεταγραφή στην οποία βρίσκεται και τον χρόνο που ειπώθηκε. Το get_summary επιστρέφει τη σύνοψη μιας εγγραφής. Τα transcribe_url και wait_for_transcription απομαγνητοφωνούν ένα ολοκληρωμένο βίντεο ή τον σύνδεσμο μιας εγγραφής και περιμένουν το αποτέλεσμα. Η έναρξη παρακολούθησης ζωντανής ροής μένει στο Dashboard ή στο API που περιγράφηκε πιο πάνω. Η ρύθμιση για το Claude Code, το Cursor ή οποιονδήποτε πελάτη Streamable HTTP βρίσκεται στο Developers → Connect an AI agent· το άρθρο για το MCP την περιγράφει βήμα βήμα. Πόσο κοστίζει να τρέχει το script είναι το τελευταίο ερώτημα.
Η ζωντανή απομαγνητοφώνηση κοστίζει $0.60 την ώρα ήχου, χρεώνεται ανά δευτερόλεπτο ($0.01 το λεπτό), με ελάχιστη διάρκεια 5 λεπτών ανά απομαγνητοφώνηση. Η ζωντανή κοστίζει περισσότερο από ένα αρχείο επειδή απομαγνητοφωνείται καθώς γίνεται, για όσο διαρκεί. Τα αρχεία κοστίζουν $0.20 την ώρα ($0.0033 το λεπτό· ένα αρχείο 30 λεπτών κοστίζει $0.10). Οι τιμές είναι ίδιες σε κάθε πρόγραμμα και μέσω API, και οι μεταφράσεις, οι συνόψεις, η ονομασία ομιλητών, η μετάδοση και η κοινοποίηση δεν προσθέτουν ποτέ κάτι στον λογαριασμό.
Ένας σταθμός που παρακολουθείται οκτώ ώρες την ημέρα, πέντε ημέρες την εβδομάδα, είναι 40 ζωντανές ώρες: $24 την εβδομάδα, όποιες γλώσσες και αν διαβάζει το γραφείο.
Τα όρια που έχουν σημασία για την παρακολούθηση διαφέρουν ανά πρόγραμμα. Καθένα αναγράφεται με τη σειρά Pay as you go, Premium, Enterprise:
Ένας νέος λογαριασμός ξεκινά με πίστωση εγγραφής $5 και χωρίς κάρτα, που αρκεί για περισσότερες από οκτώ ώρες ζωντανής παρακολούθησης για δοκιμή. Ο πλήρης πίνακας βρίσκεται στη σελίδα τιμολόγησης.