You could use perl:
For example, using the following hard-wrapped example input file:
$ cat input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
$ perl -0777 -p -e 's/(?<!\n)\n/ /g' input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Or if you still want a blank line between each paragraph:
$ perl -0777 -p -e 's/(?<!\n)\n/ /g; s/\n/\n\n/g' input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Note: unless the input ends in one or more blank lines, the output won't have a newline on the last line. If you need that, add ; END {print "\n"} to the end of the script. This will guarantee that the output will end with a newline.
The -0777 option tells perl to "slurp" in its input file all at once, and process it as one long string.
Both versions of the one-liner above use a feature of perl regular expressions called a "zero-width negative lookbehind assertion" - (?<!pattern). See man perlre and search for "Lookaround Assertions" for details. In short, (?<!\n)\n matches a newline unless the character before it is another newline - and it does this without actually matching or capturing the preceding character (that's what the "zero-width assertion" means).
Without using negative look behind assertion, you might be tempted to do something like s/[^\n]\n/ /g - but that would end up deleting every character immediately before each newline....which is why the zero-width part of the regex is important, it prevents that. Another alternative is to use something like s/([^\n])\n/\1 /g which captures the character before the newline and uses it in the replacement - e.g. with GNU sed: sed -E -z 's/([^\n])\n/\1 /g' input.txt but IMO it's better to not match the preceding character at all than to match & delete it and then put it back.
Some other regex engines also support look-around assertions, but they're non-standard so not guaranteed to be supported.