1. Omówienie
Z tego ćwiczenia w Codelabs dowiesz się, jak wysłać plik audio przy użyciu interfejsu Google Cloud Speech to Text API, a następnie zwrócić transkrypcję do dokumentu Google. Interfejs Speech to Text API jest łatwy w użyciu i korzysta z potężnych sieci neuronowych, aby umożliwić programistom zamianę dźwięku w tekst. Dodatkowo wykorzystuje systemy uczące się.
Do tworzenia nowego dokumentu i zapisywania w nim danych będziesz używać interfejsu API Dokumentów Google. Utworzysz aplikację wiersza poleceń w Javie i uruchomisz kod za pomocą systemu kompilacji Gradle, a następnie wyświetlisz wyniki za pomocą interfejsu API Dokumentów.
Czego się nauczysz
- Jak korzystać z interfejsu Google Cloud Speech to Text API
- Jak utworzyć nowy dokument przy użyciu interfejsu API Dokumentów Google
- Jak używać interfejsu API Dokumentów do zapisywania w dokumencie
Czego potrzebujesz
- zainstalowana aplikacja Java (w wersji 7 lub nowszej),
- Zainstalowano Gradle (wersja 5 lub nowsza)
- Dostęp do internetu i przeglądarki
- konto Google,
- Projekt Google Cloud Platform
2. Konfigurowanie projektu
Tworzenie projektu w chmurze
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub Workspace, musisz je utworzyć.
Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w Codelabs będzie ona określana jako PROJECT_ID
.
- Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Google Cloud.
Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.
Uzyskiwanie klucza konta usługi dla interfejsu Cloud Speech-to-Text API
- Otwórz konsolę GCP i znajdź nowy projekt.
- Tworzenie konta usługi
- Pobierz klucz konta usługi w formacie JSON
- Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS na ścieżkę pliku JSON zawierającego klucz konta usługi. Jeśli ponownie uruchomisz sesję powłoki, konieczne będzie ponowne ustawienie tej zmiennej.
$ export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
Na przykład:
$ export GOOGLE_APPLICATION_CREDENTIALS="/home/usr/downloads/ServiceAccount.json"
Pobieranie danych logowania do interfejsu API Dokumentów
- Wróć do konsoli GCP i otwórz Dane logowania.
- Utwórz klucz OAuth 2.0 i pobierz go w formacie JSON
- Zmień nazwę pliku
credentials.json
i upewnij się, że znajduje się on w katalogusrc/main/resources/
Twojego kodu
Włącz interfejsy API
- Wybierz kartę Panel, kliknij przycisk Włącz interfejsy API i usługi, a następnie włącz te dwa interfejsy API:
- Zamiana mowy na tekst
- Dokumenty Google
Możesz teraz zająć się kodem.
3. Skonfiguruj kod
Pobieranie przykładowego kodu
Aby pobrać przykładowy kod, pobierz plik ZIP na komputer...
...lub skopiuj repozytorium GitHub z poziomu wiersza poleceń.
$ git clone git@github.com:googleworkspace/docs-transcript-codelab.git
Będziesz pracować z plikiem CreateTranscript.java
znajdującym się w katalogu start. Plików Gradle nie należy modyfikować.
Przejdź do folderu start w katalogu i otwórz plik Createscribe.java. Przewiń w dół do miejsca, w którym zobaczysz deklarację klasy CreateTranscript
.
public class CreateTranscript {
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
// Specify audio file name below.
private static final String AUDIO_FILENAME = "audioFile.wav";
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String APPLICATION_NAME = "CreateTranscript";
private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS);
Zmienna SCOPES
umożliwia kodowanie wyświetlania dokumentów Google użytkownika i zarządzania nimi. Jeśli Twój kod wymaga autoryzacji w inny sposób niż ten dostęp lub w inny sposób, odpowiednio dostosuj tę zmienną na podstawie zakresów interfejsów API Google OAuth 2.0.
Jeśli na przykład nie tworzysz pliku w Dokumentach Google, możesz zmienić zakres na DOCUMENTS_READONLY
. Zmienna SCOPES
jest nie tylko wymagana, by aplikacja miała odpowiednie uprawnienia dostępu, ale też zapewniała przejrzystość dla użytkowników. Użytkownik widzi konkretne zakresy, o które prosisz, na stronie weryfikacji OAuth, gdzie musi on wyrazić zgodę na używanie aplikacji.
Zmień nazwy zmiennych
Sprawdź, czy powyższe zmienne są poprawnie zadeklarowane w projekcie.
- Sprawdź, czy AUDIO_FILENAME zawiera nazwę pliku demonstracyjnego, który wysyłasz do interfejsu Speech to Text API. W pliku CreateTranscript.java powinna być widoczna prawidłowa konfiguracja.
- Zmień nazwę ścieżki CREDENTIALS_FILE_PATH na nazwę pobranego pliku danych logowania (powinien to być „/
credentials.json'
). Sprawdź, czy ten plik znajduje się w katalogusrc/main/resources
Twojego folderu. Jeśli sklonowanie z GitHuba nie pomoże, utwórz ten katalog.
Teraz możesz zacząć uruchamiać kod.
4. Inicjowanie klienta Dokumentów
W pliku CreateTranscript.java znajdź główną deklarację metody i sprawdź, co jest w środku:
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY,
getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
Autoryzacja funkcji
Pierwsze zadanie, które tu wykonujesz, to utworzenie zmiennej Docs service
. Usługa reprezentuje autoryzowanego klienta interfejsu API. Zawiera Twoje dane logowania, a w tym przypadku – uwierzytelnianie użytkownika.
Każda funkcja w Twoim kodzie, która wywołuje interfejs Dokumentów API, musi używać tej zmiennej service
do wykonywania zadań związanych z Dokumentami.
5. Tworzenie dokumentu Google
Utworzysz nowy dokument Google o określonym tytule. Skopiujmy więc poniższy kod do funkcji createDocument
.
Document doc = new Document().setTitle("Transcript for " +
AUDIO_FILENAME);
doc = service.documents().create(doc).execute();
String documentId = doc.getDocumentId();
return documentId;
Ta funkcja zwraca identyfikator pliku na Dysku dla dokumentu Google. Ten sam identyfikator można znaleźć w adresie URL dokumentu.
Następnie zainicjuj klienta Speech-to-Text.
6. Wywoływanie interfejsu Speech to Text API
Następnym zadaniem, które chcesz wykonać w kodzie, jest uzyskanie transkrypcji pliku audio. W pliku CreateTranscript.java znajdź funkcję getTranscript()
.
Najpierw uzyskaj ścieżkę pliku audio i bajty audio:
SpeechClient speech = SpeechClient.create();
Path path = Paths.get(AUDIO_FILENAME);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);
Skonfiguruj rozpoznawanie mowy
Następnie musisz poprawnie zainicjować zmienną RecognitionConfig
.
Tutaj config
podaje informacje o tym, jak dokładnie moduł rozpoznawania mowy ma przetwarzać Twoje żądanie. Jeśli na przykład plik audio jest w języku innym niż angielski, musisz zmienić parametr setLanguageCode()
, a także zmienić setSampleRateHertz()
, jeśli plik audio ma inną częstotliwość próbkowania w Hz (optymalne ustawienie 1600).
RecognitionConfig config =
RecognitionConfig.newBuilder()
.setEncoding(AudioEncoding.LINEAR16)
.setLanguageCode("en-US")
.setSampleRateHertz(8000)
.build();
RecognitionAudio audio =
RecognitionAudio.newBuilder().setContent(audioBytes).build();
RecognizeResponse response = speech.recognize(config, audio);
List<SpeechRecognitionResult> results = response.getResultsList();
Przygotowywanie tekstu
Na koniec przetwórz zmienną result
transkrypcji pliku audio i przygotuj ją do wstawienia w dokumencie.
Każdy element w wynikach jest transkrypcją typu SpeechRecognitionAlternatives
. W związku z tym każdy element składa się z 2 części: transkrypcji tekstu oraz odpowiedniego wskaźnika ufności interfejsu API.
List<Request> requests = new ArrayList<>();
for (SpeechRecognitionResult result : results) {
// Using the first + most likely alternative transcript
SpeechRecognitionAlternative alternative =
result.getAlternativesList().get(0);
String toInsert = alternative.getTranscript();
// Add requests array list to return.
requests.add(
new Request()
.setInsertText(
new InsertTextRequest()
.setText(toInsert)
.setEndOfSegmentLocation(new
EndOfSegmentLocation().setSegmentId(""))));
}
return requests;
7. Wstawianie tekstu do dokumentu
Tekst transkrypcji zostanie wstawiony do dokumentu Google. Aby zmodyfikować dokument, musisz użyć metody BatchUpdate
. BatchUpdate
to kontener dla różnych typów żądań zapisu. W tym miejscu użyjesz InsertTextRequest
.
EndOfSegmentLocation
to ważny parametr określający miejsce w dokumencie, w którym chcesz wydrukować tekst. W kodzie źródłowym wstawisz tekst w treści dokumentu.
Wstawmy w Twojej funkcji poniższy kod, aby sprawdzić, jak wyniki interfejsu Speech-to-Text API w połączeniu z wywołaniami interfejsu API Dokumentów Google pozwolą nam wstawić transkrypcję pliku audio do dokumentu Google:
BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest();
service.documents().batchUpdate(docId,
body.setRequests(insertRequests)).execute();
Tworzę żądanie
Podczas tworzenia żądania BatchUpdate ustawiane są 2 bardzo ważne specyfikacje: co ma zostać wydrukowane (.setText()
) oraz w którym miejscu dokumentu ma być to wydrukowane (.setIndex(1)
).
Transkrypcja pliku audio została wstawiona do utworzonego dokumentu.
8. Uruchamianie kodu
Skoro masz już cały kod niezbędny do przerobienia pliku audio, pobrania transkrypcji i wydrukowania transkrypcji w nowo utworzonym dokumencie Google, możemy zacząć prowadzić ten program.
Twój kod Java zostanie uruchomiony przy użyciu systemu kompilacji Gradle, dlatego musisz w pliku build.gradle skompilować i uruchomić go dokładnie. W tym i innych projektach upewnij się, że mainClassName
jest zgodny z klasą Javy, którą chcesz uruchomić.
Świetnie. Teraz możesz uruchomić swój kod. Aby to zrobić, wpisz w wierszu poleceń:
$ gradle run
Uwierzytelnianie użytkownika
Po pierwszym uruchomieniu tego kodu w terminalu zostanie wyświetlony URL z prośbą o zalogowanie się na konto usługi i autoryzowanie dostępu do powiązanych z nim Dokumentów Google. Gdy zezwolisz na dostęp, w Twoim katalogu będzie zapisany nowy plik.
W katalogu roboczym zobaczysz nowo utworzony folder o nazwie tokens z plikiem StoredCredential. To właśnie udostępniony przez Ciebie token uwierzytelniania, który klient zażądał z serwera uwierzytelniania Google, wyodrębniony z odpowiedzi i zostanie wysłany do dowolnego wywoływanego przez Ciebie interfejsu API.
Rozwiązanie
Jeśli kod nie działa, zajrzyj do pliku CreateTranscript.java w folderze CreateTranscript.java. Ten plik zawiera cały kod dokładnie w takiej postaci, w jakiej musi być on poprawnie uruchomiony, aby mógł działać.
Przyjrzyjmy się teraz wynikowi.
9. Wyświetlanie wyników
Właśnie udało Ci się utworzyć nowy dokument Google zawierający transkrypcję pliku audio, więc przyjrzyjmy się mu.
Ten dokument został utworzony przy użyciu konta, na którym użytkownik udzielił autoryzacji. Jednym z możliwych rozwiązań jest automatyczne udostępnianie tego dokumentu innym osobom za pomocą interfejsu Drive API.
Oto co zobaczysz w przypadku kodu źródłowego i dostarczonego pliku audio:
10. Gratulacje!
Wiesz już, jak utworzyć dokument Google, wywołać interfejs Speech-to-Text API i przesłać transkrypcję pliku audio do utworzonego dokumentu.
Możliwe ulepszenia
Oto kilka pomysłów na stworzenie bardziej atrakcyjnej integracji:
- Skonfiguruj kod, który nasłuchuje, gdy plik audio zostanie dodany do Dysku, i aktywuje funkcję w Google Cloud Functions, aby wykonać ten kod
- Eksperymentuj ze wstawianiem niepustego tekstu do dokumentu Google
Więcej informacji
- Zapoznaj się z dokumentacją dla programistów interfejsu Google Document API.
- Publikuj pytania i znajduj odpowiedzi w Stack Overflow pod tagiem google-docs-api