CLI tool
pndurette/gTTS avatar
pndurette/gTTS

gTTS is MIT licensed and calls an undocumented speech endpoint, and its last release was in November 2024

Python library and CLI tool to interface with Google Translate's text-to-speech API

2,635 stars390 forksPythonMIT

At a glance

What is it?
pndurette/gTTS writes spoken audio from text in Python or from the command line, and its own disclaimer says it uses the undocumented speech functionality of a consumer translation service, that breaking upstream changes can arrive without notice, and that it is not the same thing as the paid cloud product. Its manifest declares a Python floor one version below its own classifier list, records a release tool limitation as a comment above the commented out lines that would fix it, and its newest tag predates the last commit by seventeen months.
Who is it for?
Read the service terms before you use this library, and that is the first thing to settle: the package is MIT licensed but the thing it calls is an undocumented endpoint of a consumer web service, so the licence tells you nothing about whether your use is acceptable and the upstream can change without notice.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Activity is slowing. The repository last received commits 6 months ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 5, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The disclaimer is the real documentation

Four sentences under a heading do more work here than the rest of the page. The project states that it is not affiliated with the search company or its cloud arm, that breaking upstream changes can occur without notice, that it leverages the undocumented speech functionality of the consumer translation service, and that it is different from the paid cloud speech product. Read together, those four sentences are the design constraint. There is no supported interface here, no version negotiation and no compatibility promise, so the library is at the mercy of an endpoint that exists because a web page needs it. What the library does own, and does well, is the text side: a speech specific sentence tokenizer that can read unlimited lengths while keeping intonation, abbreviations and decimals intact, plus pluggable pre-processors for pronunciation corrections.

The declared floor and the classifier list disagree by one version

The packaging metadata declares support for Python 3.7 and newer, then lists classifiers for 3.8, 3.9, 3.10, 3.11 and 3.12. So the floor the installer enforces is one version below the oldest version anyone apparently tested, and the newest tested version is several releases behind the newest interpreter that exists. Neither number is dangerous on its own: a permissive floor helps distribution, and a classifier list is a claim about testing rather than about refusal. But they are the two fields a user reads to decide whether a package works on their machine, and here they answer slightly different questions. The environments list is also where you would expect a Windows and a macOS entry, and those are present, which is unusual for a library whose only real dependency is an HTTP client.

A release tool limitation is recorded as a comment in the manifest

The packaging file contains a four line note explaining that the release automation cannot yet write a dynamic version into this kind of project file, followed by a link to the exact upstream issue and then the three configuration lines that would fix it, all commented out. So the version is a literal in the manifest, and it has to be written by a tool that was working around a limitation its authors documented in the file itself. That is unusually transparent for a build file, and it also explains something a reader would otherwise find puzzling: why a project with an automated release process still carries its version by hand. Two more files at the root, a release manifest and a release configuration, are the automation doing the rest of the work.

Two dependencies, two upper bounds and two links to changelogs

The install list has exactly two entries and both are annotated. One is an HTTP client with a floor and a ceiling, and the comment after it is a link to that project's community changelog. The other is a command line library with a floor and a ceiling, and its comment is a link to that library's changes page. It is a small habit with a real payoff: when a ceiling stops your install from resolving, the comment tells you where to read what broke rather than sending you to guess. The optional groups follow the same pattern, with a test group and a documentation group, the latter pulling a documentation generator, an automatic rebuild helper, the hosted documentation theme, a plugin that documents the command line interface from its own help output, and one that includes files from the repository inside the docs.

The release line stopped in November 2024

Three releases appear in the list: two patch releases in mid 2024 and one in November 2024. The last commit to the repository is dated April 2026, seventeen months after that newest tag. So the gap is not an abandoned project, since work is landing, but a project whose published versions have stopped while its repository has not. For a library whose stated risk is upstream breakage, that ordering is worth thinking about: the interesting fixes for a broken endpoint are exactly the kind of change that needs releasing, and they are the changes a user cannot see until a tag appears. Pinning the version you tested against is therefore not advice you can skip, because there is no newer version to drift to and no release notes telling you what changed underneath.

The badge row counts downloads and repeats the package index

The badges do three jobs. Two of them are the same package index link, repeated, which is an artefact of a template rather than a mistake anyone will lose sleep over. One is a coverage badge, which is the only signal on the page about test quality. One points at the repository's own commit list rather than at a specific branch, so it survives a default branch rename that a branch-pinned badge would not. One is a third party service that counts downloads per release, which for a library this widely installed is the most interesting number on the page and the one with the least context attached to it. The last is a donation link. What is missing is any badge showing the version, which for a project whose whole risk model is upstream change is the badge that would help most.

The documentation is built from the repository and the command line help

The documentation lives in a directory in this repository, is built by a hosted documentation service, and has its own configuration file at the root. Its dependency group tells you how it is assembled: a documentation generator, the hosted theme, and two plugins that do the work a small project would otherwise maintain by hand. One of them includes files from the repository directly in the pages, so a snippet in the docs cannot drift from the file it came from. The other documents the command line tool from its own help output, which means the options list in the documentation is generated rather than written, and therefore cannot fall behind the parser. For a library whose interface is one function and one command, that is the right amount of machinery: nothing here is a website, and everything in it is maintained by the same release process as the code.

Editorial conclusion

Read the service terms before you use this library, and that is the first thing to settle: the package is MIT licensed but the thing it calls is an undocumented endpoint of a consumer web service, so the licence tells you nothing about whether your use is acceptable and the upstream can change without notice. Within that frame, gTTS is a good fit for scripts, prototypes and accessibility tooling where an occasional breakage is an annoyance rather than an outage, and a poor fit for anything with a service level agreement. Two practical checks. Pin the version, because the release line has not moved since late 2024 while the repository has. And treat the sentence tokenizer and pre-processor hooks as the real product, since the transport underneath is the fragile part and the parts you can control are the parts you can tune.

Frequently asked questions

How to use gTTS?

Install the package, then either run the command line tool with your text and an output path, or construct the object in a script and save it. The library can write the audio to a file, to a file-like object for further processing, or to standard output.

What does gTTS use Google's service for?

The project's own disclaimer says it leverages the undocumented speech functionality of the consumer translation service, that breaking upstream changes can occur without notice, and that it is different from the paid cloud speech product. It is not affiliated with either.

Is gTTS free to use?

The library is MIT licensed. What it calls is not covered by that licence, because it reaches an undocumented endpoint of a consumer web service, so the terms of that service rather than the package licence decide whether a given use is acceptable.

Which Python versions does gTTS support?

The manifest declares 3.7 and newer while its classifiers run from 3.8 to 3.12, so the declared floor and the tested list disagree by one version at the bottom and by several at the top.

Why is gTTS's version written into its manifest by hand?

Because the release automation cannot write a dynamic version into that kind of project file. The packaging file records the limitation as a comment, links the upstream issue, and leaves the three configuration lines that would fix it commented out.

What does gTTS depend on?

Two libraries: an HTTP client with an upper bound and a command line library with an upper bound, each annotated with a link to that project's own changelog so a version bump can be traced.

Official sources

  1. License: MIT
  2. pndurette/gTTS on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/pndurette-gtts.svg)](https://hysenlabs.com/projects/pndurette-gtts)