Pojďme programovat elektroniku

Hrajeme si s OpenAI. Umělá inteligence nám přepíše MP3 na text a vytvoří titulky

  • Hrajeme si s aplikačním rozhraním OpenAI pro vývojáře
  • Zkusíme AI model whisper-1 pro převod hlasu na text
  • Otestujeme, jak si poradí s úryvkem pohádky

Nedávno jsme ukázali, že prototyp jednoduchého hlasového asistenta napojeného na Wikipedii a umělou inteligenci zbastlí v HTML i naprostý zelenáč. Všechno za nás totiž udělalo OpenAI API a pár řádků v Javascriptu.

V experimentování budeme pokračovat, základní textový model gpt-3.5-turbo ale nahradíme modelem whisper-1, který OpenAI nedávno zpřístupnilo skrze své aplikační rozhraní pro vývojáře.

Podívejte se na ukázku přepisu úryvku načtené pohádky zpět na text pomoci OpenAI a Whisper API:

Převodníků zvuku na text je celá řada

Whisper umí převádět mluvené slovo na text a doplňuje tak portfolio velkých hráčů na trhu, kteří podobné technologie nabízejí už nějaký pátek. Google má svoji službu Cloud Speech-to-Text, Microsoft zase Azure Speech to text a v podání Amazon Transcribe to umí také AWS.

Vedle globálních jmen tu máme ještě nespočet menších a regionálních aplikací, které se mohou mnohem lépe orientovat na češtinu. Patří k nim třeba Beey od Newton Technologies, kterou používáme i u nás na Živě.cz. Pomáhá nám automaticky přepisovat a následně titulkovat naše videa.

Whisper je tedy pouze další v řadě, mnozí k němu ale upínají své naděje, že bude stejně dobrý jako další neuronky od OpenAI, které už loni zastínily všechny ostatní hráče na scéně včetně takových lídrů jakým je Google.

Minuta za 13 haléřů

Základy práce s platformou OpenAI pro vývojáře jsme nastínili už minule, a tak jen zrekapituluji, že k používání jeho aplikačního rozhraní potřebujete API klíč, který si vygenerujete po vytvoření účtu. Vytěžování neuronek sice není zdarma, všichni zájemci ale dostali do začátku pár dolarů na experimenty.

ddcdfd12-5067-47a2-9a7a-ebda5549009a
Všichni zájemci dostali do začátku pár dolarů na útratu s časovým omezením

Jakmile svůj kredit vyčerpáte, nebo skončí omezená časová lhůta, je třeba s účtem spárovat platební kartu, ze které se bude strhávat propálená práce. V případě modelu Whisper to dnes podle ceníku dělá 0,006 amerických dolarů za přepsanou minutu zvuku (13 haléřů).

Pro lepší představu: Cena za přepis dvacetiminutového pořadu Týden Živě se bude pohybovat okolo 0,12 dolarů (2,67 korun) a dvouhodinový film přepíšete za 0,72 dolarů (16 korun).

65a31311-8333-41ee-a225-f6feb5d18328
Na webu platform.openai.com máte detailní přehled o tom, jak využíváte jeho API. Tento požadavek na přepis 72 sekund zvuku mě přišel na 0,0072 dolarů (16 haléřů)

Ovšem pozor, převod delších nahrávek může zabrat nějaký čas a zvuková stopa, kterou pošlete ke zpracování na servery OpenAI, nesmí být větší než 25 MB. Delší soubory budete muset nejprve rozřezat na menší části a ládovat je Whisperu jednu za druhou.

57 jazyků včetně češtiny a slovenštiny

OpenAI trénovalo Whispera na 98 světových jazycích, k dnešnímu dni ale podporuje 57 z nich, u kterých míra chybovosti WER (Word Error Rate) nepřesáhla 50 %.

Na seznamu podporovaných řečí nechybí ani čeština a slovenština a podle staršího benchmarku (prosinec 2022) se oba jazyky z hlediska WER nacházejí v první polovině.

1b51898b-4dc9-424e-8f5a-06368224f54e
Chybovost WER modelu Whisper (prosinec 2022)

Podle stejného benchmarku Whisper nejméně chybuje při přepisu zvuku ve španělštině, italštině a samozřejmě angličtině. Slovenština a čeština na tom jsou zhruba 4× hůře, ovšem zase 3,5× lépe než nepálština na chvostu žebříčku.

Opět ale připomenu, že toto jsou prosincová čísla a Whisper je živá technologie, která se dále vyvíjí. Informace o chybovosti tedy berte s rezervou – za pár týdnů může být vše jinak.

Načtu prvních pár odstavců pohádky

Základní formality bychom měli a teď už hurá na to API. Jdeme si vyzkoušet základní schopnosti Whisperu na několika prvních odstavcích pohádky Jak králíček Petr přišel k novému kabátku z webu Pohádkozem.cz.

fdd5c5f8-1cb3-4c7a-a598-db773c22171f
Tento zkušební text z webu pohadkozem.cz načtu do MP3

První čtyři odstavce jsem načetl v mobilu a vy si můžete nahrávku spustit na Soundcloudu. Nejsem zrovna nezdatnější rétor a čtenář pohádek, jako testovací vzorek s minimem logopedických vad to ale snad bude stačit.

OpenAI podporuje MP3, WAV, M4A i WAV

Nahrávka má zhruba 75 sekund a ve formátu MP3 zabírá 1 MB, takže se bez problému vejdu do 25MB limitu. API si poradí hned s několika souborovými formáty zvuku. Vedle empétrojky to může být prostý WAV, ale také M4A, WEBM, MPEG/MPEGA a MP4.

Z toho mimochodem plyne i jedno technické omezení. Whisper neumožňuje streamování – kontinuální přepis proudu zvuku třeba z mikrofonu –, jak to dokáže třeba API od konkurenčního Googlu. Musíte poslat ucelenou nahrávku a čekat na výsledek. Whisper se tedy zatím příliš nehodí třeba pro stavbu hlasového asistenta.

Whisper můžete ovládat pomocí knihoven, ale...

S platformou OpenAI můžete pracovat skrze hromadu oficiálních a komunitních knihoven prakticky pro všechny hlavní programovací jazyky, takže v Pythonu by povel k přepisu zvuku na text mohl vypadat třeba takto:

import openai
soubor = open("pohádka.mp3", "rb")
prepis = openai.Audio.transcribe("whisper-1", soubor)

Já si ale opět vystačím s univerzální a surovou komunikací skrze protokol HTTP POST a s platformou se spojím z příkazové řádky pomocí oblíbeného textového klientu curl, který je dnes už v podstatě takovou nepsanou normou a v příkladech jej používá i OpenAI.

Nejjednodušší možný povel k přepisu souboru pohadka.mp3 na prostý text bude vypadat takto:

curl https://api.openai.com/v1/audio/transcriptions -H "Authorization: Bearer XXXXXXXX -H "Content-Type: multipart/form-data" -F model="whisper-1" -F file="@pohadka.mp3"

(XXXXXXXX představuje můj API klíč)

Během pěti sekund mám odpověď

Nahrávka je opravdu krátká a technologii zkouším v neděli odpoledne, takže server není přetížený a odpověděl během pouhých 5–6 sekund.

e00b4115-5f87-4c44-a0d6-06c8b06369d6
Za pár sekund mám přepis zhruba minutového záznamu

Odpověď je ve výchozím stavu stručná, jedná se totiž o strojově zpracovatelný text ve formátu JSON a s jedním jediným klíčem text.

Takhle to tedy dopadlo s pohádkou o králíčkovi Petrovi:

{
  "text": "Jak králiček Petr přišel k novému kabátku? Králiček Petr žil se svou maminku a sestričkami v noře, vyhloubené pod vysokou jedli. Každý den si malí králičci chodili hrát na louku a do lesa. Maminka ji vždy napomínala, že se musí vyhnout za hradě pana Gregora, hlavně Petr, který tam minule ztratil svůj modrý kabátek a obě botičky. Nyní musel nosit starý, nědý, obnošený kabát, který se mu vůbec nelíbil. Škrtil a kousal, ale co naplat, když ten svůj ztratil. Petře, poslouchej dobře, povídala mu maminka. Jdu na nákup, tak si jdi hrát pěkně na louku a za hradce pana Gregora se obloukem vyhíbej. Jinže Petr byl nejzlobivější králiček. Jenco maminka zmizela za zatáčkou na cestě do města, kterého obalovala rovnou snědem k zahrádce pana Gregora. Chci svůj modrý kabátek zpátky, brblala si pod fousky. Když tam budu, uzobnu si sladkou mrkvičku."
}

Whisper umí vytvořit titulky SRT

JSON je výchozí volbou, stejně tak ale umí Whisper generovat prostý text a také titulky ve formátu SRT a VTT. Slouží k tomu volitelný parametr response_format, který může mít tyto hodnoty:

  • json: stručná odpověď v JSON (výchozí)
  • text: odpověď v prostém textu
  • verbose_json: komplexní odpověď v JSON s hromadou detailů
  • srt: Odpověď ve titulkovém formátu SRT
  • vtt: Odpověď v titulkovém formátu VTT

Kdybychom tedy namísto pohádky chtěli získat titulky ve formátu SRT, přidáme v programu curl dodatečný parametr těla HTTP POST příkazem:

-F response_format="srt"

Platforma OpenAI během několika sekund opět odpoví strukturovaným textovým výstupem, který je tentokrát formátovaný jako titulky SRT s časovou stopou.

4a269ac9-dd67-472a-856e-28fc312884c9
Pohádka o králíčkovi Petrovi a tentokrát jako titulky ve formátu SRT

Tímto způsobem si můžeme automaticky otitulkovat třeba vlastní video, které chceme nahrát na YouTube, přičemž Whisper je umí dokonce i přeložit do angličtiny.

Stejně tak bychom mohli neuronku použít i pro strojové otitulkování nějakého videa staženého z webu. V případě těch delších ale zopakuji, že je třeba zvukovou stopu rozdělit nejvýše na 25MB díly a ty postupně přepisovat. 

Hrajeme si s HTTP v grafických programech

Mimochodem, dobrou práci při testování nejrůznějších API skrze HTTP odvedou grafické programy Httpiness, Insomnia a mnohé další. Umí dotazy ukládat pro pozdější použití a lépe analyzovat, co se vlastně děje.

1d8708f2-d9e3-473a-b579-c6ea7a2fe5c57aa663ae-216e-4285-b89e-13172e66369c
Testujeme Whispera v grafických HTTP klientech Httpiness a Insomnia

Pokud Whisper nerozpozná řeč, napovíme mu

Všimněte si, že jsem při přípravě dotazu stroji nikde neřekl, v jaké řeči má vlastně zvukovou stopu přepisovat. Platforma OpenAI z kontextu sama rozpoznala, že čtu pohádku v češtině, nahrávka totiž byla dostatečně dlouhá.

Kdyby měl ale stroj s detekcí problém, mohu mu pomoci dalším parametrem language, který bude obsahovat standardní kód jazyka dle normy ISO 639-1 (cs, sk, en, de apod.). Takže pro upřesnění, že je zvuková nahrávka třeba ve slovenštině, stačí k příkazu pro klient curl doplnit parametr:

-F language="sk"

Prompt, tedy zpřesnění v přirozené češtině

Aplikační rozhraní Whisperu nabízí několik dalších volitelných parametrů, přičemž zmínku si zaslouží ještě prompt. Slouží pro zpřesnění kontextu a opravám, protože do něj můžeme v přirozené řeči a stejném jazyku jako samotná nahrávka napsat, co je vlastně jejím obsahem.

Dejme tomu, že by se náš králíček z pohádky nejmenoval Petr, ale Ušákojd. Pro Whisper by takové slovo bylo asi oříšek, a tak mu v promptu napíšeme, o čem to celé je:

-F prompt="Toto je pohádka o králíčkovi, který se jmenuje Ušákojd. Ušákojd je nevychovaný a často krade mrkve v zahradě pana Gregora"

Pokud OpenAI pochopí, co mu naznačujeme, použije pro pojmenování králíčka jinak naprosto neznámé slovíčko Ušákojd. Podobně můžeme postupovat s dalšími atypickými termíny třeba při přepisu nějakého terminologicky složitého hlasu – třeba zrovna našeho Týdne a Podcastu Živě.

Ani Whisper není samozřejmě bezchybný

Přepis funguje, je docela rychlý, nicméně ani Whisper zatím není zázračná skříňka, která neudělá ani jednu chybu. Text po něm budete muset vždy přečíst a opravit, protože i když třeba korektně rozpozná jednotlivá slova, nebude občas znát českou shodu podmětu s přísudkem, korektní použití Y/I a zlobit bude místy ještě interpunkce.

2350610b-502a-469a-8cb4-7ad8651efc47
Vlevo originál, vpravo přepis včetně označených rozdílů. Není jich mnoho, ale pár jich tam je počínaje interpunkcí navíc a konče hrubkou „vyhíbej“ 

Ostatně podívejte se na srovnání původního textového originálu a přepisu podle Whisperu s označenými rozdíly. Výstup od OpenAI jsem pouze oddělil do stejných odstavců, aby to bylo přehlednější.

Má to sice chyby, ale je to použitelné a drobné neduhy rychle opravím. Pomocí výše vysvětlených promptů bych mohl Whispera dále nasměrovat, aby při přepisu používal nejrůznější pravidla aj.

OpenAI má tedy i díky jednoduchosti svého API našlápnuto slušným směrem a konkurence by opravdu měla zbystřit, aby ji neujel vlak.

Diskuze (12) Další článek: Návod, jak zrušit účet na TikToku a stáhnout si všechna data

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,