I think it is worthwhile to point out that you do not need to pass to a subsequence of $(x_n)$. To see that, let $(y_n^*)$ be any Hahn-Banach extensions to $X^*$ of the functionals biorthogonal to $(x_n)$ and observe that all weak$^*$ cluster points of $(y_n^*)$ in $X^*$ are in $(x_n)^\perp$. By the separability of $X$ there is a metric $d$ on $X^*$ that, on bounded subsets of $X^*$, generates the weak$^*$ topology. Let $K= \sup_n \|y_n^*\|$. Then the $d$-distance of $y_n^*$ to the $K$-ball of $X^*$ tends to zero, so you get $u_n^*$ in the $K$-ball of $(x_n)^\perp$ s.t. $d(y_n^*,u_n^*)\to 0$ as $n\to \infty$. Set $x_n^*:= y_n^* -u_n^*$.
I don’t know who first did this (maybe Singer), but this is basically Bill Veech’s argument for Sobczyk’s theorem that $c_0$ is separably injective.