To not have anything in mind about a particular language is asking a bit much. If the names are to be spoken, and thus based on the sound of the language, you need to know something about that. Similarly, for written names, you'd need a minimal idea about the language's building blocks and their composition. This can't be avoided since it is at the heart of asking for consistency.
That said, many readers don't mind if you take short-cuts. They'd be satisfied with a small part of the language, just enough to make names and still sound like a credible part of a language. To invent names, you could create a set of similar names like this:
- Define minimal building blocks (and possibly combination rules)
- Create random valid combinations
- Filter the combinations for uniqueness, aesthetics, or other reasons for suitability
I'll call the building blocks elements, since it would be constraining to make assumptions about their complexity. They could be letters, sounds, syllables, or even whole words; either works but produces a different kind of similarity between the names.
That's already better than nothing. Personally, I'd season it with a little meaning, to create an illusion of depth:
- Sketch a cultural background
- Select some combinations and give them a concept or an association. When naming, use or exclude these situationally.
- Create semantics for the usage of any meaningful components you defined (e.g. placement rules for titles, honorifics, adjectives)
Let's do a little example. I call my culture the Ahl, since one-syllable names are cool and I'm too lazy to go down the alphabet.
Building blocks and their combination
To give the words structure, I invent two types of elements to build words from: $a$ and $b$. For this example, they're combinable by the formal grammar $S \rightarrow aS; S \rightarrow ab$. (So valid words would be structured $ab$, $aab$, $aaab$, and so on.) This is not a general solution, but a set of rules specific to the culture we're creating names for.
Since "Ahl" should be a valid name, let's say that "Ah" would be a possible $a$ and "L" a possible $b$. We need a few more, so here goes!
let aList = ["Ah"; "Riu"; "Ne"; "Iya"]
let bList = ["L"; "N"; "D"; "Sh"]
Feel free to ignore the syntax unless you want to computer-generate names in the next step. Of course, actual lists of elements should be larger. It might take a bit to come up with good elements -- these are just me typing in anything that first came to mind.
I am limiting myself to the Latin alphabet and common sounds here. That is, of course, not necessary. When using alien names, you often need annotations on how to read them anyway.
Combining
Now, just combine them and have a look! Easy to do by hand...
but this is Stackexchange, so let's add a program to output all allowed words of a given count of elements. But feel free to do it by hand instead. (The following is in F#. You can paste it, together with the element lists, on the website tryfsharp.org if it works on your browser, or any F# compiler or console.)
let aStep = List.collect (fun (s : string) -> [for a in aList -> a + s.ToLower()])
let rec allNames length =
if length > 1 then aStep <| allNames (length - 1) else bList
allNames 2 |> List.iter (printfn "%s")
outputs all two-element names (scroll up in the output if you test it on tryfsharp):
Ahl Riul Nel Iyal Ahn Riun Nen Iyan Ahd Riud Ned Iyad Ahsh Riush Nesh Iyash
For three elements, we get a longer list, with names like "Riunen", "Neriud", or "Iyanel". If the rules and elements are chosen carelessly, many combinations will be unusable, but that's not a problem as long as you can find enough usable ones.
The count of possible names increases rapidly when using larger element sets, shorter elements, or longer words. Choosing a large set of possibilities adds some realism, but might make the similarity of the names less apparent. You can use much more restrictive rules for making names than would be reasonable to make words of a language. (Seeing how similar names in some cultures are, this is quite realistic.)
Meaning
We need context before adding meaning, so I'll make up something. The Ahl are a mysterious society. Their cities are shrouded in thick fog; they have excellent hearing and can navigate by sound. In their view, strength is knowledge about one another: deception is defense and surveillance is offense, the cautious is wise and the noisy a fool and a nuisance.
Someone important in Ahl society would be a keeper of secrets or something along that line. So I just take one of the short combinations to create a title for that: Nesh. A Nesh is the one who decides what can and can't be told to outsiders.
Similar picks can be made for other important concepts: noisiness, listening, knowing, cartography -- things an Ahl might have a special word or phrase for.
Scaling the effort
This method can be used in a very simple way, say, by writing down a dozen syllables and combining them arbitrarily. Spending a little more time, one can think of a few rules on how to build words and how to use them. It should be easy to create names that are distinct from the names of other cultures in the same setting.
The difficulty lies in making the names credible as something alien, not something an author just came up with on a whim. There is, of course, much more to this; a major problem lies in sounds and phonetics. It is very unlikely that an alien language can be transcribed into an English text without an elaborate explanation how to read it. But that is a broad topic and this post is already too long. Also, I'd have to ask Nesh Ryunen if I may disclose any more.
Addendum: fast step 1-2 via sample text Markov chain
In this answer, evandentremont suggested a fast way for the first two steps if you have a sample for which you want to generate similar-sounding text. In a first step, calculate the probability for letters depending on the previous letter(s). Then, output random strings that follow the same distribution. (This is a Markov chain approach.)
Here is an F# program to do this with selectable amount of considered characters per character placed (order). An order of one produces results of limited quality, since the actual sounds comprising words are more than single letters. higher orders require longer samples to work well, but the output looks more sane.
This method has its downsides, as you aren't consciously creating the sounds and words. This makes it harder to interpret meaningful patterns into them and design distinct alien features. It is still fun to do and a very fast method. Here is what it does for an order of two:
Input: "lololololol zomg roflmao"
zomg zomg zomg roflmao lol lololololololol zomg lolol
Wow, it can speak online kiddie
Note that samples in real use cases should be much longer. Let's test it with an input that is a little closer to a realistic use case.
Input: 70 names of planets and moons in our solar system
Lysida Calia Cara Epinopa Amassa Aritanus Laranus Kalyke Chaliel Tethea Theus Porax Elasiphalia
These sound pretty real, don't they? This may be more of a language analysis tool than a language creation tool, but it sure is a quick way to enlarge a set of fantasy names.